使用 Amazon SageMaker 探查器分析 Amazon 计算资源上的活动 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Amazon SageMaker 探查器分析 Amazon 计算资源上的活动

Amazon SageMaker 探查器目前为预览版,并已在支持的 Amazon Web Services 区域中免费提供。Amazon SageMaker 探查器的正式发布版本(如果有)的所含功能和定价与预览版的所含功能和定价可能不同。

Amazon SageMaker 探查器是 Amazon SageMaker 的一项功能,它详细地说明了在 SageMaker 上训练深度学习模型期间预置的 Amazon 计算资源。它侧重于分析 CPU 和 GPU 使用率、GPU 上的内核运行、CPU 上的内核启动、同步操作、CPU 和 GPU 之间的内存操作、内核启动和相应运行之间的延迟,以及 CPU 和 GPU 之间的数据传输。SageMaker 探查器还提供可视化配置文件的用户界面 (UI)、已分析事件的统计摘要以及用于跟踪和理解 GPU 和 CPU 之间事件的时间关系的训练作业时间表。

注意

SageMaker 探查器支持 PyTorch 和 TensorFlow,并且在适用于 SageMaker 的 Amazon 深度学习容器中可用。要了解更多信息,请参阅支持的框架、Amazon Web Services 区域和实例类型

对于数据科学家

在大型计算集群上训练深度学习模型通常会遇到计算优化问题,例如瓶颈、内核启动延迟、内存限制和资源利用率低。

要确定此类计算性能问题,您需要更深入地分析计算资源,了解哪些内核会带来延迟,哪些操作会导致瓶颈。数据科学家可以从使用 SageMaker 探查器 UI 来可视化训练作业的详细配置文件中受益。UI 提供了一个带摘要图表的控制面板和一个时间线界面,以便跟踪计算资源上的每个事件。数据科学家还可以使用 SageMaker 探查器 Python 模块来添加自定义注释以跟踪训练作业的特定部分。

对于管理员

如果您是 Amazon 账户或 SageMaker 域的管理员,则可以通过 SageMaker 控制台中的探查器登录页面或 SageMaker 域管理探查器应用程序用户。每个域用户均能使用授予的权限访问其探查器应用程序。作为 SageMaker 域管理员和域用户,您可以使用相应级别的权限创建和删除探查器应用程序。

支持的框架、Amazon Web Services 区域和实例类型

此功能支持以下机器学习框架和 Amazon Web Services 区域。

注意

要使用此功能,请确保至少已安装 2.180.0 版的 SageMaker Python SDK。

支持的框架

SageMaker 探查器在以下适用于 SageMaker 的 Amazon 深度学习容器中可用。

PyTorch

PyTorch 版本 Amazon DLC 映像 URI
2.0.0 763104351884.dkr.ecr.<区域>.amazonaws.com/pytorch-training:2.0.0-gpu-py310-cu118-ubuntu20.04-sagemaker
1.13.1 763104351884.dkr.ecr.<区域>.amazonaws.com/pytorch-training:1.13.1-gpu-py39-cu117-ubuntu20.04-sagemaker

TensorFlow

TensorFlow 版本 Amazon DLC 映像 URI
2.12.0

763104351884.dkr.ecr.<区域>.amazonaws.com/tensorflow-training:2.12.0-gpu-py310-cu118-ubuntu20.04-sagemaker

2.11.0 763104351884.dkr.ecr.<区域>.amazonaws.com/tensorflow-training:2.11.0-gpu-py39-cu112-ubuntu20.04-sagemaker

支持 Amazon Web Services 区域

SageMaker 探查器在以下 Amazon Web Services 区域提供。

  • 美国东部(弗吉尼亚州北部)(us-east-1)

  • 美国东部(俄亥俄)(us-east-2)

  • 美国西部(俄勒冈州)(us-west-2)

  • 欧洲地区(法兰克福)(eu-central-1)

  • 欧洲地区(爱尔兰)(eu-west-1)

支持的实例类型

SageMaker 探查器适用于训练工作负载的以下实例类型。

  • ml.p4de.24xlarge

  • ml.p4d.24xlarge

  • ml.p3dn.24xlarge

  • ml.g4dn.12xlarge

先决条件

以下列表显示了开始使用 SageMaker 探查器的先决条件。

  • 在您的 Amazon 账户中使用 Amazon VPC 设置的 SageMaker 域。

    有关设置域的说明,请参阅使用快速设置功能登录 Amazon SageMaker 域。您还需要为单个用户添加域用户配置文件,以便访问探查器 UI 应用程序。有关更多信息,请参阅添加和删除 SageMaker 域用户配置文件

  • 以下列表显示了一组使用探查器 UI 应用程序的最低权限。

    • sagemaker:CreateApp

    • sagemaker:DeleteApp

    • sagemaker:DescribeTrainingJob

    • sagemaker:Search

    • s3:GetObject

    • s3:ListBucket

使用 SageMaker 探查器准备和运行训练作业

使用 SageMaker 探查器设置以运行训练作业包括两个步骤:调整训练脚本和配置 SageMaker 训练作业启动器。

步骤 1:使用 SageMaker 探查器 Python 模块调整训练脚本

要在训练作业运行时开始捕获 GPU 上内核运行,请使用 SageMaker 探查器 Python 模块修改训练脚本。导入库并添加 start_profiling()stop_profiling() 方法来定义分析的开始和结束。您还可以使用可选的自定义注释在训练脚本中添加标记,以便可视化每个步骤中的特定操作期间的硬件活动。

请注意,注释器会从 GPU 中提取操作。对于 CPU 中的分析操作,您无需添加任何其他注释。在指定分析配置(您将在步骤 2:创建 SageMaker 框架估算器并激活 SageMaker 探查器中使用此配置)时也将激活 CPU 分析。

注意

对整个训练作业进行分析并不能最有效地利用资源。我们建议对训练作业的最多 300 个步骤进行分析。

方法 1. 使用上下文管理器 smppy.annotate 为所有函数添加注释

您可以通过 smppy.annotate() 上下文管理器包装所有函数。如果您想按函数而不是代码行进行分析,建议使用此包装器。以下示例脚本说明如何实施上下文管理器,以便在每次迭代中包装训练循环和完整函数。

import smppy SMProf = smppy.SMProfiler.instance() config = smppy.Config() config.profiler = { "EnableCuda": "1", } SMProf.configure(config) SMProf.start_profiling() for epoch in range(args.epochs): if world_size > 1: sampler.set_epoch(epoch) tstart = time.perf_counter() for i, data in enumerate(trainloader, 0): with smppy.annotate("step_"+str(i)): inputs, labels = data inputs = inputs.to("cuda", non_blocking=True) labels = labels.to("cuda", non_blocking=True) optimizer.zero_grad() with smppy.annotate("Forward"): outputs = net(inputs) with smppy.annotate("Loss"): loss = criterion(outputs, labels) with smppy.annotate("Backward"): loss.backward() with smppy.annotate("Optimizer"): optimizer.step() SMProf.stop_profiling()

方法 2. 使用 smppy.annotation_begin()smppy.annotation_end() 为函数中的特定代码行添加注释

您还可以定义注释来分析特定的代码行。可以在单个代码行级别而不是按函数来设置分析的确切起始点和结束点。例如,在以下脚本中,step_annotator 会在每次迭代开始时被定义,并在迭代结束时终止。同时,还为每个操作定义了其他详细注释器,并在每次迭代中包装目标操作。

import smppy SMProf = smppy.SMProfiler.instance() config = smppy.Config() config.profiler = { "EnableCuda": "1", } SMProf.configure(config) SMProf.start_profiling() for epoch in range(args.epochs): if world_size > 1: sampler.set_epoch(epoch) tstart = time.perf_counter() for i, data in enumerate(trainloader, 0): step_annotator = smppy.annotation_begin("step_" + str(i)) inputs, labels = data inputs = inputs.to("cuda", non_blocking=True) labels = labels.to("cuda", non_blocking=True) optimizer.zero_grad() forward_annotator = smppy.annotation_begin("Forward") outputs = net(inputs) smppy.annotation_end(forward_annotator) loss_annotator = smppy.annotation_begin("Loss") loss = criterion(outputs, labels) smppy.annotation_end(loss_annotator) backward_annotator = smppy.annotation_begin("Backward") loss.backward() smppy.annotation_end(backward_annotator) optimizer_annotator = smppy.annotation_begin("Optimizer") optimizer.step() smppy.annotation_end(optimizer_annotator) smppy.annotation_end(step_annotator) SMProf.stop_profiling()

在注释并设置探查器初始模块后,在接下来的步骤 2 中,使用 SageMaker 训练作业启动器保存脚本以进行提交。示例启动器假定训练脚本已命名为 train_with_profiler_demo.py

步骤 2:创建 SageMaker 框架估算器并激活 SageMaker 探查器

以下过程说明如何使用 SageMaker Python SDK 准备 SageMaker 框架估算器以进行训练。

  1. 使用 ProfilerConfigProfiler 模块设置 profiler_config 对象,如下所示。

    from sagemaker import ProfilerConfig, Profiler profiler_config = ProfilerConfig( profile_params = Profiler(cpu_profiling_duration=3600) )

    以下是 Profiler 模块及其参数的描述。

    • Profiler:用于在训练作业中激活 SageMaker 探查器的模块。

      • cpu_profiling_duration (int):指定在 CPU 上进行分析的持续时间(以秒为单位)。默认为 3600 秒。

  2. 使用在上一个步骤中创建的 profiler_config 对象创建 SageMaker 估算器。以下代码显示了一个创建 PyTorch 估算器的示例。如果要创建 TensorFlow 估算器,请改为导入 sagemaker.tensorflow.TensorFlow,然后指定 SageMaker 探查器支持的某个 TensorFlow 版本。有关支持的框架和实例类型的更多信息,请参阅支持的框架

    import sagemaker from sagemaker.pytorch import PyTorch estimator = PyTorch( framework_version="2.0.0", role=sagemaker.get_execution_role(), entry_point="train_with_profiler_demo.py", # your training job entry point source_dir=source_dir, # source dir for your training script output_path=output_path, base_job_name="sagemaker-profiler-demo", hyperparameters=hyperparameters, # if any instance_count=1, # Recommended to test with < 8 instance_type=ml.p4d.24xlarge, profiler_config=profiler_config )
  3. 通过运行 fit 方法开始训练作业。利用 wait=False,您可以将训练作业日志设为静音,并让它在后台运行。

    estimator.fit(wait=False)

在运行训练作业时或作业完成后,您可以转到 打开 SageMaker 探查器 UI 应用程序 上的下一个主题,并开始探究和可视化已保存的配置文件。

如果您想直接访问保存在 Amazon S3 存储桶中的配置文件数据,请使用以下脚本来检索 S3 URI。

import os # This is an ad-hoc function to get the S3 URI # to where the profile output data is saved def get_detailed_profiler_output_uri(estimator): config_name = None for processing in estimator.profiler_rule_configs: params = processing.get("RuleParameters", dict()) rule = config_name = params.get("rule_to_invoke", "") if rule == "DetailedProfilerProcessing": config_name = processing.get("RuleConfigurationName") break return os.path.join( estimator.output_path, estimator.latest_training_job.name, "rule-output", config_name, ) print( f"Profiler output S3 bucket: ", get_detailed_profiler_output_uri(estimator) )

打开 SageMaker 探查器 UI 应用程序

您可以通过 SageMaker 控制台中的 SageMaker 探查器登录页面或通过 SageMaker 域访问 SageMaker 探查器 UI 应用程序。

选项 1:从域详细信息页面启动 SageMaker 探查器 UI

导航到域详细信息页面

以下过程展示如何导航到域详细信息页面。

  1. 通过 https://console.aws.amazon.com/sagemaker/ 打开 Amazon SageMaker 控制台。

  2. 在左侧导航窗格上,选择

  3. 从域列表中,选择要在其中启动 SageMaker 探查器应用程序的域。

启动 SageMaker 探查器 UI 应用程序

以下过程说明如何启动作用域为用户配置文件的 SageMaker 探查器应用程序。

  1. 在域详细信息页面上,选择用户配置文件选项卡。

  2. 确定要为其启动 SageMaker 探查器 UI 应用程序的用户配置文件。

  3. 为选定的用户配置文件选择启动,然后选择探查器

选项 2:从 SageMaker 控制台的 SageMaker 探查器登录页面启动 SageMaker 探查器 UI 应用程序

以下过程介绍如何从 SageMaker 探查器登录页面启动 SageMaker 探查器 UI 应用程序。

  1. 通过 https://console.aws.amazon.com/sagemaker/ 打开 Amazon SageMaker 控制台。

  2. 在左侧导航窗格中,选择探查器

  3. 开始使用下,选择要在其中启动 Studio 应用程序的域。如果您的用户配置文件仅属于一个域,则看不到用于选择域的选项。

  4. 选择要为其启动 SageMaker 探查器 UI 应用程序的用户配置文件。如果域中没有用户配置文件,请选择创建用户配置文件。有关创建新的用户配置文件的更多信息,请参阅添加和删除用户配置文件

  5. 选择打开探查器

浏览在 SageMaker 探查器 UI 中可视化的配置文件输出数据

此部分介绍了 SageMaker 探查器 UI,并提供了有关如何使用此 UI 并从中获得洞察的提示。

加载配置文件

在打开 SageMaker 探查器 UI 时,加载配置文件页面将打开。要加载和生成控制面板时间线,请执行以下过程。

加载训练作业的配置文件
  1. 训练作业列表部分中,使用复选框选择要为其加载配置文件的训练作业。

  2. 选择 Load(加载)。作业名称应显示在顶部的已加载配置文件部分中。

  3. 选择作业名称左侧的单选按钮以生成控制面板时间线。请注意,当您选择单选按钮时,UI 会自动打开控制面板。另请注意,如果您在作业状态和加载状态似乎仍在进行时生成可视化项,则 SageMaker 探查器 UI 会生成控制面板图和时间线,涵盖从正在进行的训练作业中收集的最新配置文件数据或部分加载的配置文件数据。

提示

您一次可以加载和可视化一个配置文件。要加载其他配置文件,必须先卸载之前加载的配置文件。要卸载配置文件,请使用已加载配置文件部分中配置文件右端的垃圾桶图标。


                    SageMaker 探查器 UI 中的加载配置文件页面的屏幕截图

控制面板

加载并选择训练作业后,UI 会打开控制面板页面,此页面默认包含以下面板。

  • GPU 活动时间 – 此饼图显示了 GPU 活动时间与 GPU 空闲时间的百分比。在整个训练作业中,您可以查看 GPU 的活动时间是否长于闲置时间。GPU 活动时间基于利用率大于 0% 的配置文件数据点,而 GPU 闲置时间是利用率为 0% 的已分析数据点。

  • 一段时间内的 GPU 利用率 – 此时间线图显示每个节点一段时间内的平均 GPU 利用率,并将所有节点聚合到一个图表中。您可以检查 GPU 在特定时间间隔内是否存在工作负载不平衡、利用率不足问题、瓶颈或闲置问题。要跟踪单个 GPU 级别的利用率和相关的内核运行,请使用时间线界面。请注意,GPU 活动集合从您在训练脚本中添加探查器 starter 函数 SMProf.start_profiling() 的位置开始,并在 SMProf.stop_profiling() 停止。

  • CPU 活动时间 – 此饼图显示了 CPU 活动时间与 CPU 空闲时间的百分比。在整个训练作业中,您可以查看 CPU 的活动时间是否长于闲置时间。CPU 活动时间基于利用率大于 0% 的配置文件数据点,而 CPU 闲置时间是利用率为 0% 的已分析数据点。

  • 一段时间内的 CPU 利用率 – 此时间线图显示每个节点一段时间内的平均 CPU 利用率,并将所有节点聚合到一个图表中。您可以检查 CPU 在某些时间间隔内是否处于瓶颈状态或未得到充分利用。要跟踪与单个 GPU 利用率和内核运行相一致的 CPU 利用率,请使用时间线界面。请注意,利用率指标从作业初始化开始。

  • 所有 GPU 内核花费的时间 – 此饼图显示了在整个训练作业中运行的所有 GPU 内核。默认情况下,它将前 15 个 GPU 内核显示为单个扇区,并在一个扇区内显示所有其他内核。将鼠标悬停在扇区上方可查看更多详细信息。该值显示 GPU 内核的总运行时间(以秒为单位),而百分比基于配置文件的整个时间。

  • 前 15 个 GPU 内核花费的时间 – 此饼图显示了在整个训练作业中运行的所有 GPU 内核。它将前 15 个 GPU 内核显示为单个扇区。将鼠标悬停在扇区上方可查看更多详细信息。该值显示 GPU 内核的总运行时间(以秒为单位),而百分比基于配置文件的整个时间。

  • 所有 GPU 内核的启动次数 – 此饼图显示了整个训练作业中每个 GPU 内核的启动次数。它将前 15 个 GPU 内核显示为单个扇区,并在一个扇区内显示所有其他内核。将鼠标悬停在扇区上方可查看更多详细信息。该值显示已启动的 GPU 内核的总数,而百分比基于所有内核的总数。

  • 前 15 个 GPU 内核的启动次数 – 此饼图显示了整个训练作业中每个 GPU 内核的启动次数。它显示了前 15 个 GPU 内核。将鼠标悬停在扇区上方可查看更多详细信息。该值显示已启动的 GPU 内核的总数,而百分比基于所有内核的总数。

  • 步进时间分布 – 此直方图显示 GPU 上的步进时间的分布。仅在训练脚本中添加步长注释器后才会生成此图。

  • 内核精度分布 – 此饼图显示了在不同数据类型(例如 FP32、FP16、INT32 和 INT8)中运行内核所花费的时间的百分比。

  • GPU 活动分布 – 此饼图显示了在 GPU 活动上花费的时间的百分比,例如运行内核、内存(memcpymemset)和同步 (sync)。

  • GPU 内存操作分布 – 此饼图显示了在 GPU 内存操作上花费的时间的百分比。这将可视化 memcopy 活动,并有助于确定您的训练作业是否在某些内存操作上花费了过多的时间。

  • 创建新的直方图 – 为在 步骤 1:使用 SageMaker 探查器 Python 模块调整训练脚本 期间手动注释的自定义指标创建新的直方图。在向新的直方图添加自定义注释时,请选择或键入您在训练脚本中添加的注释的名称。例如,在步骤 1 的演示训练脚本中,stepForwardBackwardOptimizeLoss 是自定义注释。在创建新的直方图时,这些注释名称将出现在指标选择的下拉菜单中。如果您选择 Backward,UI 会将整个分析时间内向后传递所花费时间的直方图添加到控制面板中。这种类型的直方图有助于检查是否有异常值占用了异常长的时间,从而导致瓶颈问题。

以下屏幕截图显示了 GPU 和 CPU 的活动时间比率以及相对于每个计算节点的时间的平均 GPU 和 CPU 利用率。


                    SageMaker 探查器 UI 中的控制面板页面的屏幕截图

以下屏幕截图显示了一个饼图示例,用于比较 GPU 内核的启动次数并测量运行它们所花费的时间。在所有 GPU 内核花费的时间面板和所有 GPU 内核的启动次数面板中,您还可以在输入字段中为 k 指定一个整数,调整要在图中显示的图例数。例如,如果您指定 10,则图将分别显示运行次数和启动次数排名前 10 的内核。


                    SageMaker 探查器 UI 中的控制面板页面的屏幕截图

以下屏幕截图显示了步长持续时间直方图的示例,以及内核精度分布、GPU 活动分布和 GPU 内存操作分布的饼图。


                    SageMaker 探查器 UI 中的控制面板页面的屏幕截图

时间线界面

要详细了解在 CPU 上调度并在 GPU 上运行的操作和内核级别的计算资源,请使用时间线界面。

您可以使用鼠标、[w, a, s, d] 键或键盘上的四个箭头键在时间线界面中进行放大和缩小以及向左或向右平移。

提示

有关与时间线界面交互的键盘快捷键的更多提示,请在左侧窗格中选择键盘快捷键

时间线轨迹采用树形结构,为您提供从主机级别到设备级别的信息。例如,如果您运行的每个 N 实例中都具有八个 GPU,则每个实例的时间线结构将如下所示。

  • algo-inode – 这是 SageMaker 标记的内容,用于将作业分配给预置的实例。数字 inode 是随机分配的。例如,如果您使用 4 个实例,则此部分将从 algo-1 扩展为 algo- 4

    • CPU – 在此部分中,您可以查看平均 CPU 利用率和性能计数器。

    • GPU – 在此部分中,您可以查看平均 GPU 利用率、各个 GPU 利用率和内核。

      • 总利用率 – 每个实例的平均 GPU 利用率。

      • HOST-0 PID-123 – 为每个进程轨迹分配的唯一名称。首字母缩略词 PID 是进程 ID,其后面附加的数字是在从进程中捕获数据期间记录的进程 ID 号。此部分显示了进程中的以下信息。

        • GPU-inum_gpu 利用率 – 第 inum_gpu 个 GPU 在一段时间内的利用率。

        • GPU-inum_gpu 设备 – 第 inum_gpu 个 GPU 设备上的内核运行。

          • stream icuda_stream – 显示 GPU 设备上的内核运行的 CUDA 流。要了解有关 CUDA 流的更多信息,请参阅 NVIDIA 提供的 CUDA C/C++ 流和并发上的 PDF 中的幻灯片。

        • GPU-inum_gpu 主机 – 内核在第 inum_gpu 个 GPU 主机上启动。

以下几张屏幕截图显示了 ml.p4d.24xlarge 实例上的训练作业运行的配置文件的时间线,每个实例都配有 8 个 NVIDIA A100 Tensor Core GPU。

以下是配置文件的缩小视图,其中列明了十几个步骤,包括 step_232step_233 之间的间歇性数据加载器,用于获取下一个数据批处理。


                    SageMaker 探查器 UI 中的时间线页面的屏幕截图,其中可视化了示例训练作业的配置文件。

对于每个 CPU,您可以跟踪 CPU 利用率和性能计数器,例如 "clk_unhalted_ref.tsc""itlb_misses.miss_causes_a_walk",它们表示 CPU 上的指令运行。

对于每个 GPU,您可以查看主机时间线和设备时间线。内核启动位于主机时间线上,内核运行位于设备时间线上。如果您已在 GPU 主机时间线的训练脚本中添加了注释(例如向前、向后和优化),则也将看到这些注释。

在时间线视图中,您还可以跟踪内核启动和运行对。这有助于您了解主机 (CPU) 上计划的内核启动如何在相应的 GPU 设备上运行。

提示

f 键可放大选定内核。

以下屏幕截图是上一个屏幕截图中的 step_233step_234 的放大视图。以下屏幕截图中选定的时间线间隔是在 GPU-0 设备上运行的 AllReduce 操作,它是分布式训练中必不可少的通信和同步步骤。在屏幕截图中,请注意,GPU-0 主机中的内核启动会连接到 GPU-0 设备流 1 中的内核运行,用青色箭头表示。


                    SageMaker 探查器 UI 中的时间线页面的屏幕截图

在选择时间线间隔时,UI 的底部窗格中还会显示两个信息选项卡,如上一个屏幕截图中所示。当前选择选项卡显示主机中的选定内核以及已连接的内核启动的详细信息。连接方向始终是从主机 (CPU) 到设备 (GPU),因为总是会从 CPU 调用每个 GPU 内核。连接选项卡显示选定的内核启动和运行对。您可以选择其中任一项来将其移动到时间线视图的中心。

以下屏幕截图进一步放大了 AllReduce 操作启动和运行对。


                    SageMaker 探查器 UI 中的时间线页面的屏幕截图

信息

信息中,您可以访问有关已加载的训练作业的信息,例如实例类型、为作业预置的计算资源的 Amazon 资源名称 (ARN)、节点名称和超参数。

设置

默认情况下,SageMaker 探查器 UI 应用程序实例配置为在闲置 2 小时后关闭。在设置中,使用以下设置来调整自动关闭计时器。

  • 启用应用程序自动关闭 – 选择并设置为启用,让应用程序在闲置时间超过指定小时数后自动关闭。要禁用自动关闭功能,请选择禁用

  • 自动关闭阈值(以小时为单位)– 如果您为启用应用程序自动关闭选择启用,则可以设置应用程序自动关闭的阈值时间(以小时为单位)。默认情况下,该选项设置为 2。

注意事项

在 SageMaker 探查器时,请考虑以下几点。