torch.profiler#
创建于: 2020年12月18日 | 最后更新于: 2025年6月13日
概述#
PyTorch Profiler 是一个工具,允许在训练和推理过程中收集性能指标。Profiler 的上下文管理器 API 可用于更好地理解哪些模型操作符是最耗时的,检查它们的输入形状和堆栈跟踪,研究设备内核活动,并可视化执行跟踪。
注意
torch.autograd 模块中较早的 API 版本被视为遗留版本,将被弃用。
API参考#
- class torch.profiler._KinetoProfile(*, activities=None, record_shapes=False, profile_memory=False, with_stack=False, with_flops=False, with_modules=False, experimental_config=None, execution_trace_observer=None, acc_events=False, custom_trace_id_callback=None)[source]#
低级分析器包装 autograd 分析
- 参数:
activities (iterable) – 用于分析的活动组列表 (CPU, CUDA),支持的值:
torch.profiler.ProfilerActivity.CPU,torch.profiler.ProfilerActivity.CUDA,torch.profiler.ProfilerActivity.XPU。默认值:ProfilerActivity.CPU 和 (可用时) ProfilerActivity.CUDA 或 (可用时) ProfilerActivity.XPU。record_shapes (bool) – 保存操作符输入形状的信息。
profile_memory (bool) – 跟踪张量内存分配/去分配 (有关更多详细信息,请参见
export_memory_timeline)。with_stack (bool) – 记录操作符的源信息 (文件和行号)。
with_flops (bool) – 使用公式估算特定操作符 (矩阵乘法和 2D 卷积) 的 FLOPS。
with_modules (bool) – 记录与操作符调用堆栈对应的模块层次结构 (包括函数名)。例如,如果模块 A 的 forward 调用了模块 B 的 forward,而模块 B 包含一个 aten::add 操作符,则 aten::add 的模块层次结构是 A.B。请注意,目前仅支持 TorchScript 模型,不支持 eager 模式模型。
experimental_config (_ExperimentalConfig) – Kineto 等分析器库使用的实验选项集。注意,不保证向后兼容性。
execution_trace_observer (ExecutionTraceObserver) – PyTorch 执行跟踪观察器对象。 PyTorch 执行跟踪 提供 AI/ML 工作负载的图表示,并支持重放基准测试、模拟器和仿真器。当包含此参数时,观察器的 start() 和 stop() 将在与 PyTorch 分析器相同的时间窗口内被调用。
acc_events (bool) – 启用跨多个分析周期累积 FunctionEvents
注意
此 API 是实验性的,未来可能会发生变化。
启用形状和堆栈跟踪会导致额外的开销。当指定 record_shapes=True 时,分析器将暂时保留对张量的引用;这可能会进一步阻止依赖引用计数的某些优化,并引入额外的张量复制。
- export_memory_timeline(path, device=None)[source]#
导出分析器收集的给定设备的内存事件信息,并导出时间线图。有 3 种可导出的文件可以使用
export_memory_timeline,每种由path的后缀控制。要获得与 HTML 兼容的图,请使用后缀
.html,内存时间线图将作为 PNG 文件嵌入 HTML 文件中。对于由
[times, [sizes by category]]组成的绘图点,其中times是时间戳,sizes是每个类别的内存使用量。内存时间线图将保存为 JSON (.json) 或 Gzipped JSON (.json.gz),具体取决于后缀。对于原始内存点,使用后缀
.raw.json.gz。每个原始内存事件将包含(timestamp, action, numbytes, category),其中action是[PREEXISTING, CREATE, INCREMENT_VERSION, DESTROY]之一,category是torch.profiler._memory_profiler.Category中的枚举值之一。
输出:内存时间线以 Gzipped JSON、JSON 或 HTML 格式写入。
自版本 ``export_memory_timeline``起已弃用:此函数已弃用,将在未来版本中删除。请改用
torch.cuda.memory._record_memory_history和torch.cuda.memory._export_memory_snapshot。
- key_averages(group_by_input_shape=False, group_by_stack_n=0, group_by_overload_name=False)[source]#
平均事件,按操作符名称以及 (可选地) 输入形状、堆栈和重载名称进行分组。
注意
要使用形状/堆栈功能,请确保在创建分析器上下文管理器时设置 record_shapes/with_stack。
- toggle_collection_dynamic(enable, activities)[source]#
在收集过程中的任何时候动态打开/关闭活动收集。目前支持切换 Kineto 中支持的 Torch Ops (CPU) 和 CUDA 活动
- 参数:
activities (iterable) – 用于分析的活动组列表,支持的值:
torch.profiler.ProfilerActivity.CPU,torch.profiler.ProfilerActivity.CUDA
示例
with torch.profiler.profile( activities=[ torch.profiler.ProfilerActivity.CPU, torch.profiler.ProfilerActivity.CUDA, ] ) as p: code_to_profile_0() // turn off collection of all CUDA activity p.toggle_collection_dynamic(False, [torch.profiler.ProfilerActivity.CUDA]) code_to_profile_1() // turn on collection of all CUDA activity p.toggle_collection_dynamic(True, [torch.profiler.ProfilerActivity.CUDA]) code_to_profile_2() print(p.key_averages().table( sort_by="self_cuda_time_total", row_limit=-1))
- class torch.profiler.profile(*, activities=None, schedule=None, on_trace_ready=None, record_shapes=False, profile_memory=False, with_stack=False, with_flops=False, with_modules=False, experimental_config=None, execution_trace_observer=None, acc_events=False, use_cuda=None, custom_trace_id_callback=None)[source]#
分析器上下文管理器。
- 参数:
activities (iterable) – 用于分析的活动组列表 (CPU, CUDA),支持的值:
torch.profiler.ProfilerActivity.CPU,torch.profiler.ProfilerActivity.CUDA,torch.profiler.ProfilerActivity.XPU。默认值:ProfilerActivity.CPU 和 (可用时) ProfilerActivity.CUDA 或 (可用时) ProfilerActivity.XPU。schedule (Callable) – 可调用对象,它接受一个步骤 (int) 作为单个参数,并返回
ProfilerAction值,该值指定要在每个步骤执行的分析器操作。on_trace_ready (Callable) – 在每个步骤中,当
schedule返回ProfilerAction.RECORD_AND_SAVE时调用的可调用对象。record_shapes (bool) – 保存操作符输入形状的信息。
profile_memory (bool) – 跟踪张量内存分配/去分配。
with_stack (bool) – 记录操作符的源信息 (文件和行号)。
with_flops (bool) – 使用公式估算特定操作符 (矩阵乘法和 2D 卷积) 的 FLOPs (浮点运算)。
with_modules (bool) – 记录与操作符调用堆栈对应的模块层次结构 (包括函数名)。例如,如果模块 A 的 forward 调用了模块 B 的 forward,而模块 B 包含一个 aten::add 操作符,则 aten::add 的模块层次结构是 A.B。请注意,目前仅支持 TorchScript 模型,不支持 eager 模式模型。
experimental_config (_ExperimentalConfig) – 用于 Kineto 库功能的实验选项集。注意,不保证向后兼容性。
execution_trace_observer (ExecutionTraceObserver) – PyTorch 执行跟踪观察器对象。 PyTorch 执行跟踪 提供 AI/ML 工作负载的图表示,并支持重放基准测试、模拟器和仿真器。当包含此参数时,观察器的 start() 和 stop() 将在与 PyTorch 分析器相同的时间窗口内被调用。有关代码示例,请参阅下面的示例部分。
acc_events (bool) – 启用跨多个分析周期累积 FunctionEvents
use_cuda (bool) –
版本 1.8.1 已弃用: 使用
activities代替。
注意
使用
schedule()生成可调用的计划。当分析长时间训练作业时,非默认计划非常有用,并且允许用户在训练过程的不同迭代中获取多个跟踪。默认计划仅在上下文管理器期间连续记录所有事件。注意
使用
tensorboard_trace_handler()为 TensorBoard 生成结果文件on_trace_ready=torch.profiler.tensorboard_trace_handler(dir_name)分析后,结果文件可在指定目录中找到。使用命令
tensorboard --logdir dir_name在 TensorBoard 中查看结果。有关更多信息,请参阅 PyTorch Profiler TensorBoard 插件
注意
启用形状和堆栈跟踪会导致额外的开销。当指定 record_shapes=True 时,分析器将暂时保留对张量的引用;这可能会进一步阻止依赖引用计数的某些优化,并引入额外的张量复制。
示例
with torch.profiler.profile( activities=[ torch.profiler.ProfilerActivity.CPU, torch.profiler.ProfilerActivity.CUDA, ] ) as p: code_to_profile() print(p.key_averages().table(sort_by="self_cuda_time_total", row_limit=-1))
使用分析器的
schedule、on_trace_ready和step函数# Non-default profiler schedule allows user to turn profiler on and off # on different iterations of the training loop; # trace_handler is called every time a new trace becomes available def trace_handler(prof): print( prof.key_averages().table(sort_by="self_cuda_time_total", row_limit=-1) ) # prof.export_chrome_trace("/tmp/test_trace_" + str(prof.step_num) + ".json") with torch.profiler.profile( activities=[ torch.profiler.ProfilerActivity.CPU, torch.profiler.ProfilerActivity.CUDA, ], # In this example with wait=1, warmup=1, active=2, repeat=1, # profiler will skip the first step/iteration, # start warming up on the second, record # the third and the forth iterations, # after which the trace will become available # and on_trace_ready (when set) is called; # the cycle repeats starting with the next step schedule=torch.profiler.schedule(wait=1, warmup=1, active=2, repeat=1), on_trace_ready=trace_handler, # on_trace_ready=torch.profiler.tensorboard_trace_handler('./log') # used when outputting for tensorboard ) as p: for iter in range(N): code_iteration_to_profile(iter) # send a signal to the profiler that the next iteration has started p.step()
以下示例显示了如何设置执行跟踪观察器 (
execution_trace_observer)with torch.profiler.profile( ... execution_trace_observer=( ExecutionTraceObserver().register_callback("./execution_trace.json") ), ) as p: for iter in range(N): code_iteration_to_profile(iter) p.step()
您还可以参考 tests/profiler/test_profiler.py 中的 test_execution_trace_with_kineto()。注意:也可以传递任何满足 _ITraceObserver 接口的对象。
- torch.profiler.schedule(*, wait, warmup, active, repeat=0, skip_first=0, skip_first_wait=0)[source]#
返回一个可调用对象,可用作分析器
schedule参数。分析器将跳过前skip_first个步骤,然后等待wait个步骤,然后进行下warmup个步骤的预热,然后进行下active个步骤的活动记录,然后从wait个步骤开始重复循环。可选的周期数由repeat参数指定,零值表示周期将一直持续到分析结束。skip_first_wait参数控制是否应跳过第一个wait阶段。当用户希望在周期之间等待比skip_first更长的时间,但又不想在第一次配置文件中等待时,这很有用。例如,如果skip_first为 10 且wait为 20,则第一个周期将在预热前等待 10 + 20 = 30 个步骤 (如果skip_first_wait为零),但在skip_first_wait非零时只等待 10 个步骤。之后的所有周期将在最后一个活动和预热之间等待 20 个步骤。- 返回类型:
Intel Instrumentation and Tracing Technology APIs#
- torch.profiler.itt.range_push(msg)[source]#
将一个范围推送到嵌套范围跨度的堆栈上。返回开始范围的基于零的深度。
- 参数:
msg (str) – 要与范围关联的 ASCII 消息