PAPI 入门指南#
PAPI(Performance Application Programming Interface)是提供了在各种平台上的性能计数器的库。性能计数器提供了关于处理器在给定执行运行期间行为的准确低级信息。这些信息可以包含简单的度量,如总周期数、缓存未命中和执行的指令,以及更高级别的信息,如总 FLOPS 和 warp 占用率。在进行性能分析时,PAPI 使这些指标可用。
安装 PAPI#
PAPI can either be installed using your package manager (apt-get install libpapi-dev
on Ubuntu), or from source here:
icl-utk-edu/papi.
从源代码中拉取最新版本的 PAPI 之前已经引起了构建问题。因此,建议检出标记版本 papi-6-0-0-1-t
。
用 PAPI 构建 TVM#
要在 TVM 构建中包含 PAPI,需要在 config.cmake
中设置如下:
set(USE_PAPI ON)
如果 PAPI 被安装在非标准的地方,你可以像这样指定它的位置:
set(USE_PAPI path/to/papi.pc)
在性能剖析时使用 PAPI#
如果 TVM 已经使用 PAPI 构建(请参见上文),那么您可以将 tvm.runtime.profiling.PAPIMetricCollector
传递给:py:meth:tvm.runtime.GraphModule.profile 以收集性能指标。以下是示例:
import tvm
from tvm import relay
from tvm.relay.testing import mlp
from tvm.runtime import profiler_vm
import numpy as np
target = "llvm"
dev = tvm.cpu()
mod, params = mlp.get_workload(1)
exe = relay.vm.compile(mod, target, params=params)
vm = profiler_vm.VirtualMachineProfiler(exe, dev)
data = tvm.nd.array(np.random.rand(1, 1, 28, 28).astype("float32"), device=dev)
report = vm.profile(
data,
func_name="main",
collectors=[tvm.runtime.profiling.PAPIMetricCollector()],
)
print(report)
Name perf::CACHE-MISSES perf::CYCLES perf::STALLED-CYCLES-BACKEND perf::INSTRUCTIONS perf::STALLED-CYCLES-FRONTEND
fused_nn_dense_nn_bias_add_nn_relu 2,494 1,570,698 85,608 675,564 39,583
fused_nn_dense_nn_bias_add_nn_relu_1 1,149 655,101 13,278 202,297 21,380
fused_nn_dense_nn_bias_add 288 600,184 8,321 163,446 19,513
fused_nn_batch_flatten 301 587,049 4,636 158,636 18,565
fused_nn_softmax 154 575,143 8,018 160,738 18,995
----------
Sum 4,386 3,988,175 119,861 1,360,681 118,036
Total 10,644 8,327,360 179,310 2,660,569 270,044
您还可以更改收集哪些指标:
report = vm.profile(
data,
func_name="main",
collectors=[tvm.runtime.profiling.PAPIMetricCollector({dev: ["PAPI_FP_OPS"]})],
)
Name PAPI_FP_OPS
fused_nn_dense_nn_bias_add_nn_relu 200,832
fused_nn_dense_nn_bias_add_nn_relu_1 16,448
fused_nn_dense_nn_bias_add 1,548
fused_nn_softmax 160
fused_nn_batch_flatten 0
----------
Sum 218,988
Total 218,988
您可以通过运行 papi_avail
和 papi_native_avail
命令找到可用指标的列表。