本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon SageMaker 调试程序的注意事项
在使用 Amazon SageMaker 调试程序时,请注意以下事项。
分布式训练注意事项
以下列表显示了在具有深度学习框架和各种分布式培训选项的训练作业中使用调试器的有效性范围和注意事项。
-
Horovod
使用调试器进行 Horovod 培训工作的有效性范围深度学习框架 Apache MXNet TensorFlow 1.x TensorFlow 2.x TensorFlow 2.x 与克拉斯 PyTorch 监控系统瓶颈 是 是 是 是 是 分析框架操作 否 否 否 是 是 调试模型输出张量 是 是 是 是 是 -
SageMaker 并行分布式数据
使用调试器进行 SageMaker 分布式数据并行训练作业的有效性范围深度学习框架 TensorFlow 2.x TensorFlow 2.x 与克拉斯 PyTorch 监控系统瓶颈 是 是 是 分析框架操作 没有 * 没有 ** 是 调试模型输出张量 是 是 是 * 调试器不支持 TensorFlow 2.x 的框架分析。
** SageMaker 分布式数据并行不支持使用 Keras 实现的 TensorFlow 2.x。
-
SageMaker 分布式模型并行— 调试器不支持 SageMaker 分布式模型并行训练。
-
使用 SageMaker 检查点进行分散— 启用分布式训练选项和 SageMaker 检查点时,调试器不能用于培训作业。您可能会看到如下所示的错误:
SMDebug Does Not Currently Support Distributed Training Jobs With Checkpointing Enabled
要将调试器用于具有分布式训练选项的训练作业,您需要禁用 SageMaker 检查点并将手动检查点功能添加到训练脚本中。有关在分布式训练选项和检查点中使用 Debugger 的更多信息,请参阅使用SageMaker与亚马逊并行分布式数据SageMaker调试程序和检查点和保存检查点.
-
参数服务器— 调试器不支持基于参数服务器的分布式训练。
-
分析分布式培训框架操作,例如
AllReduced
SageMaker 分布式数据并行运行Horovod 操作,不可用。
监控系统瓶颈和分析框架操作的注意事项
-
适用于AmazonTensorFlow,无法使用默认值收集数据加载器指标
local_path
的设置FrameworkProfile
类。必须手动配置路径并结束"/"
. 例如:FrameworkProfile(local_path="/opt/ml/output/profiler/")
-
适用于AmazonTensorFlow,在训练作业运行时,无法更新数据加载器性能分析配置。
-
适用于AmazonTensorFlow,
NoneType
在 TensorFlow 2.3 训练作业和详细分析选项中使用分析工具和笔记本示例时,可能会发生错误。 -
只有 Keras API 才支持 Python 分析和详细分析。
-
要访问 TensorFlow 和 PyTorch 的深度分析功能,目前您必须指定最新的Amazon使用 CUDA 11 进行深度学习容器映像。例如,您必须在 TensorFlow 和 PyTorch 估计器中指定特定的图像 URI,如下所示:
-
TensorFlow
image_uri = f"763104351884.dkr.ecr.{region}.amazonaws.com/tensorflow-training:2.3.1-gpu-py37-cu110-ubuntu18.04"
-
PyTorch
image_uri = f"763104351884.dkr.ecr.{region}.amazonaws.com/pytorch-training:1.6.0-gpu-py36-cu110-ubuntu18.04"
-
调试模型输出张量的注意事项
-
避免使用功能性 API 操作。调试器无法从由功能性 API 操作组成的 PyTorch 和 MxNet 训练脚本中收集模型输出张量。
-
调试器无法从
torch.nn.functional
API 操作。当你编写 PyTorch 训练脚本时,建议使用 torch.nn
而是模块。 -
调试器无法从混合模块中的 MxNet 功能对象收集模型输出张量。例如,ReLU 激活 (
F.relu
) 无法从以下示例中收集输出mxnet.gluon.HybridBlock
和 F
中的hybrid_forward
function.import mxnet as mx from mxnet.gluon import HybridBlock, nn class Model(HybridBlock): def __init__(self, **kwargs): super(Model, self).__init__(**kwargs) # use name_scope to give child Blocks appropriate names. with self.name_scope(): self.dense0 = nn.Dense(20) self.dense1 = nn.Dense(20) def hybrid_forward(self, F, x): x = F.relu(self.dense0(x)) return F.relu(self.dense1(x)) model = Model() model.initialize(ctx=mx.cpu(0)) model.hybridize() model(mx.nd.zeros((10, 10), ctx=mx.cpu(0)))
-