亚马逊AWS官方博客
新增功能 – 使用 Amazon SageMaker Debugger 分析您的机器学习训练作业
今天,我非常高兴地宣布, Amazon SageMaker Debugger 现在可以分析机器学习模型,从而可以更轻松地识别和修复硬件资源使用导致的训练问题。
尽管机器学习 (ML) 在各种业务问题上的表现都很出色,但它仍然是一个有点神秘的话题。把事情做好要靠科学、技艺(也有人说是魔法)的魔力,有时候还要些运气。特别是模型训练,它是一个复杂的过程,其结果取决于数据集的质量、算法、参数以及您训练所在的基础设施。
随着机器学习模型变得越来越大、越来越复杂(说你呢,深度学习),训练它们所需的基础设施量成为日益严重的问题。例如,在单个 p3dn.24xlarge 实例中的公开可用的 COCO 数据集上训练 BERT 需要花费六小时以上,即使使用它的八个 NVIDIA V100 GPU 也是如此。自动驾驶汽车公司之类的客户要处理更大的数据集,并且要对对象检测模型进行多天的训练。
当一项复杂的训练作业花费这么长的时间时,出现问题并被破坏的几率非常高,这不仅浪费时间和金钱,还会造成很多挫折。当您进行调查、找出根本原因、尝试修复问题,然后再次运行训练作业时,重要的工作需要先搁置一旁。通常,您必须迭代很多次才能解决问题。
根据您使用的机器学习框架(有时根据其版本),您或许可以使用现有的框架特定工具,或者不可以使用该工具。通常,您必须构建并维护自己的定制工具。即使对于经验丰富的从业者来说,这也是很艰苦的工作。对于像我这样的普通开发者来说,这是一项非常艰巨的任务。
在 Amazon SageMaker Debugger 中引入模型分析
去年在 AWS re:Invent 推出的 Amazon SageMaker Debugger 是 Amazon SageMaker 的一项功能,该功能可自动识别 ML 训练作业中产生的复杂问题。其中包括损失不减少、分解梯度等。
现在,SageMaker Debugger 还可以监控硬件资源使用量,并允许您对训练作业进行分析,以帮助您将资源使用量与训练脚本中的 ML 操作关联起来。因此,您将能够更快地解决性能问题,并更快地迭代完成训练作业。
Chaim Rand 是 Mobileye(一家构建自动驾驶和驾驶员辅助系统的 Intel 公司)的机器学习算法开发者,他已利用使用新分析功能的机会,下面是他向我们提供的反馈:“我们在 Mobileye 开发的很多辅助驾驶和自动驾驶车辆技术都依赖于训练深度神经网络模型来探测各种各样的道路构件,包括车辆、行人、减速带、路标等。通常,这些模型在极大的数据集、多台计算机上进行训练,且训练时间长达数天。我们认为,Mobileye 必须拥有一套高级性能分析功能工具包,用于分析网络、CPU 和 GPU 资源中的数据流,并查明性能问题。SageMaker Debugger 中的分析功能正好提供了这一点,它将性能分析从少数专家的领域中脱离出来,并使我们的算法开发人员能够最大限度地提高训练资源利用率、加速模型融合并降低成本。”
SageMaker Debugger 的新分析功能在推出时可用于 TensorFlow 2.x 和 PyTorch 1.x。您只需要在 Amazon SageMaker 中使用相应的内置框架进行训练。分布式训练支持开箱即用。
您只需在 SageMaker 估算器中设置一个参数,且无需对您的训练代码进行任何更改即可启用基础设施和以下之类的模型指标的收集:
- CPU 和 GPU,
- RAM 和 GPU RAM,
- 网络 I/O,
- 存储 I/O(本地存储和 Pipe 模式),
- Python 指标,
- 数据加载时间,
- ML 操作人员在 CPU 和 GPU 上运行所花的时间,
- Horovod 的分布式训练指标,
- 等等。
此外,您还可以可视化显示不同阶段(例如预处理、训练循环和后处理)所花费的时间。如果需要,您可以深入了解每个训练时代,甚至可以深入了解训练脚本中的每个函数。
默认情况下,每 500 毫秒收集一次指标,您还可以将此值设置为 100ms、200ms、1s、5s 和 1min。对于更精细化的分析,您还可以在训练代码中显式启用和禁用分析,以仅捕获特定部件的指标。
在训练作业运行期间,您可以在 Amazon SageMaker Studio 中轻松可视化这些指标,该服务是我们基于 Web 的机器学习集成开发环境。正如您所期望的那样,所有数据还可以通过 SageMaker Debugger API 提供,且您可以检索它来构建自己的图表。
Amazon SageMaker 处理与训练作业并行运行,可分析捕获的数据、构建图表并生成提供潜在问题见解的报告。这不需要您做任何工作,因为此分析在完全托管的基础设施的内置容器内运行。
现在,让我们使用 PyTorch 运行一个演示,在这个演示中,我们将在 CIFAR-10 数据集上分析 ResNet-50 图像分类模型训练。
使用 Amazon SageMaker Debugger 分析训练作业
在训练作业中启用分析所需的只是 SageMaker 估算器中的一个额外参数。您无需在训练代码中更改行。默认情况下,SageMaker Debugger 使用一组内置的分析规则来寻找训练期间可能会产生的不必要条件,例如较低的 GPU 利用。除了报告这些情况之外,SageMaker Debugger 还会在 CloudWatch Events 中触发事件。例如,我可以使用它们运行自动停止低效训练作业的 AWS Lambda 函数。
首先,我创建一个分析配置,以便每 500 毫秒捕获一次数据。或者,如果我只想分析作业的特定部分,我可以选择训练步骤间隔。
import sagemaker
from sagemaker.profiler import ProfilerConfig
profiler_config = ProfilerConfig(profiling_interval_millis=500)
然后,我将此配置传递到我的 PyTorch 估算器
中,以在配备有 4 个 NVIDIA V100 GPU 的 ml.p3.8xlarge 实例上进行训练。
from sagemaker.pytorch import PyTorch
estimator = PyTorch(
role=sagemaker.get_execution_role(),
instance_count=1,
instance_type='ml.p3.8xlarge',
entry_point='train_pt.py',
framework_version='1.5.0',
hyperparameters={"batch_size":512, "epochs":10},
profiler_config=profiler_config)
然后,我像往常一样启动训练作业。作业一旦运行后,即会捕获分析数据并将数据存储在 S3 中。
path = estimator.latest_job_profiler_artifacts_path()
print(path)
s3://sagemaker-us-east-2-123456789012/pt-train-pt-2020-11-17-17-38-43-231/profiler-output
使用 SageMaker 开发工具包,我可以检索并对分析事件进行计数。
from smdebug.profiler.system_metrics_reader import S3SystemMetricsReader
system_metrics_reader = S3SystemMetricsReader(path)
system_metrics_reader.refresh_event_file_list()
last_timestamp = system_metrics_reader.get_timestamp_of_latest_available_file()
events = system_metrics_reader.get_events(0, last_timestamp)
print("Found", len(events), "recorded system metric events.Latest recorded event:", last_timestamp)
Found 411853 recorded system metric events.Latest recorded event: 1605620280000000
当然,我可以解析和分析这些分析事件,构建自己的图表等。相反,让我们在 SageMaker Studio 中近乎实时地可视化显示它们。
当我的训练作业仍在运行时,我在 SageMaker Studio 中查找作业并右键点击“Open Debugger for insights”(打开 Debugger 以获取见解)。
这将打开一个新选项卡,我选择“Nodes”(节点)面板,在该面板中,我可以查看训练作业中每个实例的详细信息统计情况。那么,我的训练作业表现如何? 请随时点击下面的图片进行放大。
显然,此作业运行的不太顺利。GPU 利用率和 GPU 内存利用率极其稳定,保持在 10% 左右。我肯定没有足够努力地推动我的多 GPU 实例。也许 GPU 不能足够快地接收数据,因为 CPU 跟不上? 让我们来检查系统利用率热图。
CPU 在这里休息了一下,几乎从未超过 20% 的使用率。这个实例肯定不够忙。我可以做些什么来解决这个问题吗?
切换到“Overview”(概览)面板,我看到一些内置的分析规则已触发。
LowGPUUtilization
证实了我在上面的图表中看到的内容。BatchSize
非常有趣,因为它建议通过训练 CPU 上运行的脚本来增加发送到 GPU 中的小批次大小。这绝对有助于填充 GPU 内存、使更多 GPU 内核投入工作、加快我的训练作业并提高基础设施使用率。
此时,我应该决定停止效率低下的训练作业,并以更大的批次大小重新启动它。在这里,我将让它运行到完成,以向您展示与您的训练作业并行运行的 SageMaker 处理作业所生成的报告。
训练作业完成后,我可以在“Overview”(概览)面板中看到其摘要。
点击“Download report”(下载报告)按钮,我会得到一份非常详细的报告,其中包括其他指标,例如训练作业的不同阶段之间的比率,或正推与逆推之比。
我还可以看到最耗时的 CPU 和 GPU 运算符的相关信息,这一点在我想优化我的代码时非常重要。例如,下图向我显示,训练作业中最耗时的 GPU 操作是逆推卷积运算符。
报告中还有更多可阅读的内容(规则摘要、训练循环分析等)。此外,还可以使用配套笔记本来了解图表是如何构建的,以及如何根据自己的需求定制图表。
入门
我们刚刚只触及到皮毛,Amazon SageMaker Debugger 中还有更多的功能,可让您轻松收集、分析和可视化显示模型分析信息。您可以立即在已推出 Amazon SageMaker 的所有区域中开始使用它。对于任何用于运行内置分析规则的计算,都不会向您收费。
您会在 Github 上发现示例笔记本,您可以试用一下它们,并将您的想法告诉我们。我们始终期待您的反馈,您可通过一贯的 AWS Support 联系人向我们提供反馈,也可在针对 SageMaker 在 AWS 论坛上提供反馈。