使用仪器和追踪技术(ITT)API分析PyTorch工作负载¶
创建于:2022年10月27日 | 最后更新:2024年10月24日 | 最后验证:未验证
在本教程中,您将学习:
什么是Intel® VTune™ Profiler
什么是仪器化和追踪技术(ITT)API
如何在Intel® VTune™ Profiler中可视化PyTorch模型层次结构
一个简短的示例代码,展示如何使用PyTorch ITT API
什么是Intel® VTune™ Profiler¶
Intel® VTune™ Profiler 是一个用于串行和多线程应用程序的性能分析工具。对于那些熟悉英特尔架构的人来说,Intel® VTune™ Profiler 提供了一套丰富的指标,帮助用户了解应用程序在英特尔平台上的执行情况,从而了解性能瓶颈所在。
更详细的信息,包括入门指南,可在Intel 网站上找到。
什么是仪器化和追踪技术(ITT)API¶
The Instrumentation and Tracing Technology API (ITT API) 由 Intel® VTune™ Profiler 提供,使目标应用程序能够在执行期间生成和控制跟踪数据的收集。
ITT功能的优势在于能够在Intel® VTune™ Profiler GUI上标记单个PyTorch操作符的时间跨度以及自定义区域。当用户发现任何异常时,这将非常有助于定位哪个操作符表现异常。
注意
ITT API 自 1.13 版本起已集成到 PyTorch 中。用户无需调用原始的 ITT C/C++ API,只需调用 PyTorch 中的 Python API。更多详细信息可在 PyTorch Docs 中找到。
如何在Intel® VTune™ Profiler中可视化PyTorch模型层次结构¶
PyTorch 提供了两种使用方式:
隐式调用:默认情况下,当ITT功能启用时,所有通过PyTorch操作符注册机制注册的操作符将自动被ITT功能标记。
显式调用:如果需要自定义标注,用户可以显式使用PyTorch Docs中提到的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 Guide来使用web-server-ui 例如:vtune-backend –web-port=8080 –allow-remote-access –enable-server-profiling
一旦你启动了Intel® VTune™ Profiler GUI,你应该会看到如下用户界面:
在左侧导航栏的sample (matrix)项目下有三个示例结果。如果您不希望分析结果出现在这个默认的示例项目中,您可以通过蓝色Configure Analysis…按钮下的New Project…按钮创建一个新项目。要开始新的分析,请点击蓝色的Configure Analysis…按钮以启动分析的配置。
配置CPU性能分析¶
一旦你点击了配置分析…按钮,你应该会看到下面的屏幕:
窗口的右侧分为三部分:WHERE(左上角)、WHAT(左下角)和HOW(右侧)。通过WHERE,您可以指定要在其上运行分析的机器。通过WHAT,您可以设置要分析的应用程序的路径。要分析PyTorch脚本,建议将所有手动步骤(包括激活Python环境和设置所需的环境变量)包装到一个bash脚本中,然后分析此bash脚本。在上面的截图中,我们将所有步骤包装到launch.sh bash脚本中,并使用参数
读取分析结果¶
通过使用ITT成功进行性能分析后,您可以打开分析结果的平台选项卡,以查看Intel® VTune™ Profiler时间轴中的标签。
时间轴显示主线程为顶部的python线程,下方为单独的OpenMP线程。主线程行中显示了标记的PyTorch操作符和自定义区域。所有以aten::开头的操作符都是由PyTorch中的ITT功能隐式标记的操作符。标签iteration_N是使用特定API torch.profiler.itt.range_push()、torch.profiler.itt.range_pop()或torch.profiler.itt.range()范围显式标记的。请查看下一节的示例代码以获取详细信息。
注意
标有convolution和reorder的红色框是从英特尔® oneAPI 深度神经网络库(oneDNN)中标记的。
如右侧导航栏所示,时间轴行中的棕色部分显示了各个线程的CPU使用情况。在某个时间戳上,线程行中棕色部分所占的高度百分比与该时间戳上该线程的CPU使用率一致。因此,从这个时间轴可以直观地理解以下内容:
每个线程上CPU核心的利用情况如何。
如何平衡所有线程上的CPU核心利用率。所有线程的CPU使用率是否良好?
OpenMP线程的同步效果如何。启动OpenMP线程或OpenMP线程完成时是否存在抖动。
当然,Intel® VTune™ Profiler 提供了更丰富的性能分析功能集,以帮助您理解性能问题。当您理解了性能问题的根本原因时,您就可以解决它。更详细的使用说明可在Intel® VTune™ Profiler 用户指南中找到。
读取XPU性能分析结果¶
通过使用ITT成功进行性能分析后,您可以打开分析结果的平台选项卡,以查看Intel® VTune™ Profiler时间轴中的标签。
时间轴将主线程显示为顶部的python线程。标记的PyTorch操作符和自定义区域显示在主线程行中。所有以aten::开头的操作符都是由PyTorch中的ITT功能隐式标记的操作符。时间轴还在顶部显示了GPU计算队列,用户可以看到不同的XPU内核被调度到GPU队列中。
展示如何使用PyTorch ITT API的简短示例代码¶
下面的示例代码是用于上述截图中的性能分析的脚本。
拓扑结构由两个操作符Conv2d和Linear组成。进行了三次推理迭代。每次迭代都被PyTorch ITT API标记为文本字符串iteration_N。无论是torch.profile.itt.range_push和torch.profile.itt.range_pop还是torch.profile.itt.range作用域,都可以实现自定义标记功能。
# 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




