跳转至

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对应目录,即可解析不可读符号。
  • 卡死python进程 madbg

PTA profile

可选如下:

性能比对

参考算子性能比对工具

选项:

  • 输出路径
    • 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

必看

  1. 注意:采集步数:schedule=torch.profiler.schedule(wait=10, warmup=0, active=1, repeat=1)一定要包含要采集的step, 不然什么输出也没有
  2. 一个程序不能使用两个torch_npu.profiler.profile采集(即使保存在不同路径) ,可能底层冲突会导致没有ASCEND_PROFILER_OUTPUT目录。
  3. 一个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侧

with torch_npu.profiler.profile()  as prof:
   prof.add_metadata(key, value)

c++侧

#include <ATen/record_function.h>
RECORD_FUNCTION("RunGraph", {});
RECORD_FUNCTION("my_custom_op", std::vector<c10::IValue>({input}));

std::vector 是一个容器,用于存储 PyTorch 的 c10::IValue 类型的值。c10::IValue 是 PyTorch 中的一个通用类型,可以表示多种类型的数据,例如张量、标量、列表、字典等。

算子优化

  1. CANN 提供 msopt 工具 和 msprof来仿真流水。
  2. CAModel 和 PEMModel

约定与规则

环境变量

CANN构建AI应用和业务过程中可使用的环境变量

报错报警机制

  • 接口 Ascend_logd 来使用CANN暴露的接口aclAppLog
  • 通过 export ASCEND_GLOBAL_LOG_LEVEL=0 开启, 同时设置export ASCEND_PROCESS_LOG_PATH=$HOME/log/1

错误码

  • ACL_ERROR_NONE

参考文献

评论