据 Hugging Face 博客 10 月 21 日发布的文章,该文以 AWS Trainium 及其开源 PyTorch 原生后端 TorchNeuron 为例,介绍如何系统分析推理性能、判断时间花在哪里。文章是 TorchNeuron 性能剖析系列的第一部分。

文章面向没有性能剖析经验的读者。作者在开头写道,许多机器学习从业者对如何让模型运行得更快有一定直觉,但较少有人知道如何分析模型为什么慢。TorchNeuron 支持在 Trainium 上运行标准 PyTorch 工作流,包括 eager 执行、torch.compile 和标准 PyTorch API,代码改动较少;它还与 Neuron Kernel Interface(NKI)集成,用于支持自定义算子和针对 Trainium 硬件的性能优化。

在进入剖析步骤前,文章解释了 Neuron 后端与 PyTorch 的集成方式。Neuron 后端使用 PyTorch 的 PrivateUse1 扩展点,使加速器无需新增类似 cuda 的专用 dispatch key 即可接入框架;torch_neuronx 包与上游 PyTorch 配合,将 Neuron 注册为 PyTorch 代码的原生后端。

剖析过程使用两个对象。NeuronConfig 控制采集哪些 Neuron 数据流和 NeuronCore,以及把输出写到何处,并作为 experimental_config 传给 torch.profiler.profile;NeuronProfiler 接收 NeuronConfig,提供 export_trace 回调,将框架 trace.json 与 Neuron 系统 trace 一起写出。其中,modes 参数选择要采集的数据流,例如设备指令和运行时 trace;capture_enabled_for_nc 指定要跟踪的 NeuronCore;将 correlate_device_time 设为 True 会把设备时间写入 key_averages() 表,便于比较 CPU 时间与 Neuron 设备时间。

文章还介绍了 Neuron Explorer。这是一个基于浏览器的查看器,可查看系统 trace、设备时间线和各引擎的拆分,用户可通过 SSH 隧道或 Visual Studio Code 扩展访问。剖析完成后,输出目录包含系统 trace;若采集了设备数据,还会包含成对的 .neff 与 .ntff 文件。Neuron 可执行文件格式(NEFF)保存编译后的 Neuron 可执行文件,匹配的 NTFF 保存其硬件指令 trace,两个文件以相同的数字哈希标识配对。查看系统或组合剖析时需上传完整输出目录,仅查看设备剖析时则分别上传匹配的 .neff 与 .ntff 文件。

首个分析对象是 RMSNorm。文章列出三种实现:用逐条 PyTorch 算子写成的朴素版本,依次执行乘法、求均值、加法、倒数平方根和乘法;调用 torch.rms_norm() 内置算子、下沉为单个融合 Neuron 内核的版本;以及用 torch.compile 编译同一组算子的版本。三份脚本使用相同的输入、剖析器配置和调度,结果可直接比较,复现代码放在 torch-neuronx 示例目录中。

文中给出的朴素实现先对输入张量求平方,沿最后一维求均值,加上 1e-6 后取倒数平方根,再乘回原张量与权重。每一行代码对应一个或多个 ATen 算子,并可能创建中间张量。文章随后演示如何调用剖析器;在已发布内容中,三种实现的具体剖析数据和耗时对比尚未展开。