Adaptez votre script PyTorch d'entraînement - Amazon SageMaker AI

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.

Adaptez votre script PyTorch d'entraînement

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

Note

SageMaker Le débogueur ne peut pas collecter les tenseurs de sortie du modèle à partir des opérations de l'API torch.nn.functional. Lorsque vous rédigez un script de PyTorch formation, il est recommandé d'utiliser les torch.nnmodules à la place.

Pour PyTorch 1.12.0

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

  1. Créez un hook.

    (Recommandé) Pour les emplois de formation au sein de l' SageMaker IA

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

    Lorsque vous lancez une tâche de formation Lancez des tâches de formation avec Debugger à l'aide du SDK Python SageMaker avec l'une des règles ou l' DebuggerHookConfigune des règles de votre estimateur, SageMaker AI ajoute un fichier de configuration JSON à votre instance d'entraînement qui est récupéré par la get_hook fonction. TensorBoardConfig Notez que si vous n'incluez aucune configuration APIs dans votre estimateur, il n'y aura aucun fichier de configuration à trouver pour le hook et la fonction retournera. None

    (Facultatif) Pour les emplois de formation en dehors de l' SageMaker IA

    Si vous exécutez des tâches de formation en mode local, directement sur des instances SageMaker Notebook, EC2 des instances Amazon ou sur vos propres appareils locaux, utilisez smd.Hook class pour créer un hook. Cependant, cette approche ne permet de stocker que les collections de tenseurs et de les utiliser pour la TensorBoard visualisation. SageMaker Les règles intégrées du débogueur ne fonctionnent pas avec le mode local car elles nécessitent des instances d'entraînement SageMaker AI ML 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 Lancez des tâches de formation avec Debugger à l'aide du 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 Lancez des tâches de formation avec Debugger à l'aide du 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. Il peut s'agir de TensorBoard 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é. L’argument 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 à Lancez des tâches de formation avec Debugger à l'aide du SDK Python SageMaker .