AI Training - Tutoriel - Construire & utiliser une image Docker personnalisée
Comment construire et utiliser votre propre image Docker
Objectif
Ce tutoriel couvre le processus de construction de votre propre image de job pour des besoins spécifiques.
Prérequis
- Un projet Public Cloud
- Un utilisateur pour AI Training
- Docker installé sur votre ordinateur local ou une machine virtuelle
- Des connaissances sur la construction d'une image et un Dockerfile
Aperçu rapide
AI Training vous permet d'entraîner vos modèles facilement, en quelques clics ou quelques commandes. Cette solution exécute votre job d'entraînement sur des ressources de calcul telles que des CPUs ou des GPUs. Dès que votre job d'entraînement est terminé, la facturation s'arrête immédiatement. Vous gagnez ainsi du temps et augmentez la productivité de votre équipe, tout en respectant l'intégrité de vos données sensibles (RGPD).
Pour pouvoir être lancé, votre job AI Training doit être conteneurisé dans une image Docker. Les containers offrent isolation et flexibilité. Les images Docker que vous construisez peuvent être utilisées localement, avec OVHcloud AI Training, mais aussi avec d'autres fournisseurs cloud.
Dans votre image Docker, vous êtes libre d'installer presque tout ce que vous voulez, à condition de suivre les recommandations ci-dessous.
AI Training accepte les images provenant de dépôts publics ou privés. Retrouvez plus d'informations sur l'utilisation des registres publics et privés dans cette documentation.
Recommandations à suivre
Créer un Dockerfile
Un Dockerfile est un script qui contient les instructions pour construire notre image Docker. Il spécifie l'image de base à utiliser, les paquets ou bibliothèques supplémentaires à installer, ainsi que les paramètres de configuration ou commandes à exécuter au démarrage de l'image du container.
Avant de continuer, assurez-vous d'être dans le répertoire racine de votre projet, contenant les fichiers du job (fichiers Python, requirements.txt, ...).
Une fois que vous y êtes, créez un nouveau fichier et nommez-le Dockerfile à l'aide d'un éditeur de texte (vi, vim, nano, ...).
Voici un exemple. Nous utilisons d'abord cd pour nous déplacer dans le répertoire de notre projet, où se trouvent tous nos fichiers. Ensuite, nous créons et éditons le Dockerfile :
Choisir une image de base
Plutôt que de partir de zéro, n'hésitez pas à partir d'une image Docker existante, à condition qu'elle respecte les recommandations suivantes.
L'en-tête de notre Dockerfile ressemblera à ceci :
Quelle image devrions-nous utiliser ?
De nombreuses images officielles sont disponibles sur Docker Hub. Par exemple, nous pourrions utiliser les images Python de base, qui existent en de nombreuses versions et variantes (alpine, slim, ...), chacune conçue pour un cas d'usage spécifique.
Si nous souhaitons partir d'une image Python 3.10, nous utiliserions la commande suivante, puisque python:3.10 est le nom de l'image :
Choisir la bonne image de base est important. L'objectif est de trouver une image qui correspond à notre usage, et dont la taille est la plus petite possible. En effet, cela nous permettra de la manipuler plus rapidement et de la stocker plus facilement. Si l'image choisie ne contient pas toutes les bibliothèques nécessaires à notre projet, ce n'est pas un problème, nous verrons comment les installer.
Si vous souhaitez pouvoir utiliser du matériel GPU dans vos jobs AI Training, votre image de base doit avoir les drivers cuda installés.
Voici une liste potentielle d'images de base officielles (incluant les drivers cuda) que vous pouvez utiliser :
- pytorch/pytorch:latest
- tensorflow/tensorflow:latest-gpu
- huggingface/transformers-pytorch-gpu:latest
- mxnet/python
- nvidia/cuda
Par exemple, si nous souhaitons partir de l'image de base tensorflow/tensorflow:latest-gpu, nous utiliserions :
Définir le répertoire personnel
Définir un répertoire personnel est une bonne pratique lors de la création d'images Docker, car cela permet de garder le système de fichiers organisé et facilite la référence aux fichiers et répertoires au sein du container.
Notre répertoire personnel sera /workspace. Nous devons indiquer dans notre Dockerfile que nous souhaitons créer le répertoire /worskpace et le définir comme notre répertoire personnel. Cela peut se faire à l'aide de l'instruction WORKDIR :
Déclarer le répertoire /workspace comme variable d'environnement HOME est nécessaire pour garantir la compatibilité avec AI Training.
Ajouter les fichiers du job au répertoire personnel
Une fois le répertoire /workspace mis en place, nous pouvons y ajouter nos fichiers (scripts Python, requirements.txt, et le Dockerfile) grâce à l'instruction ADD.
Voici un exemple pour ajouter un fichier spécifique, tel qu'un fichier Python main.py :
Si notre projet est composé de nombreux fichiers, nous pouvons aussi ajouter tous les fichiers du répertoire de notre projet en utilisant :
Cette commande pourrait vous permettre de charger votre jeu de données dans votre image Docker. Cependant, cela augmenterait considérablement sa taille. Une bonne pratique consiste à placer les données à l'extérieur, comme dans Object Storage, puis à les lier au job AI Training lors de son lancement.
Donner à l'utilisateur OVHcloud accès au répertoire personnel
Les images dans AI Training ne sont pas exécutées en tant qu'utilisateur root, mais par un utilisateur « OVHcloud » avec l'UID 42420.
Cela signifie que si nous souhaitons pouvoir créer et écrire dans un répertoire spécifique au runtime, nous devrons lui donner des droits spécifiques. Nous pouvons le faire avec l'instruction suivante :
Comme mentionné, le répertoire personnel de l'utilisateur « OVHcloud » (avec l'UID 42420) sera /workspace. Nous pouvons alors remplacer <specific-directory> par /workspace. Gardez toutefois à l'esprit que vous pouvez modifier la propriété de tout autre répertoire utile.
Selon les modèles et frameworks que vous utilisez, d'autres dossiers peuvent être créés pendant l'entraînement à la racine de votre environnement. Cela peut être le cas pour des dossiers comme /runs ou /logs. Dans ce cas, n'oubliez pas de donner également les droits d'accès à ces dossiers : RUN chown -R 42420:42420 /runs /logs.
Pour résumer, voici à quoi ressemble notre Dockerfile pour l'instant :
Installer ce dont nous avons besoin
Comme expliqué précédemment, il est possible que l'image Docker choisie n'inclue pas toutes les bibliothèques nécessaires au bon fonctionnement de notre projet. Dans ce cas, nous devons les installer pour garantir le bon fonctionnement de notre job AI Training.
Nous distinguons deux types :
- Les paquets Linux
- Les bibliothèques Python
Ces instructions d'installation commencent par le préfixe RUN, utilisé pour exécuter une commande lors du processus de construction de l'image.
Installer des paquets système
Par exemple, supposons que le paquet ffmpeg (utilisé pour traiter les fichiers multimédias) soit nécessaire à notre job AI Training mais absent de notre image de base. Nous utiliserions alors :
Si nous devons installer plusieurs paquets, nous pouvons les écrire les uns après les autres comme suit :
Pour améliorer votre Dockerfile en le rendant plus court, nous pouvons également lister tous nos paquets dans un fichier packages.txt, et l'installer avec :
Installer des bibliothèques Python
Pour installer les bibliothèques Python manquantes, nous conseillons de créer un fichier requirements.txt, dans le répertoire racine de votre projet, où nous écrirons toutes les bibliothèques nécessaires manquantes de notre image de base.
Une bonne pratique consiste à préciser la version de chaque bibliothèque dans ce fichier, afin de garantir que les versions installées soient fixes et d'éviter d'éventuels conflits.
Voici un exemple de fichier requirements.txt. Comme vous pouvez le voir, nous avons indiqué chaque bibliothèque nécessaire à notre projet, et nous avons précisé la version de chacune d'elles :
Il est maintenant temps d'indiquer dans notre Dockerfile que nous souhaitons installer les bibliothèques Python à partir de ce fichier requirements.txt, à l'aide d'une instruction RUN pip install -r :
Spécifier la commande principale qui exécute notre job
L'instruction CMD est généralement utilisée pour spécifier la commande principale qui exécute notre job AI Training, comme un script python ou un exécutable binaire. Elle ne peut être utilisée qu'une seule fois dans un Dockerfile.
C'est ici que nous spécifierons quel fichier Python nous souhaitons exécuter. Voici un exemple simple pour exécuter un fichier Python main.py, situé à la racine :
Si votre fichier main.py prend des arguments, vous pouvez les spécifier dans la commande CMD comme suit :
Notez qu'il n'est pas obligatoire de spécifier une instruction CMD dans le Dockerfile. Cela ne fait que simplifier l'expérience de l'utilisateur.
Par exemple, si notre fichier main.py a des paramètres que nous souhaitons personnaliser plutôt que de les fixer dans notre image Docker, nous retirerions l'option CMD du Dockerfile et nous utiliserions la commande suivante lors du lancement du job AI Training :
-- bash -c 'python /workspace/main.py arg1 arg2'
Autres commandes utiles
Plutôt que d'ajouter tous les fichiers du projet en utilisant ADD . /workspace, vous pourriez être intéressé par l'instruction COPY, qui peut être meilleure et plus sûre pour copier des fichiers et répertoires depuis notre répertoire local vers notre image Docker.
Par exemple, si nous souhaitons ajouter le fichier example.py au répertoire personnel de notre image :
Pour plus d'informations sur les Dockerfiles, nous vous recommandons de consulter leur documentation officielle
Aperçu final du Dockerfile
Pour résumer ce tutoriel, voici à quoi ressemble notre Dockerfile final :
Construire notre image
Une fois le Dockerfile complet et conforme à nos besoins, nous devons choisir un nom d'image et construire l'image à l'aide de l'une des commandes suivantes (assurez-vous d'être toujours dans le répertoire racine de votre projet, où se trouve le Dockerfile) :
-
La première commande construit l'image en utilisant l'architecture par défaut de votre système. Cela peut fonctionner si votre machine utilise déjà l'architecture
linux/amd64, qui est requise pour exécuter des containers avec nos produits AI. Cependant, sur des systèmes avec une architecture différente (par exempleARM64surApple Silicon), l'image résultante ne sera pas compatible et ne pourra pas être déployée. -
La seconde commande cible explicitement l'architecture
linux/amd64afin de garantir la compatibilité avec nos services AI. Elle nécessitebuildx, qui n'est pas installé par défaut. Si vous n'avez jamais utilisébuildx, vous pouvez l'installer en exécutant :docker buildx install
L'argument point . indique que votre contexte de build (emplacement du Dockerfile et des autres fichiers nécessaires) est le répertoire courant.
L'argument -t vous permet de choisir l'identifiant à donner à votre image. En général, les identifiants d'image sont composés d'un nom et d'un tag de version <name>:<version>.
Essayez de trouver un nom facilement identifiable. Cela vous permettra de gérer vos images Docker plus facilement, surtout lorsque vous avez plusieurs images et versions.
Par exemple, nous pourrions utiliser :
Tester l'image en local (optionnel)
Si nous souhaitons vérifier que notre image construite fonctionne correctement, nous pouvons exécuter la commande suivante :
N'oubliez pas l'argument --user=42420:42420 si vous souhaitez simuler exactement le même comportement que celui qui se produira sur les jobs AI Training. Il exécute le container Docker en tant qu'utilisateur OVHcloud spécifique (utilisateur 42420:42420).
Envoyer l'image vers le registre de votre choix
Envoyer notre image vers un registre est nécessaire pour qu'AI Training puisse la récupérer.
AI Training fournit, pour chaque projet Public Cloud, un registre par défaut appelé registre partagé, où tous les utilisateurs d'un même projet Public Cloud peuvent envoyer leurs images personnalisées.
Ce registre partagé peut vous aider à réaliser vos tests, mais ne doit pas être utilisé en production, car nous nous réservons le droit de supprimer son contenu si nécessaire. Les images envoyées vers ce registre sont uniquement destinées aux workloads AI Tools, et ne seront pas accessibles pour des usages externes. C'est pourquoi il peut être intéressant d'ajouter d'autres registres. Découvrez comment faire en suivant cette documentation.
Voici les commandes de base pour envoyer une image Docker vers un registre :
Par exemple, si nous souhaitons envoyer une première version de notre image construite nommée cnn_image_segmentation_project vers un registre registry.gra.ai.cloud.ovh.net, nous utiliserions :
Si vous souhaitez connaître les commandes exactes pour envoyer vers votre registre partagé, consultez le bouton Détails de la section Shared Docker Registry, dans le panneau Home d'AI Training.
Exemples de Dockerfile
Si vous souhaitez plus d'exemples concrets, n'hésitez pas à consulter les différents Dockerfiles disponibles sur notre dépôt GitHub ai-training-examples.
Aller plus loin
- Consultez la documentation officielle sur les bonnes pratiques d'écriture des Dockerfiles.
- Découvrez comment construire une image Docker personnalisée pour déployer une app Streamlit.
- Vous pouvez envisager de déployer une image Docker pour des tâches de traitement de données et d'entraînement. Reportez-vous à ce tutoriel.
Pour une formation ou une assistance technique sur la mise en œuvre de nos solutions, contactez votre commercial ou consultez la page Professional Services pour obtenir un devis et faire analyser votre projet par nos experts.
Votre avis nous intéresse !
N’hésitez pas à nous faire part de vos questions, retours et suggestions pour améliorer le service :
- Sur le serveur Discord OVHcloud