Créer une image de conteneur personnalisée pour l'entraînement

L'utilisation d'une image de conteneur personnalisée offre la plus grande flexibilité pour l'entraînement sur l'IA Vertex. Pour découvrir en quoi l'utilisation d'une image de conteneur personnalisée diffère de l'utilisation d'une application d'entraînement Python avec un conteneur prédéfini, consultez la page Exigences concernant le code d'entraînement.

Le guide détaille les étapes suivantes :

  1. Créer un conteneur personnalisé :
    1. Écrire un fichier Dockerfile configurant votre conteneur pour qu'il fonctionne avec Vertex AI et comprenant les dépendances nécessaires à l'application d'entraînement.
    2. Créer et exécuter votre conteneur Docker localement.
  2. Transférer l'image de conteneur vers Artifact Registry.

Avant de commencer

Pour configurer un dépôt d'API Artifact Registry et configurer Docker dans votre environnement de développement, suivez le Guide de démarrage rapide de Artifact Registry pour Docker. Assurez-vous que les étapes suivantes du démarrage rapide sont bien respectées :

  • Avant de commencer
  • Choisir une interface système
  • Créer un dépôt Docker
  • Configurer l'authentification

Créer une image de conteneur personnalisée

Nous vous recommandons deux workflows possibles pour créer une image de conteneur personnalisée :

  • Rédigez le code d'entraînement. Ensuite, utilisez la commande gcloud beta ai custom-jobs local-run pour créer et tester une image de conteneur personnalisé basée sur votre code d'entraînement sans écrire vous-même un fichier Dockerfile.

    Ce workflow peut s'avérer plus simple si vous ne connaissez pas bien Docker. Si vous suivez ce workflow, vous pouvez ignorer le reste de cette section.

  • Rédigez le code d'entraînement. Ensuite, écrivez un fichier Dockerfile et créez une image de conteneur basée sur celui-ci. Enfin, testez le conteneur localement.

    Ce workflow offre une plus grande flexibilité, car vous pouvez personnaliser votre image de conteneur autant de fois que vous le souhaitez.

Le reste de cette section présente un exemple de ce dernier workflow.

Code d'entraînement

Vous pouvez écrire du code d'entraînement à l'aide de n'importe quelle dépendance dans n'importe quel langage de programmation. Assurez-vous que votre code respecte les exigences concernant le code d'entraînement. Si vous prévoyez d'utiliser les réglages d'hyperparamètres, les GPU ou l'entraînement distribué, veillez à lire les sections correspondantes du présent document. Ces sections décrivent des aspects spécifiques de l'utilisation de ces fonctionnalités avec des conteneurs personnalisés.

Créer un fichier Dockerfile

Créez un fichier Dockerfile pour spécifier toutes les instructions nécessaires à la création de votre image de conteneur.

Cette section décrit la création d'un exemple générique de fichier Dockerfile à utiliser pour l'entraînement personnalisé. Pour en savoir plus sur la création d'une image de conteneur, consultez le guide de démarrage rapide de la documentation Docker.

En cas d'utilisation avec Vertex AI, votre fichier Dockerfile doit inclure des commandes couvrant les tâches suivantes:

  • Choisir une image de base
  • Installer des dépendances supplémentaires
  • Copier le code d'entraînement dans l'image
  • Configurer le point d'entrée pour l'IA Vertex pour appeler votre code d'entraînement

Le fichier Dockerfile peut inclure une logique supplémentaire, en fonction de vos besoins. Pour en savoir plus sur chaque instruction spécifique, consultez la documentation de référence sur Dockerfile.

Commande Dockerfile Description Exemple(s)
FROM image:tag Spécifie une image de base et son tag.

Exemples d'images de base avec des tags :

  • pytorch/pytorch:latest
  • tensorflow/tensorflow:nightly
  • python:2.7.15-jessie
  • nvidia/cuda:9.0-cudnn7-runtime
WORKDIR /path/to/directory Spécifie le répertoire sur l'image où les instructions suivantes sont exécutées. /root
RUN pip install pkg1 pkg2 pkg3 Installe des packages supplémentaires à l'aide de pip.

Remarque : Si votre image de base ne contient pas pip, vous devez inclure une commande pour l'installer avant d'installer d'autres packages.

Exemples de packages :

  • google-cloud-storage
  • cloudml-hypertune
  • pandas
COPY src/foo.py dest/foo.py Copie le code de l'application d'entraînement dans l'image. Selon la structure de l'application d'entraînement, cela peut inclure plusieurs fichiers.

Exemples de noms de fichiers dans l'application d'entraînement :

  • model.py
  • task.py
  • data_utils.py
ENTRYPOINT ["exec", "file"] Configure le point d'entrée pour appeler le code d'entraînement à exécuter. Lorsque vous démarrez l'entraînement personnalisé, vous pouvez remplacer ce point d'entrée en spécifiant le champ command dans votre ContainerSpec. Vous pouvez également spécifier le champ args dans le ContainerSpec pour fournir des arguments supplémentaires au point d'entrée (et remplacer les instructions CMD de l'image du conteneur, le cas échéant). ["python", "task.py"]

La logique du fichier Dockerfile peut varier en fonction de vos besoins, mais elle ressemble généralement à ceci :

# Specifies base image and tag
FROM image:tag
WORKDIR /root

# Installs additional packages
RUN pip install pkg1 pkg2 pkg3

# Downloads training data
RUN curl https://example-url/path-to-data/data-filename --output /root/data-filename

# Copies the trainer code to the docker image.
COPY your-path-to/model.py /root/model.py
COPY your-path-to/task.py /root/task.py

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "task.py"]

Créer l'image de conteneur

Créez l'URI d'image correct en utilisant des variables d'environnement, puis compilez l'image Docker :

export PROJECT_ID=$(gcloud config list project --format "value(core.project)")
export REPO_NAME=REPOSITORY_NAME
export IMAGE_NAME=IMAGE_NAME
export IMAGE_TAG=IMAGE_TAG
export IMAGE_URI=us-central1-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}/${IMAGE_NAME}:${IMAGE_TAG}

docker build -f Dockerfile -t ${IMAGE_URI} ./

Dans ces commandes, remplacez les éléments suivants :

  • REPOSITORY_NAME : nom du dépôt Artifact Registry que vous avez créé dans la section Avant de commencer.
  • IMAGE_NAME : nom de votre choix pour l'image de conteneur.
  • IMAGE_TAG : tag de votre choix pour cette version de l'image de conteneur.

Découvrez les exigences de Artifact Registry concernant les noms des images de conteneur.

Exécuter le conteneur localement (facultatif)

Vérifiez l'image de conteneur en l'exécutant localement en tant que conteneur. Vous souhaiterez probablement exécuter votre code d'entraînement sur un ensemble de données plus petit ou pour un nombre d'itérations inférieur à celui que vous prévoyez d'exécuter sur Vertex AI. Par exemple, si le script de point d'entrée dans votre image de conteneur accepte une option --epochs pour contrôler le nombre d'époques pour lesquelles elle est exécutée, vous pouvez exécuter la commande suivante :

docker run ${IMAGE_URI} --epochs 1

Transférer le conteneur vers Artifact Registry.

Si l'exécution locale fonctionne, vous pouvez stocker le conteneur dans Artifact Registry.

Commencez par exécuter gcloud auth configure-docker us-central1-docker.pkg.dev si vous ne l'avez pas déjà fait dans votre environnement de développement. Exécutez ensuite la commande suivante :

docker push ${IMAGE_URI}

Autorisations Artifact Registry et Container Registry

Si vous utilisez une image Artifact Registry ou Container Registry dans le même projet Google Cloud sur lequel vous utilisez Vertex AI, il n'est pas nécessaire de configurer les autorisations. Vous pouvez immédiatement créer une tâche d'entraînement personnalisée qui utilise votre image de conteneur.

Toutefois, si vous avez transféré votre image de conteneur vers Artifact Registry ou Container Registry dans un autre projet Google Cloud que celui dans lequel vous prévoyez d'utiliser Vertex AI, vous devez accorder à l'agent de service Vertex AI de votre projet Vertex AI l'autorisation d'extraire l'image depuis l'autre projet. Apprenez-en plus sur l'agent de service Vertex AI et découvrez comment lui accorder des autorisations.

Artifact Registry

Pour savoir comment accorder à votre agent de service Vertex AI l'accès à votre dépôt Artifact Registry, consultez la documentation d'Artifact Registry sur l'octroi d'autorisations spécifiques à un dépôt.

Container Registry

En arrière-plan, le contrôle des accès pour Container Registry repose sur un bucket Cloud Storage. Suivez la section Accorder des autorisations dans la documentation sur le contrôle des accès de Container Registry pour attribuer à votre agent de service Vertex AI le rôle de lecteur des objets de l'espace de stockage (roles/storage.objectViewer) pour le bucket Cloud Storage approprié.

Étape suivante