Surveiller et déboguer l'entraînement à l'aide d'un shell interactif

Cette page explique comment utiliser un shell interactif pour inspecter le conteneur dans lequel votre code d'entraînement est exécuté. Vous pouvez parcourir le système de fichiers et exécuter des utilitaires de débogage dans chaque conteneur prédéfini ou conteneur personnalisé exécuté sur Vertex AI.

L'utilisation d'une interface système interactive pour inspecter votre conteneur d'entraînement peut vous aider à déboguer les problèmes de votre code d'entraînement ou de votre configuration de Vertex AI. Par exemple, vous pouvez utiliser un shell interactif pour effectuer les opérations suivantes :

  • Exécuter des outils de traçage et de profilage
  • Analyser l'utilisation des GPU
  • Vérifier les autorisations Google Cloud disponibles pour le conteneur

Vertex AI est également intégré à TensorFlow Profiler, que vous pouvez utiliser pour déboguer les performances d'entraînement des modèles pour vos jobs d'entraînement personnalisés. Pour en savoir plus, consultez la page Profiler les performances d'entraînement des modèles à l'aide de Profiler.

Avant de commencer

Vous pouvez utiliser une interface système interactive lorsque vous effectuez un entraînement personnalisé avec une ressource CustomJob, HyperparameterTuningJob ou TrainingPipeline personnalisée. Lorsque vous préparez votre code d'entraînement et configurez la ressource d'entraînement personnalisée de votre choix, assurez-vous de répondre aux exigences suivantes :

  • Assurez-vous que bash est installé sur votre conteneur d'entraînement.

    bash est installé sur tous les conteneurs d'entraînement prédéfinis. Si vous créez un conteneur personnalisé pour l'entraînement, utilisez un conteneur de base incluant bash ou installez bash dans votre Dockerfile.

  • Effectuer un entraînement dans une région compatible avec les interfaces systèmes interactives.

  • Assurez-vous que toute personne souhaitant accéder à une interface système interactive dispose des autorisations suivantes pour le projet Google Cloud dans lequel l'entraînement personnalisé est en cours d'exécution :

    • aiplatform.customJobs.create
    • aiplatform.customJobs.get
    • aiplatform.customJobs.cancel

    Si vous lancez vous-même un entraînement personnalisé, vous disposez probablement déjà de ces autorisations et pouvez accéder à une interface système interactive. Toutefois, si vous souhaitez utiliser une interface système interactive pour inspecter une ressource d'entraînement personnalisée créée par un autre membre de votre organisation, vous devrez peut-être obtenir ces autorisations.

    Pour obtenir ces autorisations, vous pouvez demander à un administrateur de votre organisation de vous accorder le rôle Utilisateur Vertex AI (roles/aiplatform.user).

Conditions requises pour les cas avancés

Si vous utilisez certaines fonctionnalités avancées, remplissez les exigences supplémentaires suivantes :

  • Si vous associez un compte de service personnalisé à votre ressource d'entraînement personnalisé, assurez-vous que tout utilisateur souhaitant accéder à une interface système interactive dispose de l'autorisation iam.serviceAccounts.actAs pour le compte de service associé.

    Le guide des comptes de service personnalisés indique que vous devez disposer de cette autorisation pour associer un compte de service. Vous devez également disposer de cette autorisation pour afficher une interface système interactive lors de l'entraînement personnalisé.

    Par exemple, pour créer une tâche CustomJob avec un compte de service associé, vous devez disposer de l'autorisation iam.serviceAccounts.actAs pour ce compte. Si l'un de vos collègues souhaite afficher une interface système interactive pour cette tâche CustomJob, il doit également disposer de la même autorisation iam.serviceAccounts.actAs.

  • Si vous avez configuré votre projet pour utiliser VPC Service Controls avec Vertex AI, tenez compte des limites supplémentaires suivantes :

    • Vous ne pouvez pas utiliser d'adresse IP privée pour l'entraînement personnalisé.

    • Depuis une interface système interactive, vous ne pouvez pas accéder aux ressources Internet publiques ou Google Cloud en dehors de votre périmètre de service.

    • Pour sécuriser l'accès aux interfaces système interactives, vous devez ajouter notebooks.googleapis.com en tant que service restreint dans votre périmètre de service, en plus de aiplatform.googleapis.com. Si vous limitez uniquement aiplatform.googleapis.com et non notebooks.googleapis.com, les utilisateurs peuvent accéder aux interfaces système interactives à partir de machines situées en dehors du périmètre de service, ce qui réduit les avantages en termes de sécurité liés à l'utilisation de VPC Service Controls.

Activer les interfaces système interactives

Pour activer les interfaces systèmes interactives pour une ressource d'entraînement personnalisée, définissez le champ d'API enableWebAccess sur true lorsque vous créez une ressource CustomJob, HyperparameterTuningJob ou une ressource personnalisée TrainingPipeline.

Les exemples suivants montrent comment effectuer cette opération à l'aide de différents outils :

Console

Suivez le guide pour créer un objet TrainingPipeline personnalisé dans Google Cloud Console. Dans le volet Entraîner un nouveau modèle, lorsque vous atteignez l'étape Détails du modèle, procédez comme suit :

  1. Cliquez sur Options avancées.

  2. Cochez la case Activer le débogage de l'entraînement.

Effectuez ensuite le reste du workflow pour l'entraînement du nouveau modèle.

gcloud

Pour apprendre à utiliser ces commandes, consultez les sections Créer un objet CustomJob et Créer un objet HyperparameterTuningJob.

API

Les corps de requête REST partiels suivants indiquent où spécifier le champ enableWebAccess pour chaque type de ressource d'entraînement personnalisé :

Tâche personnalisée

L'exemple suivant est un corps de requête partiel pour la méthode projects.locations.customJobs.create de l'API :

{
  ...
  "jobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}

Pour obtenir un exemple d'envoi d'une requête API pour créer une tâche personnalisée CustomJob, consultez la page Créer des tâches d'entraînement personnalisées.

HyperparameterTuningJob

L'exemple suivant est un corps de requête partiel pour la méthode projects.locations.hyperparameterTuningJobs.create de l'API :

{
  ...
  "trialJobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}

Pour obtenir un exemple d'envoi d'une requête API pour créer un objet HyperparameterTuningJob, consultez la page Utiliser les réglages d'hyperparamètres.

Pipeline d'entraînement personnalisé

Les exemples suivants montrent les corps de requête partiels pour la méthode projects.locations.trainingPipelines.create de l'API. Sélectionnez l'un des onglets suivants, selon que vous utilisez ou non les réglages d'hyperparamètres :

Sans réglages d'hyperparamètres

{
  ...
  "trainingTaskInputs": {
    ...
    "enableWebAccess": true
  }
  ...
}

Avec réglages d'hyperparamètres

{
  ...
  "trainingTaskInputs": {
    ...
    "trialJobSpec": {
      ...
      "enableWebAccess": true
    }
  }
  ...
}

Pour obtenir un exemple d'envoi d'une requête API pour créer un pipeline d'entraînement personnalisé (TrainingPipeline), consultez la page Créer des pipelines d'entraînement.

Python

Pour savoir comment installer ou mettre à jour le SDK Vertex AI pour Python, consultez la section Installer le SDK Vertex AI pour Python. Pour en savoir plus, consultez la documentation de référence de l'API Python.

Définissez le paramètre enable_web_access sur true lorsque vous exécutez l'une des méthodes suivantes :

Une fois que vous avez lancé un entraînement personnalisé en suivant les instructions de la section précédente, Vertex AI génère un ou plusieurs URI que vous pouvez utiliser pour accéder aux interfaces système interactives. Vertex AI génère un URI unique pour chaque nœud d'entraînement de votre tâche.

Vous pouvez accéder à un shell interactif de l'une des manières suivantes :

  • Cliquez sur un lien dans la cnsole Google Cloud.
  • Utilisez l'API Vertex AI pour obtenir l'URI d'accès Web du shell
  1. Dans la console Google Cloud, dans la section Vertex AI, accédez à l'une des pages suivantes :

  2. Cliquez sur le nom de votre ressource d'entraînement personnalisé.

    Si vous avez créé un TrainingPipeline pour l'entraînement personnalisé, cliquez sur le nom de CustomJob ou HyperparameterTuningJob créé par votre TrainingPipeline. Par exemple, si votre pipeline porte le nom PIPELINE_NAME, celui-ci peut être nommé PIPELINE_NAME-custom-job ou PIPELINE_NAME-hyperparameter-tuning-job.

  3. Sur la page de votre tâche, cliquez sur Lancer le terminal Web. Si votre tâche utilise plusieurs nœuds, cliquez sur Lancer le terminal Web à côté du nœud pour lequel vous souhaitez une interface système interactive.

    Notez que vous ne pouvez accéder à une interface système interactive que pendant l'exécution de la tâche. Si le bouton Lancer un terminal Web ne s'affiche pas, il est possible que Vertex AI n'ait pas encore commencé à exécuter votre tâche, ou que la tâche soit déjà terminée ou qu'elle ait échoué. Si l'état de la tâche est Queued ou Pending, attendez une minute. puis actualisez la page.

    Si vous utilisez les réglages d'hyperparamètres, il existe des liens distincts pour Lancer un terminal Web pour chaque essai.

Obtenir l'URI d'accès Web à partir de l'API

Utilisez la méthode de l'API projects.locations.customJobs.get ou la méthode de l'API projects.locations.hyperparameterTuningJobs.get pour voir les URI que vous pouvez utiliser pour accéder aux shells interactifs.

Selon le type de ressource d'entraînement personnalisé que vous utilisez, sélectionnez l'un des onglets suivants pour voir des exemples sur la façon de trouver le champ d'API webAccessUris, qui contient un URI d'interface système interactive pour chaque nœud de votre tâche.

Tâche personnalisée

Les onglets suivants montrent différentes manières d'envoyer une requête projects.locations.customJobs.get :

gcloud

Exécutez la commande gcloud ai custom-jobs describe :

gcloud ai custom-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json

Remplacez l'élément suivant :

  • JOB_ID : ID numérique de la tâche. Cet ID correspond à la dernière partie du champ name de la tâche. Vous avez peut-être vu l'ID lorsque vous avez créé la tâche. (Si vous ne connaissez pas l'ID de votre tâche, vous pouvez exécuter la commande gcloud ai custom-jobs list et rechercher la tâche concernée.)

  • LOCATION : région dans laquelle vous avez créé la tâche.

REST

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • LOCATION : région dans laquelle vous avez créé la tâche.

  • PROJECT_ID : l'ID de votre projet.

  • JOB_ID : ID numérique de la tâche. Cet ID correspond à la dernière partie du champ name de la tâche. Vous avez peut-être vu l'ID lorsque vous avez créé la tâche.

Méthode HTTP et URL :

GET https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs/JOB_ID

Pour envoyer votre requête, développez l'une des options suivantes :

 

Dans le résultat, recherchez ce qui suit :

{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "webAccessUris": {
    "workerpool0-0": "INTERACTIVE_SHELL_URI"
  }
}

Si le champ webAccessUris ne s'affiche pas, il est possible que Vertex AI n'ait pas encore commencé à exécuter votre tâche. Vérifiez que JOB_STATE_RUNNING s'affiche dans le champ state. Si l'état est JOB_STATE_QUEUED ou JOB_STATE_PENDING, attendez une minute, puis réessayez d'obtenir les informations sur le projet.

HyperparameterTuningJob

Les onglets suivants montrent différentes manières d'envoyer une requête projects.locations.hyperparameterTuningJobs.get :

gcloud

Exécutez la commande gcloud ai hp-tuning-jobs describe :

gcloud ai hp-tuning-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json

Remplacez l'élément suivant :

  • JOB_ID : ID numérique de la tâche. Cet ID correspond à la dernière partie du champ name de la tâche. Vous avez peut-être vu l'ID lorsque vous avez créé la tâche. (Si vous ne connaissez pas l'ID de votre tâche, vous pouvez exécuter la commande gcloud ai hp-tuning-jobs list et rechercher la tâche concernée.)

  • LOCATION : région dans laquelle vous avez créé la tâche.

REST

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • LOCATION : région dans laquelle vous avez créé la tâche.

  • PROJECT_ID : l'ID de votre projet.

  • JOB_ID : ID numérique de la tâche. Cet ID correspond à la dernière partie du champ name de la tâche. Vous avez peut-être vu l'ID lorsque vous avez créé la tâche.

Méthode HTTP et URL :

GET https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/hyperparameterTuningJobs/JOB_ID

Pour envoyer votre requête, développez l'une des options suivantes :

 

Dans le résultat, recherchez ce qui suit :

{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "trials": [
    ...
    {
      ...
      "state": "ACTIVE",
      ...
      "webAccessUris": {
        "workerpool0-0": "INTERACTIVE_SHELL_URI"
      }
    }
  ],
}

Si le champ webAccessUris ne s'affiche pas, il est possible que Vertex AI n'ait pas encore commencé à exécuter votre tâche. Vérifiez que JOB_STATE_RUNNING s'affiche dans le champ state. Si l'état est JOB_STATE_QUEUED ou JOB_STATE_PENDING, attendez une minute, puis réessayez d'obtenir les informations sur le projet.

Vertex AI fournit un ensemble d'URI d'interfaces système interactives pour chaque essai de réglage d'hyperparamètres lorsque l'essai passe à l'état ACTIVE. Si vous souhaitez obtenir des URI d'interfaces système interactives pour des essais ultérieurs, récupérez à nouveau les informations sur la tâche après le début de ces essais.

L'exemple précédent montre le résultat attendu pour l'entraînement à instance dupliquée unique : un URI pour le nœud d'entraînement principal. Si vous effectuez un entraînement distribué, le résultat contient un URI pour chaque nœud d'entraînement, identifié par le pool de nœuds de calcul.

Par exemple, si votre tâche comporte un pool de nœuds de calcul principal avec une instance dupliquée et un pool de nœuds de calcul secondaire avec deux instances dupliquées, le champ webAccessUris ressemble à ceci :

{
  "workerpool0-0": "URI_FOR_PRIMARY",
  "workerpool1-0": "URI_FOR_FIRST_SECONDARY",
  "workerpool1-1": "URI_FOR_SECOND_SECONDARY"
}

Utiliser une interface système interactive

Pour utiliser l'interface système interactive avec un nœud d'entraînement, accédez à l'un des URI que vous avez trouvés dans la section précédente. Une interface système Bash apparaît dans votre navigateur et vous donne accès au système de fichiers du conteneur dans lequel Vertex AI exécute votre code d'entraînement.

Les sections suivantes décrivent certains éléments à prendre en compte lorsque vous utilisez l'interface système. Elles fournissent également des exemples d'outils de surveillance que vous pouvez utiliser dans cette interface système.

Empêcher la tâche de se terminer

Lorsque Vertex AI termine l'exécution de votre tâche ou de votre essai, vous perdez immédiatement l'accès à votre interface système interactive. Dans ce cas, le message command terminated with exit code 137 ou l'interface système peuvent cesser de répondre. Si vous avez créé des fichiers dans le système de fichiers du conteneur, ils ne persisteront pas une fois la tâche terminée.

Dans certains cas, vous souhaiterez peut-être prolonger intentionnellement l'exécution de votre tâche afin de la déboguer avec une interface système interactive. Par exemple, vous pouvez ajouter du code comme suit à votre code d'entraînement pour que la tâche continue de s'exécuter pendant au moins une heure après qu'une exception se produit :

import time
import traceback

try:
    # Replace with a function that runs your training code
    train_model()
except Exception as e:
    traceback.print_exc()
    time.sleep(60 * 60)  # 1 hour

Notez toutefois que des frais d'entraînement de Vertex AI vous sont facturés tant que la tâche continue de s'exécuter.

Vérifier les problèmes d'autorisation

L'environnement shell interactif est authentifié à l'aide des identifiants par défaut de l'application (ADC) du compte de service utilisé par Vertex AI pour exécuter votre code d'entraînement. Vous pouvez exécuter gcloud auth list dans l'interface système pour plus de détails.

Dans l'interface système, vous pouvez utiliser gsutil, bq et d'autres outils compatibles avec les ADC. Cela peut vous aider à vérifier que la tâche peut accéder à un bucket Cloud Storage, à une table BigQuery ou à une autre ressource Google Cloud spécifique dont votre code d'entraînement a besoin.

Visualiser l'exécution Python avec py-spy

py-spy vous permet de profiler un programme Python en cours d'exécution, sans le modifier. Pour utiliser py-spy dans une interface système interactive, procédez comme suit :

  1. Installez py-spy :

    pip3 install py-spy
    
  2. Exécutez ps aux dans l'interface système et recherchez le PID du programme d'entraînement Python.

  3. Exécutez l'une des sous-commandes décrites dans la documentation py-spy, en utilisant le PID trouvé à l'étape précédente.

  4. Si vous utilisez py-spy record pour créer un fichier SVG, copiez ce fichier dans un bucket Cloud Storage afin de pouvoir le consulter sur votre ordinateur local ultérieurement. Exemple :

    gsutil cp profile.svg gs://BUCKET
    

    Remplacez BUCKET par le nom d'un bucket auquel vous avez accès.

Analyser les performances avec perf

perf vous permet d'analyser les performances de votre nœud d'entraînement. Pour installer la version de perf appropriée pour le noyau Linux de votre nœud, exécutez les commandes suivantes :

apt-get update
apt-get install -y linux-tools-generic
rm /usr/bin/perf
LINUX_TOOLS_VERSION=$(ls /usr/lib/linux-tools | tail -n 1)
ln -s "/usr/lib/linux-tools/${LINUX_TOOLS_VERSION}/perf" /usr/bin/perf

Vous pouvez ensuite exécuter l'une des sous-commandes décrites dans la documentation de perf.

Récupérer des informations sur l'utilisation des GPU

Les conteneurs compatibles GPU s'exécutant sur des nœuds avec des GPU disposent généralement de plusieurs outils de ligne de commande préinstallés qui peuvent vous aider à surveiller l'utilisation des GPU. Exemple :

  • Utilisez nvidia-smi pour surveiller l'utilisation des GPU de divers processus.

  • Utilisez nvprof pour collecter diverses informations de profilage de GPU. Comme nvprof ne peut pas s'associer à un processus existant, vous pouvez utiliser l'outil pour démarrer un processus supplémentaire exécutant votre code d'entraînement (Cela signifie que votre code d'entraînement s'exécutera deux fois sur le nœud.) Exemple :

    nvprof -o prof.nvvp python3 -m MODULE_NAME
    

    Remplacez MODULE_NAME par le nom complet du module de point d'entrée de votre application d'entraînement, par exemple trainer.task.

    Ensuite, transférez le fichier de sortie dans un bucket Cloud Storage afin de pouvoir l'analyser ultérieurement sur votre ordinateur local. Exemple :

    gsutil cp prof.nvvp gs://BUCKET
    

    Remplacez BUCKET par le nom d'un bucket auquel vous avez accès.

  • Si vous rencontrez une erreur de GPU (qui n'est pas liée à un problème de configuration ou de Vertex AI), utilisez nvidia-bug-report.sh pour créer un rapport de bug.

    Ensuite, transférez le rapport dans un bucket Cloud Storage afin de pouvoir l'analyser ultérieurement sur votre ordinateur local ou l'envoyer à NVIDIA. Exemple :

    gsutil cp nvidia-bug-report.log.gz gs://BUCKET
    

    Remplacez BUCKET par le nom d'un bucket auquel vous avez accès.

Si bash ne trouve aucune de ces commandes NVIDIA, essayez d'ajouter /usr/local/nvidia/bin et /usr/local/cuda/bin au fichier PATH de l'interface système :

export PATH="/usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}"

Étapes suivantes