Adaptation de votre script d'entraînement PyTorch - Amazon SageMaker

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Adaptation de votre script d'entraînement PyTorch

Pour commencer à collecter les tenseurs de sortie du modèle et déboguer les problèmes d'entraînement, apportez les modifications suivantes à votre script d'entraînement PyTorch.

Pour PyTorch 1.12.0

Si vous apportez un script d'entraînement PyTorch, vous pouvez exécuter la tâche d'entraînement et extraire les tenseurs de sortie du modèle avec quelques lignes de code supplémentaires dans votre script d'entraînement. Vous devez utiliser les API de hook dans la bibliothèque client sagemaker-debugger. Suivez les instructions suivantes qui décomposent les étapes à l'aide d'exemples de code.

  1. Créez un hook.

    (Recommandé) Pour les tâches d'entraînement dans SageMaker

    import smdebug.pytorch as smd hook=smd.get_hook(create_if_not_exists=True)

    Lorsque vous lancez une tâche d'entraînement dans Étape 2 : lancer et déboguer des tâches d'entraînement à l'aide du kit SDK Python SageMaker avec l'un des éléments DebuggerHookConfig, TensorBoardConfig ou Rules dans votre estimateur, SageMaker ajoute un fichier de configuration JSON à votre instance d'entraînement qui est récupéré par la fonction get_hook. Notez que si vous n'incluez aucune des API de configuration dans votre estimateur, il n'y aura aucun fichier de configuration susceptible d'être trouvé par le hook, et la fonction renvoie None.

    (Facultatif) Pour les tâches d'entraînement en dehors de SageMaker

    Si vous exécutez des tâches d'entraînement en mode local, directement sur des instances de bloc-notes SageMaker, des instances Amazon EC2 ou vos propres appareils locaux, utilisez la classe smd.Hook pour créer un hook. Toutefois, cette approche peut stocker uniquement les collections de tenseurs utilisables pour la visualisation de TensorBoard. Les règles intégrées de SageMaker Debugger ne fonctionnent pas avec le mode local car elles nécessitent des instances d'entraînement ML SageMaker et S3 pour stocker les sorties des instances distantes en temps réel. L'API smd.get_hook renvoie None dans ce cas.

    Si vous souhaitez créer un hook manuel pour enregistrer les tenseurs en mode local, utilisez l'extrait de code suivant avec la logique permettant de vérifier si l'API smd.get_hook renvoie None et créez un hook manuel à l'aide de la classe smd.Hook. Notez que vous pouvez spécifier n'importe quel répertoire de sortie sur votre machine locale.

    import smdebug.pytorch as smd hook=smd.get_hook(create_if_not_exists=True) if hook is None: hook=smd.Hook( out_dir='/path/to/your/local/output/', export_tensorboard=True )
  2. Enveloppez votre modèle avec les méthodes de classe du hook.

    La méthode hook.register_module() prend votre modèle et itère sur chaque couche, recherchant tous les tenseurs qui correspondent aux expressions régulières que vous fournirez via la configuration dans Étape 2 : lancer et déboguer des tâches d'entraînement à l'aide du kit SDK Python SageMaker. Les tenseurs collectables via cette méthode de hook sont des poids, des biais, des activations, des gradients, des entrées et des sorties.

    hook.register_module(model)
    Astuce

    Si vous collectez l'intégralité des tenseurs de sortie à partir d'un grand modèle de deep learning, la taille totale de ces collections peut augmenter de façon exponentielle et provoquer des goulots d'étranglement. Si vous souhaitez enregistrer des tenseurs spécifiques, vous pouvez également utiliser la méthode hook.save_tensor(). Cette méthode vous permet de sélectionner la variable pour le tenseur spécifique et de l'enregistrer dans une collection personnalisée nommée comme vous le souhaitez. Pour plus d'informations, consultez l'étape 7 de cette instruction.

  3. Enveloppez la fonction de perte avec les méthodes de classe du hook.

    La méthode hook.register_loss consiste à envelopper la fonction de perte. Elle extrait les valeurs de perte à chaque intervalle save_interval que vous définirez lors de la configuration dans Étape 2 : lancer et déboguer des tâches d'entraînement à l'aide du kit SDK Python SageMaker, et les enregistre dans la collection "losses".

    hook.register_loss(loss_function)
  4. Ajoutez hook.set_mode(ModeKeys.TRAIN) dans le bloc d'entraînement. Cela indique que la collection de tenseurs est extraite pendant la phase d'entraînement.

    def train(): ... hook.set_mode(ModeKeys.TRAIN)
  5. Ajoutez hook.set_mode(ModeKeys.EVAL) dans le bloc de validation. Cela indique que la collection de tenseurs est extraite pendant la phase de validation.

    def validation(): ... hook.set_mode(ModeKeys.EVAL)
  6. Utilisez hook.save_scalar() pour enregistrer des scalaires personnalisés. Vous pouvez enregistrer des valeurs scalaires qui ne figurent pas dans votre modèle. Par exemple, si vous souhaitez enregistrer les valeurs de précision calculées lors de l'évaluation, ajoutez la ligne de code suivante sous la ligne où vous calculez la précision.

    hook.save_scalar("accuracy", accuracy)

    Notez que vous devez fournir une chaîne comme premier argument pour nommer la collection scalaire personnalisée. Il s'agit du nom qui sera utilisé pour visualiser les valeurs scalaires dans TensorBoard et il peut s'agir de n'importe quelle chaîne de votre choix.

  7. Utilisez hook.save_tensor() pour enregistrer des tenseurs personnalisés. Comme pour hook.save_scalar(), vous pouvez enregistrer des tenseurs supplémentaires en définissant votre propre collection de tenseurs. Par exemple, vous pouvez extraire les données d'image d'entrée qui sont transmises au modèle et les enregistrer sous forme de tenseur personnalisé en ajoutant la ligne de code suivante, où "images" est un exemple de nom de tenseur personnalisé et image_inputs est un exemple de variable pour les données d'image d'entrée.

    hook.save_tensor("images", image_inputs)

    Notez que vous devez fournir une chaîne au premier argument pour nommer le tenseur personnalisé. hook.save_tensor() contient le troisième argument collections_to_write pour spécifier la collection de tenseurs dans laquelle enregistrer le tenseur personnalisé. La valeur par défaut est collections_to_write="default". Si vous ne spécifiez pas explicitement le troisième argument, le tenseur personnalisé est enregistré dans la collection de tenseurs "default".

Une fois que vous avez terminé d'adapter votre scénario d'entraînement, passez à Étape 2 : lancer et déboguer des tâches d'entraînement à l'aide du kit SDK Python SageMaker.