Conteneurisez un Notebook Jupyter avec Docker et VSCode

Découvrez la recette pour une utilisation de Jupyter sans accroc

Thomas Dimnet
NX Academy

--

Un cahier avec une planète dessinée (pixel art)
Source : auteur

J’ai suivi il y a quelques semaines un excellent tutoriel sur freeCodeCamp concernant les réseaux de neurones convolutifs, ou Convolutional Neural Network en anglais. On abrège souvent ce terme par CNN. Pour faire simple, un CNN est une structure de réseau neuronal conçue pour analyser des images, détecter des caractéristiques et les reconnaître. C’est une branche de l’intelligence artificielle.

Dans le cadre de ce tutoriel, l’instructrice montrait comment reconnaître qu’une image était un hot dog ou autre chose. Un plat de spaghettis ou une tartiflette par exemple. Je vous invite vraiment à suivre le tuto. Il est super intéressant et très bien expliqué.

Seulement, en suivant le tuto, je me suis aperçu que quelque chose d’assez important manquait. L’instructrice utilisait VSCode, Python et les notebooks Jupyter. Cela dit, à aucun moment, elle ne montrait comment mettre en place un environnement de travail stable et partageable.

Vous n’êtes peut-être pas sans savoir que je suis un énorme fan de Docker et des solutions de conteneurisation. J’avais d’ailleurs déjà écrit un tutoriel à ce sujet il y a maintenant quelques années. Dans cet article, je vais vous montrer comment conteneuriser un notebook Jupyter avec VSCode et Docker. Cela vous donnera la possibilité de partager et de travailler sur les notebooks avec VSCode plus facilement quel que soit votre environnement de travail.

On va commencer par s’intéresser aux outils qu’on va utiliser ainsi qu’à l’environnement de développement.

Les outils essentiels pour un développement fluide

Un mécanicien avec une boite à outils (pixel art)
source : auteur

Le premier outil qui va nous intéresser est Jupyter. Pour votre information, Jupyter est un projet open-source utilisé pour créer et partager des documents contenant notamment du code et des visualisations. Il est possible d’utiliser les notebooks avec plusieurs langages. Pour ma part, je les ai toujours utilisés avec du Python.

L’un des aspects que j’aime le plus avec cet outil est la possibilité d’exécuter un ou plusieurs blocs de code de votre choix et d’avoir une visualisation de cette exécution. Dans un sens, l’utilisation d’un notebook se rapproche de celle du debugger. Il vous permet de connaître l’état de votre code à un instant “t”.

Les data scientists avec lesquels j’ai travaillés utilisent le plus souvent JupyterLab, un environnement de développement interactif. Ce dernier permet d’exécuter des Notebooks Jupyter via un navigateur. C’est une manière de travailler qui peut avoir des avantages.

Cela dit, j’ai tendance à penser qu’elle est un peu contre intuitive pour nous, les développeurs. La bonne nouvelle, c’est qu’il existe une extension VSCode dédiée à Jupyter. La mauvaise concerne Python et sa gestion des dépendances.

Notre Notebook Jupyter sur VSCode (Capture d’écran)
Notre Notebook Jupyter sur VSCode (source : auteur)

Si vous avez déjà travaillé avec Python, vous n’êtes pas sans savoir qu’il a un système de gestion de librairies un peu gênant. En effet, quand vous installez une librairie via la commande pip install, cette librairie ne sera pas installée localement dans votre projet. Elle sera installée globalement sur votre ordinateur. Si vous venez du Node.js, c’est l’équivalent de la commande npm i -g où l’option g signifie globale.

C’est en général quelque chose qu’on va absolument éviter. Pour parler familièrement, utiliser cette technique peut foutre le bordel sur votre ordinateur. En Node.js, la solution est simple. On installe nos librairies sans l’option -g . Les librairies sont donc installées localement et sont stockées dans le fameux répertoire node_modules . Mais, comme je viens de vous le dire, Python fonctionne différemment.

Quand on commence à coder avec Python, on apprend très vite le terme d’environnement virtuel. Un environnement virtuel est un espace isolé qui permet d’installer et de gérer les librairies d’un projet. Cette technique assure une séparation et une gestion propre des modules et des versions pour chaque projet. Au fil des années, j’ai testé différentes technologies d’environnement virtuel tel que venv, conda et pyenv . Cela dit, même si ces technologies proposent des solutions intéressantes, je pense que rien ne remplace un conteneur Docker.

Un conteneur Docker, c’est souvent la garantie que votre code va pouvoir être utilisé et exécuté par tous. L’installation va être simplifiée (comprendre : vous allez pouvoir installer votre projet en quelques commandes) tout en ayant un environnement isolé. Néanmoins, il y a pendant longtemps eu une limitation. En utilisant cette technique, il était parfois difficile de garder l’IntelliSense de VSCode. Au revoir l’autocomplétion de votre code et les informations sur les types et les fonctions. Sauf que ça, c’est avant. Depuis quelques années, nous avons une excellente extension pour VSCode : l’extension DevContainer.

Cette extension va vous permettre d’utiliser un conteneur Docker comme environnement de développement tout en gardant les avantages, dont l’IntelliSense, de VSCode. Vous allez donc coder directement dans votre conteneur Docker. C’est un peu le meilleur des mondes. Si vous souhaitez en apprendre plus sur cette extension, je vous invite à regarder ce précédent blog post. Il date de mai 2021 (déjà !) mais il reste encore totalement à jour.

Maintenant que vous en savez plus sur les outils, leurs utilité et comment ils communiquent entre eux, il est temps de mettre les mains dans le cambouis.

Parcours Guidé : Construisez Votre Environnement Conteneurisé

Quelqu’un lisant une carte dans les montages (pixel art)
Source : auteur

Je vais d’abord vous demander de récupérer le projet sur ce repository GitHub. Vous pouvez suivre les étapes de clonage du projet soit en clonant via SSH, soit HTTPS. Notez que vous aurez besoin que Docker et de VSCode soient installés sur votre ordinateur.

Une fois que c’est fait, vous pouvez ouvrir le projet avec VSCode. Vous allez devoir installer la fameuse extension DevContainer. Voici sa page sur le marketplace de VSCode. L’installation de l’extension ne devrait normalement vous poser aucune difficulté.

Une fois terminée, vous pouvez lancer votre dev container. Ouvrez la palette de commandes via le raccourcie cmd + shift + p sur Mac ou ctrl + shift + p sous Windows. Sélectionnez la commande Dev Containers: Rebuild and Reopen in Container.

La palette de commandes de VSCode (Pixel art)
La palette de commandes de VSCode (source : auteur)

Cette commande va vous permettre de lancer le build (la construction) de l’image puis va la lancer dans un conteneur. Ce build se fera par rapport au Dockerfile présent dans le projet.

Sachez que le build de l’image va prendre un peu de temps. En effet, le Dockerfile comprend trois grandes étapes dans l’installation du projet.

  • FROM python:3.11 — on récupère ici une image un peu grosse de Python. J’aurais tout à fait pu utiliser une image plus légère comme une alpine ou une buster-slim. J’ai fait le choix de la simplicité et j’ai décidé d’utiliser l’image par défaut.
  • RUN pip install -R requirements.txt— on installe les dépendances. La plus importante (et la plus lourde aussi) est TensorFlow. Je vais revenir dessus juste après.
  • RUN python app.py — Cette commande me permet de charger un set (ou ensemble) de données d’exemple de TensorFlow. J’aurais pu vous demander de le faire manuellement (en cliquant sur une des lignes du notebook Jupyter). Cela dit, cette méthode a l’avantage d’installer pour vous cet ensemble de données.

Vous pouvez aller vous prendre un café ou un thé. L’installation va prendre un peu de temps.

Revenons rapidement sur Tensorflow. C’est une librairie open-source de machine learning développée par Google. On s’en sert pour construire, entraîner et déployer des modèles d’apprentissage. Elle est particulièrement utilisée pour des modèles d’apprentissage profond (le deep learning). Pour votre information, le deep learning est une sous-branche du machine learning. On l’utilise pour analyser différents types de données et permettre aux ordinateurs d’apprendre. C’est un domaine relativement passionnant (comme souvent avec l’informatique). J’ai prévu d’autres articles à ce sujet 🙂.

L’un des éléments assez agréable avec Tensorflow est qu’il comprend des ensembles de données (des Datasets) prêts à l’emploi. Autrement dit, on peut accéder à de nombreux jeux de données prêt à l’emploi sans avoir à gérer la partie ETL (extraction, transformation et chargement des données).

L’image Docker en train d’être buildée (Capture d’écran)
L’image Docker en train d’être buildée (source : auteur)

L’une des fonctionnalités qui me plait le plus avec les Dev Container est la possibilité d’installer des extensions VSCode de manière automatique. Ainsi, quand vous lancez votre projet dans un DevContainer pour la première fois, via la commande Dev Containers: Rebuild and Reopen in Container, vous allez installer deux extensions VSCode.

  • ms-python.python — cette extension s’occupe de toute la partie Python et notamment l’IntelliSense. Notez que c’est une extension développée et maintenue par Microsoft.
  • ms-toolsai.jupyter — cette extension gère le support des Notebook Jupyter. C’est ce qui vous permet d’avoir le comportement des Notebook (le “touch and feel”) directement depuis VSCode. Cette extension est aussi développée et maintenue par Microsoft.

Il ne vous reste plus qu’à exécuter le code de votre Notebook. Ouvrez le fichier food.ipynb et exécutez le code contenu au début du document.

Votre Notebook Jupyter dockerisé et prêt à l’emploi (Capture d’écran)
Votre Notebook Jupyter dockerisé et prêt à l’emploi (source : auteur)

Une fenêtre devrait alors s’ouvrir. Elle vous informe qu’elle doit installer une dernière librairie. Il est peut-être possible d’automatiser cette partie via le fichier requirements.txt. Pour être tout à fait honnête, je n’ai pas essayé. N’hésitez pas à essayer et à me dire si ça fonctionne pour vous 🙂.

L’installation de la librairie complémentaire (Capture d’écran)
L’installation de la librairie complémentaire (source : auteur)

Cliquez sur Install. Une fois l’installation réalisée, votre Notebook Jupyter va lancer l’exécution du code. Un icône de validation vert, ainsi que le temps d’exécution, vous informe que le code a bien été exécuté.

L’icone de validation de l’execution (Capture d’écran)
L’icone de validation de l’execution (source : auteur)

Lancez enfin le code lié au dataset d’exemples.

Vous devriez voir des exemples de recettes à l’écran.

Notre dataset affiché grâce au Notebook Jupyter (Capture d’écran)
Notre dataset affiché grâce au Notebook Jupyter (source : auteur)

Il ne vous reste plus qu’à jouer avec ce set de données. Encore une fois, je vous recommande de suivre le tutoriel de freeCodeCamp pour en apprendre un peu plus sur le sujet. Je suis convaincu que si vous voulez bien comprendre des outils tels que ChatGPT ou Midjourney, vous devez avoir des connaissances en IA et en Machine Learning.

Quelqu’un buvant un café (pixel art)
source : auteur

Vous arrivez au terme de cet article. Ce dernier vous aura permis d’en apprendre un peu plus sur le Machine Learning et des outils mais aussi sur la pertinence de Docker. En conteneurisant cet environnement et en utilisant les bonnes librairies, vous assurez que votre environnement de développement est stable et utile pour tout le monde.

Si vous cherchez à approfondir vos compétences en développement et à vous immerger dans des sujets plus avancés, je vous invite chaleureusement à découvrir NX Academy. Vous y trouverez non seulement mon cours sur Docker et docker compose mais aussi d’autres cours conçus spécifiquement pour les développeurs.

Mon prochain article sera plus orienté psychologie. Il s’intéressera au fait que les startups ont tendance à attirer des personnalités narcissiques.

--

--