在本篇博客中,我们将分享我们如何实现在**无需任何用户端代码插桩**的情况下,收集和分析 PyTorch Profiler 针对训练工作负载的跟踪。我们利用 Dynolog(一个用于 CPU 和 GPU 遥测的开源守护程序)来收集 PyTorch Profiler 跟踪,并使用 Holistic Trace Analysis(一个用于分析 PyTorch Profiler 跟踪的开源库)来分析收集到的跟踪。这套工具链使得 Meta 的工程师们能够加速其性能优化工作流程。我们解决方案的关键是在 PyTorch 的基础 Optimizer 类中实现了前置和后置钩子。我们通过一个短视频演示了如何使用 Dynolog 收集 PyTorch 跟踪。
问题
Meta 的软件开发人员每天运行大量的分布式训练。为了确保 GPU 得到有效利用,有必要测量和分析所有作业的 GPU 性能。此外,开发人员需要具备自省模型的能力,并了解 CPU 和 GPU 如何交互以调试性能问题。开发人员最初使用少量 GPU 构建原型,生产版本则扩展到数百或数千个 GPU,服务于生成式 AI、推荐系统、广告排名等众多业务用例。
考虑到 Meta 的规模,有必要拥有低开销且相互无缝协作的性能测量和监控工具链,以保持较高的开发人员效率。
在本篇博客中,我们将描述我们如何使用 PyTorch Profiler、Dynolog(一个遥测守护程序)和 Holistic Trace Analysis(一个性能调试库)在不进行任何用户端代码插桩的情况下收集跟踪,并分析这些跟踪以识别 GPU 利用率低的作业。
解决方案
下图概述了工具链如何协同工作。
- 用户启动一个 PyTorch 应用程序。
- 训练服务或用户通过 Dynolog CLI 触发一个剖析会话,该会话通过网络向 Dynolog 守护进程发送请求。
- Dynolog 守护进程将剖析配置转发给 PyTorch 应用程序,使其暂时进入剖析模式。
- PyTorch Profiler 收集跟踪并将其存储到数据库(例如,网络文件系统或 S3 存储桶)。
- 然后使用 Holistic Trace Analysis (HTA) 分析收集到的跟踪。

图 1:Dynolog、PyTorch Profiler 和 HTA 工具链工作流程
让我们深入了解每个组件。
Dynolog
Dynolog 是一个用于异构 CPU-GPU 系统的轻量级监控守护程序。它支持持续监控 CPU(利用率、网络带宽、每秒指令数)和 GPU(SM 占用率、DRAM 带宽、GPU 功耗)的性能指标。此外,Dynolog 还导出 API 以收集可通过 dyno CLI 访问的深度剖析数据。
Dynolog 提供的一个主要集成是与 PyTorch Profiler 的接口。这使得可以使用单个命令按需远程跟踪数千台服务器。这可以通过使用 dyno gputrace
命令来实现。
PyTorch Profiler
GPU 内核异步执行,需要 GPU 侧支持才能创建跟踪。NVIDIA 通过 CUPTI 库提供这种可见性。Kineto 是 Profiler 中与 CUPTI 接口的子系统。PyTorch Profiler 利用 Kineto 库来收集 GPU 跟踪。为了**在不进行任何用户端代码插桩**的情况下实现训练工作负载的自动化大规模分析,我们对 PyTorch 进行了几项根本性更改。这些更改使得无需用户干预即可收集跟踪。
- 注册:** **首先,我们修改了 PyTorch,使其在启动时向 Dynolog 守护程序注册。此功能通过设置环境变量 KINETO_USE_DAEMON=True 来启用。设置此环境变量为 True 后,PyTorch Profiler 会定期轮询 Dynolog 以检查按需跟踪请求。
- 迭代钩子:然后,我们为基础 Optimizer 类实现了前置和后置钩子。这使我们能够标注训练迭代的开始/结束。Profiler 随后能够感知迭代次数,并可以安全地在跟踪中捕获固定数量的迭代。
整体跟踪分析 (HTA)
机器学习研究人员和工程师常常因为不了解其工作负载中的性能瓶颈而难以在计算上扩展其模型。大型分布式训练作业可能会生成数千个跟踪,其中包含太多数据,无法人工检查。这就是 Holistic Trace Analysis 发挥作用的地方。HTA 是一个用于性能分析的开源库——它以 PyTorch Profiler 跟踪作为输入,并提升其中包含的性能信息。其目标是帮助研究人员和工程师从硬件堆栈中获得最佳性能。为了帮助性能调试,HTA 提供了以下功能(部分列表):
- 时间分解:将 GPU 时间分解为单节点和所有排名上计算、通信、内存事件和空闲时间所花费的时间。
- 空闲时间分解:将 GPU 空闲时间分解为等待主机、等待另一个内核或归因于未知原因。
- 内核分解:查找每个排名上持续时间最长的内核。
- 内核持续时间分布:最长内核在不同排名上的平均时间分布。
- 通信计算重叠:计算通信与计算重叠的时间百分比。
我们诚挚邀请您查看这些 Jupyter notebooks,了解 HTA 能为您做什么。如果您是首次用户,我们建议从 trace_analysis_demo notebook 开始。
总而言之,Dynolog 允许我们以可扩展的方式动态收集 PyTorch Profiler 跟踪。此外,通过利用 HTA,我们可以自动化性能分析并识别瓶颈。在 Meta,我们使用 Dynolog、PyTorch Profiler 和 HTA 工具链来加速我们的性能优化工作流程。
演示
我们分享了一个截屏视频,展示了一个 PyTorch 玩具程序在没有用户端代码插桩的情况下收集跟踪的过程。演示在 Docker 容器中运行,跟踪收集由 Dynolog 触发。HTA 可用于后续分析收集到的跟踪。
常见问题
问:dyno gputrace
还能为我做什么?
dyno gputrace
命令支持多种自定义 PyTorch Profiler 选项:
- 捕获 Python 堆栈
- 内存剖析
- 记录输入形状
请运行 dyno gputrace --help
查看所有选项。
问:Dynolog 会收集硬件性能指标吗?
Dynolog 也可用于始终在线监控:
- 它使用 DCGM 为 NVIDIA GPU 集成了开箱即用的 GPU 性能监控。
- Dynolog 提供基本的 Linux 内核性能指标,包括 CPU、网络和 IO 资源使用情况。
- Dynolog 管理 Intel 和 AMD CPU 上与 CPU 缓存、TLB 等微架构特定事件相关的硬件性能计数器。
问:如何构建演示中使用的 Docker 镜像?
Dockerfile 可在此处获取:here。使用以下命令构建 Docker 镜像。
docker build -f /path/to/dynolog_repo/dynolog_hta.dockerfile -t <image_name:tag> .
问:我该如何运行 Docker 镜像?
您可以参考这份备忘单来运行 Docker 镜像。