Utiliser Debugger avec des conteneurs d'entraînement personnalisés - Amazon SageMaker

Utiliser Debugger avec des conteneurs d'entraînement personnalisés

Amazon SageMaker Debugger est disponible pour tous les modèles de deep learning que vous ajoutez à Amazon SageMaker. L'AWS CLI, l'API Estimator SageMaker et les API Debugger vous permettent d'utiliser toutes les images de base Docker afin de créer et de personnaliser des conteneurs pour entraîner vos modèles. Pour utiliser Debugger avec des conteneurs personnalisés, vous devez apporter un minimum de modifications à votre script d'entraînement afin d'implémenter le rappel de hook Debugger et de récupérer les tenseurs des tâches d'entraînement.

Vous avez besoin des ressources suivantes pour créer un conteneur personnalisé avec Debugger.

Pour obtenir un exemple de bout en bout d'utilisation de Debugger avec un conteneur d'entraînement personnalisé, veuillez consulter l'exemple de bloc-notes suivant.

Astuce

Ce conteneur personnalisé avec le guide Debugger est une extension du guide Adaptation de votre propre conteneur d'entraînement, qui vous explique comment créer et transmettre votre conteneur d'entraînement personnalisé à Amazon ECR.

Préparation à la création d'un conteneur d'entraînement personnalisé

Pour créer un conteneur docker, la structure de base des fichiers doit ressembler à ce qui suit :

├── debugger_custom_container_test_notebook.ipynb # a notebook to run python snippet codes └── debugger_custom_container_test_folder # this is a docker folder ├── your-training-script.py # your training script with Debugger hook └── Dockerfile # a Dockerfile to build your own container

Enregistrer le hook Debugger à votre script d'entraînement

Pour déboguer l'entraînement de votre modèle, vous devez ajouter un hook Debugger à votre script d'entraînement.

Note

Cette étape est nécessaire pour collecter les paramètres de modèle (tenseurs de sortie) afin de déboguer l'entraînement de votre modèle. Si vous souhaitez uniquement contrôler et profiler, vous pouvez ignorer cette étape d'enregistrement de hook et exclure le paramètre debugger_hook_config lorsque vous créez un estimateur.

L'exemple de code suivant montre la structure d'un script d'entraînement utilisant le modèle Keras ResNet50 et comment transmettre le hook Debugger en tant que rappel Keras pour le débogage. Pour voir un script d'entraînement complet, consultez ce script d'entraînement TensorFlow avec hook SageMaker Debugger.

# An example of training script (your-training-script.py) import tensorflow.compat.v2 as tf from tensorflow.keras.applications.resnet50 import ResNet50 import smdebug.tensorflow as smd def train(batch_size, epoch, model, hook): ... model.fit(X_train, Y_train, batch_size=batch_size, epochs=epoch, validation_data=(X_valid, Y_valid), shuffle=True, # smdebug modification: Pass the Debugger hook in the main() as a Keras callback callbacks=[hook]) def main(): parser=argparse.ArgumentParser(description="Train resnet50 cifar10") # hyperparameter settings parser.add_argument(...) args = parser.parse_args() model=ResNet50(weights=None, input_shape=(32,32,3), classes=10) # Add the following line to register the Debugger hook for Keras. hook=smd.KerasHook.create_from_json_file() # Start the training. train(args.batch_size, args.epoch, model, hook) if __name__ == "__main__": main()

Pour plus d'informations sur l'enregistrement du hook Debugger pour les cadres et l'algorithme pris en charge, consultez les liens suivants dans la bibliothèque client SMDebug :

Dans les exemples de scripts d'entraînement des blocs-notes suivants, vous trouverez d'autres exemples sur la façon d'ajouter les hooks Debugger aux scripts d'entraînement et de collecter les tenseurs de sortie en détail :

  • Debugger en mode script avec le cadre TensorFlow 2.1

    Pour voir la différence entre l'utilisation de Debugger dans un conteneur Deep Learning et en mode script, ouvrez ce bloc-notes et placez-le avec le débogueur précédent dans un exemple de bloc-notes Deep Learning Container TensorFlow v2.1 côte à côte.

    En mode script, la partie de configuration de hook est supprimée du script dans lequel vous définissez l'estimateur. Au lieu de cela, la fonction de hook de Debugger est fusionnée dans le script d'entraînement : TensorFlow Keras ResNet training script in script mode. Le script d'entraînement importe la bibliothèque smdebug dans l'environnement TensorFlow Keras approprié pour communiquer avec l'algorithme TensorFlow ResNet50. Par ailleurs, il implémente manuellement la fonctionnalité de hook smdebug en ajoutant l'argument callbacks=[hook] à l'intérieur de la fonction train (à la ligne 49) et en ajoutant la configuration manuelle du hook (à la ligne 89) fournie par le kit SDK Python de SageMaker.

    Cet exemple de mode script exécute la tâche d'entraînement dans le framework TF 2.1 pour une comparaison directe avec l'absence de modification de script dans l'exemple TF 2.1. La configuration de Debugger en mode script présente l'avantage de pouvoir choisir des versions de cadre non couvertes par les conteneurs AWS Deep Learning Containers.

  • Utilisation d'Amazon SageMaker Debugger dans un conteneur PyTorch en mode script

    Ce bloc-notes active Debugger en mode script dans le cadre PyTorch v1.3.1. PyTorch v1.3.1 est pris en charge par les conteneurs SageMaker, et cet exemple montre comment modifier un script d'entraînement.

    Par défaut, l'estimateur PyTorch de SageMaker est en mode script. Dans le bloc-notes, la ligne permettant d'activer script_mode n'est pas incluse dans la configuration de l'estimateur.

    Ce bloc-notes présente les étapes détaillées pour modifier un script d'entraînement PyTorch original en version modifiée dans laquelle Debugger est activé. En outre, cet exemple montre comment utiliser les règles intégrées du débogueur pour détecter les problèmes d'entraînement tels que la disparition des gradients, et les fonctionnalités d'évaluation du débogueur pour appeler et analyser les tenseurs enregistrés.

Créer et configurer un Dockerfile

Ouvrez votre SageMaker JupyterLab et créez un dossier, debugger_custom_container_test_folder dans cet exemple, pour enregistrer votre script d'entraînement et votre Dockerfile. L'exemple de code suivant est un Dockerfile qui inclut les commandes de création docker essentielles. Collez le code suivant dans le fichier texte Dockerfile et enregistrez-le. Téléchargez votre script d'entraînement dans le même dossier.

# Specify a docker base image FROM tensorflow/tensorflow:2.2.0rc2-gpu-py3 RUN /usr/bin/python3 -m pip install --upgrade pip RUN pip install --upgrade protobuf # Install required packages to enable the SageMaker Python SDK and the smdebug library RUN pip install sagemaker-training RUN pip install smdebug CMD ["bin/bash"]

Si vous souhaitez utiliser une image de conteneur AWS Deep Learning Container, consultez Available AWS Deep Learning Containers Images.

Créer et transmettre le conteneur d'entraînement personnalisé à Amazon ECR

Créez un bloc-notes de test, debugger_custom_container_test_notebook.ipynb, puis exécutez le code suivant dans la cellule du bloc-notes. Cela permet d'accéder au répertoire debugger_byoc_test_docker, de créer le docker avec le nom algorithm_name spécifié et de transmettre le conteneur docker à votre Amazon ECR.

import boto3 account_id = boto3.client('sts').get_caller_identity().get('Account') ecr_repository = 'sagemaker-debugger-mnist-byoc-tf2' tag = ':latest' region = boto3.session.Session().region_name uri_suffix = 'amazonaws.com' if region in ['cn-north-1', 'cn-northwest-1']: uri_suffix = 'amazonaws.com.cn' byoc_image_uri = '{}.dkr.ecr.{}.{}/{}'.format(account_id, region, uri_suffix, ecr_repository + tag) !docker build -t $ecr_repository docker !$(aws ecr get-login --region $region --registry-ids $account_id --no-include-email) !aws ecr create-repository --repository-name $ecr_repository !docker tag {ecr_repository + tag} $byoc_image_uri !docker push $byoc_image_uri
Astuce

Si vous utilisez une image de base du conteneur AWS Deep Learning Container, exécutez le code suivant pour vous connecter à Amazon ECR et accéder au référentiel d'images du conteneur Deep Learning Container.

! aws ecr get-login-password --region {region} | docker login --username AWS --password-stdin 763104351884.dkr.ecr.us-east-1.amazonaws.com

Exécuter et déboguer des tâches d'entraînement à l'aide du conteneur d'entraînement personnalisé

Après avoir créé et transmis votre conteneur docker à Amazon ECR, configurez un estimateur SageMaker avec votre script d'entraînement et les paramètres spécifiques à Debugger. Après avoir exécuté estimator.fit(), Debugger collecte les tenseurs de sortie, les contrôle et détecte les problèmes d'entraînement. Avec les tenseurs enregistrés, vous pouvez effectuer une analyse plus poussée de la tâche d'entraînement à l'aide des fonctions et outils smdebug de base. En configurant un flux de processus de surveillance des règles Debugger avec Amazon CloudWatch Events et AWS Lambda, vous pouvez automatiser un processus d'arrêt de tâche d'entraînement chaque fois que les règles Debugger détectent des problèmes d'entraînement.

import sagemaker from sagemaker.estimator import Estimator from sagemaker.debugger import Rule, DebuggerHookConfig, CollectionConfig, rule_configs profiler_config=ProfilerConfig(...) debugger_hook_config=DebuggerHookConfig(...) rules=[ Rule.sagemaker(rule_configs.built_in_rule()), ProfilerRule.sagemaker(rule_configs.BuiltInRule()) ] estimator=Estimator( image_uri=byoc_image_uri, entry_point="./debugger_custom_container_test_folder/your-training-script.py" role=sagemaker.get_execution_role(), base_job_name='debugger-custom-container-test', instance_count=1, instance_type='ml.p3.2xlarge', # Debugger-specific parameters profiler_config=profiler_config, debugger_hook_config=debugger_hook_config, rules=rules ) # start training estimator.fit()