doc22_067.md 11.8 KB
Newer Older
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
1 2
# torch.profiler

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
3 4 5 6 7 8
> 原文:[`pytorch.org/docs/stable/profiler.html`](https://pytorch.org/docs/stable/profiler.html)> 
>
> 译者:[飞龙](https://github.com/wizardforcel)
>
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
9 10 11

## 概述

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
12
PyTorch Profiler 是一个工具,允许在训练和推断过程中收集性能指标。Profiler 的上下文管理器 API 可用于更好地了解哪些模型操作符是最昂贵的,检查它们的输入形状和堆栈跟踪,研究设备内核活动并可视化执行跟踪。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
13 14 15

注意

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
16
`torch.autograd`模块中的早期版本被视为遗留版本,并将被弃用。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
17

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
18
## API 参考
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
19 20

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
21
class torch.profiler._KinetoProfile(*, activities=None, record_shapes=False, profile_memory=False, with_stack=False, with_flops=False, with_modules=False, experimental_config=None)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
22 23 24 25 26 27
```

低级别分析器包装自动梯度分析

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
28
+   **activities***可迭代对象*)- 要在分析中使用的活动组(CPU、CUDA)列表,支持的值:`torch.profiler.ProfilerActivity.CPU``torch.profiler.ProfilerActivity.CUDA`。默认值:ProfilerActivity.CPU 和(如果可用)ProfilerActivity.CUDA。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
29 30 31 32 33 34 35

+   **record_shapes**[*bool*](https://docs.python.org/3/library/functions.html#bool "(in Python v3.12)"))- 保存有关操作符输入形状的信息。

+   **profile_memory**[*bool*](https://docs.python.org/3/library/functions.html#bool "(in Python v3.12)"))- 跟踪张量内存分配/释放(有关更多详细信息,请参阅`export_memory_timeline`)。

+   **with_stack**[*bool*](https://docs.python.org/3/library/functions.html#bool "(in Python v3.12)"))- 记录操作的源信息(文件和行号)。

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
36
+   **with_flops**[*bool*](https://docs.python.org/3/library/functions.html#bool "(in Python v3.12)"))- 使用公式估计特定操作符的 FLOPS(矩阵乘法和 2D 卷积)。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
37

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
38
+   **with_modules**[*bool*](https://docs.python.org/3/library/functions.html#bool "(in Python v3.12)"))- 记录模块层次结构(包括函数名称),对应于操作的调用堆栈。例如,如果模块 A 的前向调用的模块 B 的前向包含一个 aten::add 操作,则 aten::add 的模块层次结构是 A.B 请注意,此支持目前仅适用于 TorchScript 模型,而不适用于急切模式模型。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
39

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
40
+   **experimental_config***_ExperimentalConfig*)- 由像 Kineto 这样的分析器库使用的一组实验选项。请注意,不保证向后兼容性。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
41 42 43

注意

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
44
此 API 是实验性的,未来可能会更改。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
45

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
46
启用形状和堆栈跟踪会导致额外的开销。当指定 record_shapes=True 时,分析器将暂时保留对张量的引用;这可能进一步阻止依赖引用计数的某些优化,并引入额外的张量副本。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
47 48

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
49
add_metadata(key, value)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
50 51 52 53 54
```

向跟踪文件中添加具有字符串键和字符串值的用户定义的元数据

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
55
add_metadata_json(key, value)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
56 57
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
58
向跟踪文件中添加具有字符串键和有效 json 值的用户定义的元数据
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
59 60

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
61
events()
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
62 63 64 65 66
```

返回未聚合的分析器事件列表,用于在跟踪回调中使用或在分析完成后使用

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
67
export_chrome_trace(path)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
68 69
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
70
以 Chrome JSON 格式导出收集的跟踪信息。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
71 72

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
73
export_memory_timeline(path, device=None)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
74 75
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
76
从收集的树中导出分析器的内存事件信息,用于给定设备,并导出时间线图。使用`export_memory_timeline`有 3 个可导出的文件,每个文件由`path`的后缀控制。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
77

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
78
+   要生成 HTML 兼容的绘图,请使用后缀`.html`,内存时间线图将嵌入到 HTML 文件中作为 PNG 文件。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
79

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
80
+   对于由`[times, [sizes by category]]`组成的绘图点,其中`times`是时间戳,`sizes`是每个类别的内存使用量。内存时间线图将保存为 JSON(`.json`)或经过 gzip 压缩的 JSON(`.json.gz`),具体取决于后缀。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
81 82 83

+   对于原始内存点,请使用后缀`.raw.json.gz`。每个原始内存事件将包括`(时间戳,操作,字节数,类别)`,其中`操作``[PREEXISTING, CREATE, INCREMENT_VERSION, DESTROY]`之一,`类别``torch.profiler._memory_profiler.Category`中的枚举之一。

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
84
输出:内存时间线以 gzipped JSON、JSON 或 HTML 形式编写。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
85 86

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
87
export_stacks(path, metric='self_cpu_time_total')
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
88 89 90 91 92 93
```

将堆栈跟踪保存在适合可视化的文件中。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
94
+   **path**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)"))- 将堆栈文件保存到此位置;
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
95

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
96
+   **metric**[*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)"))- 要使用的度量标准:“self_cpu_time_total”或“self_cuda_time_total”
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
97 98 99

注意

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
100
使用 FlameGraph 工具的示例:
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
101

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
102
+   git clone [`github.com/brendangregg/FlameGraph`](https://github.com/brendangregg/FlameGraph)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
103 104 105 106 107 108

+   cd FlameGraph

+   ./flamegraph.pl –title “CPU time” –countname “us.” profiler.stacks > perf_viz.svg

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
109
key_averages(group_by_input_shape=False, group_by_stack_n=0)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
110 111 112 113 114 115
```

通过运算符名称和(可选)输入形状和堆栈对事件进行平均分组。

注意

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
116
要使用形状/堆栈功能,请确保在创建分析器上下文管理器时设置 record_shapes/with_stack。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
117 118

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
119
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, use_cuda=None)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
120 121 122 123 124 125
```

分析器上下文管理器。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
126
+   **activities***iterable*)- 用于分析的活动组(CPU,CUDA)列表,支持的值:`torch.profiler.ProfilerActivity.CPU``torch.profiler.ProfilerActivity.CUDA`。默认值:ProfilerActivity.CPU 和(如果可用)ProfilerActivity.CUDA。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
127 128 129 130 131

+   **schedule***Callable*)- 接受步骤(int)作为单个参数并返回指定在每个步骤执行的分析器操作的`ProfilerAction`值的可调用对象。

+   **on_trace_ready***Callable*)- 在分析期间`schedule`返回`ProfilerAction.RECORD_AND_SAVE`时在每个步骤调用的可调用对象。

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
132
+   **record_shapes**[*bool*](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)"))- 保存有关运算符输入形状的信息。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
133

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
134
+   **profile_memory**[*bool*](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)"))- 跟踪张量内存分配/释放。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
135

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
136
+   **with_stack**[*bool*](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)"))- 记录操作的源信息(文件和行号)。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
137

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
138
+   **with_flops**[*bool*](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)"))- 使用公式估算特定运算符(矩阵乘法和 2D 卷积)的 FLOPs(浮点运算)。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
139

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
140
+   **with_modules**[*bool*](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)"))- 记录与操作的调用堆栈对应的模块层次结构(包括函数名称)。例如,如果模块 A 的前向调用模块 B 的前向,其中包含一个 aten::add 操作,则 aten::add 的模块层次结构是 A.B。请注意,此支持目前仅适用于 TorchScript 模型,而不适用于急切模式模型。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
141

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
142
+   **experimental_config***_ExperimentalConfig*)- 用于 Kineto 库功能的一组实验选项。请注意,不保证向后兼容性。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
143

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
144
+   **use_cuda**[*bool*](https://docs.python.org/3/library/functions.html#bool "(在 Python v3.12 中)"))-
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
145

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
146
    自 1.8.1 版本起已弃用:请改用`activities`。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
147 148 149

注意

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
150
使用`schedule()`生成可调度的调度。非默认调度在分析长时间训练作业时很有用,并允许用户在训练过程的不同迭代中获取多个跟踪。默认调度仅在上下文管理器的持续时间内连续记录所有事件。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
151 152 153

注意

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
154
使用`tensorboard_trace_handler()`生成 TensorBoard 的结果文件:
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
155 156 157 158 159 160 161

`on_trace_ready=torch.profiler.tensorboard_trace_handler(dir_name)`

分析后,结果文件可以在指定目录中找到。使用命令:

`tensorboard --logdir dir_name`

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
162
在 TensorBoard 中查看结果。有关更多信息,请参阅[PyTorch Profiler TensorBoard 插件](https://github.com/pytorch/kineto/tree/master/tb_plugin)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
163 164 165

注意

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
166
启用形状和堆栈跟踪会导致额外的开销。当指定 record_shapes=True 时,分析器将暂时保留对张量的引用;这可能进一步阻止依赖引用计数的某些优化,并引入额外的张量副本。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222

示例:

```py
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`函数:

```py
# 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() 
```

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
223
step()
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
224 225 226 227 228
```

信号分析器下一个分析步骤已经开始。

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
229
class torch.profiler.ProfilerAction(value)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
230 231 232 233 234
```

在指定间隔可以执行的分析器操作

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
235
class torch.profiler.ProfilerActivity
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
236 237 238 239 240 241 242 243 244 245 246 247 248
```

成员:

CPU

XPU

MTIA

CUDA

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
249
property name
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
250 251 252
```

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
253
torch.profiler.schedule(*, wait, warmup, active, repeat=0, skip_first=0)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
254 255 256 257 258 259 260 261 262
```

返回一个可用作分析器`schedule`参数的可调用对象。分析器将跳过前`skip_first`步,然后等待`wait`步,然后为接下来的`warmup`步进行预热,然后为接下来的`active`步进行活动记录,然后重复以`wait`步开始的循环。循环的可选次数由`repeat`参数指定,零值表示循环将持续直到分析完成。

返回类型

[*Callable*](https://docs.python.org/3/library/typing.html#typing.Callable "(在 Python v3.12 中)")

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
263
torch.profiler.tensorboard_trace_handler(dir_name, worker_name=None, use_gzip=False)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
264 265
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
266
将跟踪文件输出到`dir_name`目录,然后该目录可以直接作为 logdir 传递给 tensorboard。在分布式场景中,`worker_name`应该对每个 worker 是唯一的,默认情况下将设置为‘[hostname]_[pid]’。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
267

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
268
## 英特尔仪器和跟踪技术 APIs
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
269 270

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
271
torch.profiler.itt.is_available()
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
272 273
```

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
274
检查 ITT 功能是否可用
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
275 276

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
277
torch.profiler.itt.mark(msg)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
278 279 280 281 282 283
```

描述在某个时间点发生的瞬时事件。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
284
**msg** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) – 与事件关联的 ASCII 消息。
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
285 286

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
287
torch.profiler.itt.range_push(msg)
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
288 289 290 291 292 293
```

将范围推送到嵌套范围堆栈上。返回开始的范围的从零开始的深度。

参数

绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
294
**msg** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(在 Python v3.12 中)")) – 与范围关联的 ASCII 消息
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
295 296

```py
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
297
torch.profiler.itt.range_pop()
绝不原创的飞龙's avatar
绝不原创的飞龙 已提交
298 299 300
```

从嵌套范围跨度堆栈中弹出一个范围。返回结束的范围的从零开始的深度。