使用 IT 工具和跟踪技术(ITT)API 进行 PyTorch 工作负载分析 ¶
创建时间:2025 年 4 月 1 日 | 最后更新时间:2025 年 4 月 1 日 | 最后验证:未验证
在本菜谱中,您将学习:
什么是 Intel® VTune™分析器?
什么是仪器和跟踪技术(ITT)API
如何在 Intel® VTune™ Profiler 中可视化 PyTorch 模型层次结构
展示如何使用 PyTorch ITT API 的简短示例代码
需求
PyTorch 1.13 或更高版本
Intel® VTune™ Profiler
PyTorch 的安装说明可在 pytorch.org 找到。
什么是英特尔® VTune™ 分析器 ¶
Intel® VTune™分析器是一款用于串行和多线程应用程序的性能分析工具。对于熟悉英特尔架构的用户,Intel® VTune™分析器提供了一套丰富的指标,帮助用户了解应用程序在英特尔平台上的执行情况,从而了解性能瓶颈所在。
更多详细信息,包括入门指南,可在英特尔网站上找到。
什么是 IT 工具和跟踪技术(ITT)API ¶
Intel® VTune™ Profiler 提供的仪器和跟踪技术 API(ITT API)允许目标应用程序在执行期间生成和控制跟踪数据的收集。
ITT 功能的优点是在 Intel® VTune™ Profiler GUI 上标记单个 PyTorch 操作符的时间跨度以及自定义区域。当用户发现任何异常情况时,这将非常有帮助,可以定位哪个操作符的行为异常。
备注
ITT API 已从 PyTorch 1.13 版本开始集成。用户不需要调用原始的 ITT C/C++ API,只需调用 PyTorch 中的 Python API 即可。更详细的信息可以在 PyTorch 文档中找到。
如何在 Intel® VTune™ Profiler 中可视化 PyTorch 模型层次结构 ¶
PyTorch 提供了两种使用方式:
隐式调用:默认情况下,所有通过 PyTorch 操作注册机制注册的操作,当启用其功能时,将自动通过 ITT 功能进行标记。
显式调用:如果需要自定义标记,用户可以使用 PyTorch 文档中提到的 API 显式地标记所需范围。
要启用显式调用,预期需要标记的代码应在 torch.autograd.profiler.emit_itt()作用域下调用。例如:
with torch.autograd.profiler.emit_itt():
<code-to-be-profiled...>
启动 Intel® VTune™ Profiler ¶
要验证功能,您需要启动一个 Intel® VTune™ Profiler 实例。请查阅 Intel® VTune™ Profiler 用户指南以获取启动 Intel® VTune™ Profiler 的步骤。
备注
用户还可以通过遵循 Intel® VTune™ Profiler Web Server UI 指南使用 web-server-ui:vtune-backend –web-port=8080 –allow-remote-access –enable-server-profiling
当您启动 Intel® VTune™ Profiler 图形用户界面后,您应该看到以下用户界面:
在左侧导航栏下的样本(矩阵)项目中提供了三个示例结果。如果您不希望在默认的样本项目中显示分析结果,您可以通过蓝色“配置分析…”按钮下的“新建项目…”按钮创建一个新项目。要开始新的分析,请点击蓝色“配置分析…”按钮以启动配置过程。
配置 CPU 分析设置 ¶
点击“配置分析…”按钮后,您应该看到以下屏幕:
窗口的右侧分为 3 部分:WHERE(左上角)、WHAT(左下角)和 HOW(右)。WHERE 部分可以指定运行分析的目标机器。WITH WHAT 部分可以设置要分析的应用程序路径。要分析 PyTorch 脚本,建议将所有手动步骤,包括激活 Python 环境和设置所需环境变量,封装到一个 bash 脚本中,然后分析这个 bash 脚本。在上面的截图中,我们将所有步骤封装到了 launch.sh bash 脚本中,并使用参数来分析 bash 脚本。在右侧的 HOW 部分,你可以选择你想要分析的类型。Intel® VTune™ Profiler 提供了一系列可供选择的分析类型。详细信息请参考 Intel® VTune™ Profiler 用户指南。
读取性能分析结果 ¶
通过与 ITT 的成功分析,您可以在分析结果中的平台选项卡中查看 Intel® VTune™ Profiler 时间线中的标签。
时间线显示主线程位于顶部,下面是单独的 OpenMP 线程。主线程行中显示了标记的 PyTorch 操作符和自定义区域。所有以 aten::开头的操作符都是 PyTorch 中由 ITT 功能隐式标记的操作符。iteration_N 标签是使用特定的 API torch.profiler.itt.range_push()、torch.profiler.itt.range_pop()或 torch.profiler.itt.range()作用域显式标记的。请参阅下一节的示例代码以获取详细信息。
备注
标记为卷积和重排的红框来自 Intel® oneAPI 深度神经网络库(oneDNN)。
如右侧导航栏所示,时间线行中的棕色部分显示单个线程的 CPU 使用情况。在时间戳处,线程行高度中棕色部分所占的百分比与该时间戳处该线程的 CPU 使用情况相一致。因此,从这个时间线中可以直观地理解以下内容:
每个线程上 CPU 核心的利用率如何。
所有线程上 CPU 核心的利用率是否平衡。所有线程的 CPU 利用率是否良好?
OpenMP 线程的同步情况如何。启动 OpenMP 线程或 OpenMP 线程结束时是否有抖动?
当然,Intel® VTune™ Profiler 提供了更多丰富的性能分析功能集,以帮助您理解性能问题。当您了解性能问题的根本原因时,您可以修复它。更详细的用法说明请参阅 Intel® VTune™ Profiler 用户指南。
展示如何使用 PyTorch ITT API 的简短示例代码 ¶
下面的示例代码是用于上述截图中进行性能分析的脚本。
该拓扑由两个操作符组成,分别是 Conv2d 和 Linear。进行了三次推理迭代。每次迭代都通过 PyTorch ITT API 以文本字符串形式标记为 iteration_N。要么是 torch.profile.itt.range_push 和 torch.profile.itt.range_pop,要么是 torch.profile.itt.range scope 执行了自定义标记功能。
# sample.py
import torch
import torch.nn as nn
class ITTSample(nn.Module):
def __init__(self):
super(ITTSample, self).__init__()
self.conv = nn.Conv2d(3, 5, 3)
self.linear = nn.Linear(292820, 1000)
def forward(self, x):
x = self.conv(x)
x = x.view(x.shape[0], -1)
x = self.linear(x)
return x
def main():
m = ITTSample
# unmark below code for XPU
# m = m.to("xpu")
x = torch.rand(10, 3, 244, 244)
# unmark below code for XPU
# x = x.to("xpu")
with torch.autograd.profiler.emit_itt():
for i in range(3)
# Labeling a region with pair of range_push and range_pop
#torch.profiler.itt.range_push(f'iteration_{i}')
#m(x)
#torch.profiler.itt.range_pop()
# Labeling a region with range scope
with torch.profiler.itt.range(f'iteration_{i}'):
m(x)
if __name__ == '__main__':
main()
如 Intel® VTune™ Profiler GUI 截图中所提到的 launch.sh bash 脚本,用于封装所有手动步骤,如下所示。
# launch.sh
#!/bin/bash
# Retrieve the directory path where the path contains both the sample.py and launch.sh so that this bash script can be invoked from any directory
BASEFOLDER=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
<Activate a Python environment>
cd ${BASEFOLDER}
python sample.py