【TVM 教程】PAPI 入門 原創(chuàng)
Apache TVM 是一個深度的深度學(xué)習(xí)編譯框架,適用于 CPU、GPU 和各種機器學(xué)習(xí)加速芯片。更多 TVM 中文文檔可訪問 →https://tvm.hyper.ai/
性能應(yīng)用程序編程接口(Performance Application Programming Interface,簡稱 PAPI)是一個可在各種平臺上提供性能計數(shù)器的庫。在指定的運行期間,性能計數(shù)器提供處理器行為的準(zhǔn)確底層信息,包含簡單的指標(biāo),如總循環(huán)計數(shù)、緩存未命中和執(zhí)行的指令,以及更高級的信息(如總 FLOPS 和 warp 占用率)。PAPI 的這些指標(biāo)在 profiling 時可用。
安裝 PAPI?
PAPI 可以用包管理器(Ubuntu 上用?apt-get install libpapi-dev
?命令)來安裝,也可以從?源代碼?安裝。
由于之前從源代碼 pull 最新版本的 PAPI 導(dǎo)致了構(gòu)建問題,因此推薦 checkout 標(biāo)記版本?papi-6-0-0-1-t
。
使用 PAPI 構(gòu)建 TVM?
若要在 TVM 構(gòu)建中包含 PAPI,在?config.cmake
?中設(shè)置:
set(USE_PAPI ON)
若 PAPI 安裝在非標(biāo)準(zhǔn)位置,可指定它的位置:
set(USE_PAPI path/to/papi.pc)
在 Profiling 時使用 PAPI?
若 TVM 是用 PAPI 構(gòu)建的(見上文),可將?tvm.runtime.profiling.PAPIMetricCollector
?傳給?tvm.runtime.GraphModule.profile()
?來收集性能指標(biāo):
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
還可以指定收集哪些指標(biāo):
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
?命令可得到可用指標(biāo)列表。
