调整您的 PyTorch 训练脚本 - Amazon SageMaker

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

调整您的 PyTorch 训练脚本

要开始收集模型输出张量并调试训练问题,请对 PyTorch 训练脚本进行以下修改。

注意

SageMaker 调试器无法从操作中收集模型输出张量。torch.nn.functionalAPI在编写 PyTorch 训练脚本时,建议改用这些torch.nn模块。

对于 PyTorch 1.12.0

如果您带上 PyTorch 训练脚本,则可以在训练脚本中使用几行额外的代码来运行训练作业并提取模型输出张量。你需要在sagemaker-debugger客户端库APIs中使用挂钩。仔细阅读以下说明,这些说明分别介绍了各个步骤并提供代码示例。

  1. 创建钩子。

    (推荐)用于内部的培训工作 SageMaker

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

    当您在估算器中使用 Python 使用调试器启动训练作业 SageMaker SDK使用任何 DebuggerHookConfig TensorBoardConfig、或规则启动训练作业时, SageMaker会向您的训练实例添加一个由函数获取的JSON配置文件。get_hook请注意,如果您在估算器APIs中不包含任何配置,则不会有配置文件可供钩子查找,并且函数会返回。None

    (可选)用于外部培训作业 SageMaker

    如果您在本地模式下直接在 SageMaker Notebook 实例、Amazon EC2 实例或您自己的本地设备上运行训练作业,请使用smd.Hook类来创建挂钩。但是,这种方法只能存储张量集合并可用于可 TensorBoard 视化。 SageMaker 调试器的内置规则不适用于本地模式,因为这些规则要求 SageMaker 机器学习训练实例和 S3 实时存储来自远程实例的输出。本例None中的smd.get_hookAPI回报。

    如果要创建手动挂钩以在本地模式下保存张量,请使用以下带有逻辑的代码片段来检查是否smd.get_hookAPI返回,None然后使用该smd.Hook类创建一个手动挂钩。请注意,您可以指定本地计算机中的任何输出目录。

    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. 用钩子的类方法包装您的模型。

    hook.register_module() 方法获取您的模型并遍历每一层,寻找与您通过 使用 Python 使用调试器启动训练作业 SageMaker SDK 中配置提供的正则表达式匹配的任何张量。通过这种钩子方法可以收集到的张量包括权重、偏差、激活、梯度、输入和输出。

    hook.register_module(model)
    提示

    如果您从大型深度学习模型中完整地收集输出张量,则这些集合的总大小会呈指数级增长,并可能导致瓶颈。如果您要保存特定张量,还可以使用 hook.save_tensor() 方法。此方法可协助您为特定张量选取变量,并保存到您自己命名的自定义集合中。有关更多信息,请参阅本说明中的步骤 7

  3. 用钩子的类方法包装损失函数。

    hook.register_loss 方法用于包装损失函数。它会根据您在 使用 Python 使用调试器启动训练作业 SageMaker SDK 的配置中设置的 save_interval 来提取损失值,并将它们保存到 "losses" 集合中。

    hook.register_loss(loss_function)
  4. 在训练块中添加 hook.set_mode(ModeKeys.TRAIN)。这表示张量集合是在训练阶段中提取的。

    def train(): ... hook.set_mode(ModeKeys.TRAIN)
  5. 在验证块中添加 hook.set_mode(ModeKeys.EVAL)。这表示张量集合是在验证阶段中提取的。

    def validation(): ... hook.set_mode(ModeKeys.EVAL)
  6. 使用 hook.save_scalar() 保存自定义标量。您可以保存模型中没有的标量值。例如,如果您要记录评估期间计算的准确性值,请在计算准确性的行下方添加以下代码行。

    hook.save_scalar("accuracy", accuracy)

    请注意,您需要提供字符串作为第一个参数,用于命名自定义标量集合。这个名称将用于可视化中的标量值 TensorBoard,可以是任何你想要的字符串。

  7. 使用 hook.save_tensor() 保存自定义张量。与 hook.save_scalar() 类似,您可以保存其他张量,并定义自己的张量集合。例如,您可以提取传入模型的输入映像数据,并通过添加以下代码行,将其保存为自定义张量,其中 "images" 是自定义张量的示例名称,image_inputs 是输入映像数据的示例变量。

    hook.save_tensor("images", image_inputs)

    请注意,您必须向第一个参数提供字符串来命名自定义张量。hook.save_tensor() 使用第三个参数 collections_to_write 来指定张量集合,用于保存自定义张量。默认为 collections_to_write="default"。如果您没有明确指定第三个参数,则自定义张量将保存到 "default" 张量集合中。

调整完训练脚本后,继续到 使用 Python 使用调试器启动训练作业 SageMaker SDK