Debug/Profile/Devlop Tools of PTA
导言
- 在 Ascend Extension for PyTorch 的相关开发时,最基础的能力就是debug和性能测试。
- 这里只列出、整理工具,具体需要看内部文档。
- 避免重复造轮子。
机制¶
Python侧暴露接口¶
在PTA里如下注册,即可在python侧import torch_npu
快速使用torch_npu._C._npu_init_sync_record()
。2
torch_npu/csrc/npu/Module.cpp
static struct PyMethodDef THNPModule_methods[] = {
{"_npu_init_sync_record", (PyCFunction)THNPModule_npu_init_sync_record, METH_NOARGS, nullptr},
}
// c++侧定义
PyObject* THNPModule_npu_init_sync_record(PyObject* self, PyObject* noargs)
{
HANDLE_TH_ERRORS
torch_npu::profiler::SyncRecorder::init_record();
Py_RETURN_NONE;
END_HANDLE_TH_ERRORS
}
工具¶
GDB/PDB¶
TORCH_SHOW_CPP_STACKTRACES=1
开启打印报错堆栈- 每日包有debug信息,移动到
.so
对应目录,即可解析不可读符号。
- 每日包有debug信息,移动到
- 卡死python进程 madbg
PTA profile¶
可选如下:
- Python 侧
- C++侧
- 学习使用低侵入式的
gperftools
- 学习使用低侵入式的
性能比对¶
参考算子性能比对工具
选项:
- 输出路径:
on_trace_ready=torch.profiler.tensorboard_trace_handler("./result_dir")
- 除了使用
tensorboard_trace_handler
导出性能数据外,还可以使用以下方式导出:prof.export_chrome_trace('./chrome_trace_14.json')
3
- 采集步数:
schedule=torch.profiler.schedule(wait=10, warmup=0, active=1, repeat=1)
, 解释看文档。 - 必选项:activities=[torch_npu.profiler.ProfilerActivity.CPU,torch_npu.profiler.ProfilerActivity.NPU],
- 更多选项及解释3。
必看
- 注意:采集步数:
schedule=torch.profiler.schedule(wait=10, warmup=0, active=1, repeat=1)
一定要包含要采集的step
, 不然什么输出也没有 - 一个程序不能使用两个
torch_npu.profiler.profile
采集(即使保存在不同路径) ,可能底层冲突会导致没有ASCEND_PROFILER_OUTPUT
目录。 - 一个
profile
,如果代码经过多次会生成多个不同时间戳的文件,并且会在打屏里显示start
,save
等信息。
常用设置
针对小例子的详细设置:
prof = torch_npu.profiler.profile(
activities=[
torch_npu.profiler.ProfilerActivity.CPU,
torch_npu.profiler.ProfilerActivity.NPU
],
experimental_config=experimental_config,
with_stack=True, #采集torch op的函数调用栈的开关,会占用较多空间
record_shapes=True, #采集torch op的input shape和input type的开关
profile_memory=True, #采集memory相关数据的开关
on_trace_ready=torch_npu.profiler.tensorboard_trace_handler("./pta_profile_result_dir") #目录
)
prof.start()
a = torch.Tensor([1, 2, 3]).npu()
b = torch.Tensor([4, 5, 6]).npu()
c = torch.add(a, b)
prof.stop()
自定义输出
python侧
c++侧
#include <ATen/record_function.h>
RECORD_FUNCTION("RunGraph", {});
RECORD_FUNCTION("my_custom_op", std::vector<c10::IValue>({input}));
std::vector
算子优化¶
- CANN 提供 msopt 工具 和 msprof来仿真流水。
- CAModel 和 PEMModel
约定与规则¶
环境变量¶
报错报警机制¶
- 接口
Ascend_logd
来使用CANN暴露的接口aclAppLog
。 - 通过
export ASCEND_GLOBAL_LOG_LEVEL=0
开启, 同时设置export ASCEND_PROCESS_LOG_PATH=$HOME/log/
1
错误码¶
ACL_ERROR_NONE