Debugging TVM#

注意:这个页面是一个正在进行中的工作。欢迎大家通过发送 PR 来添加建议和提示修改本页面。这个页面的目标是集中调试 TVM 所使用的常用技术,并向社区传播这种认识。为了达到这个目的,可能会寻求将更广泛使用的技术推广到本文档的顶部。

VLOGging#

TVM 提供了详细日志记录功能,允许提交跟踪级别的调试消息,而不会影响生产中 TVM 的二进制大小或运行时。你可以在你的代码中使用 VLOG 如下:

void Foo(const std::string& bar) {
  VLOG(2) << "Running Foo(" << bar << ")";
  // ...
}

在本例中,传递给 VLOG() 的整数 2 表示 verbosity 级别。级别越高,打印的日志越多。通常,TVM 级别从 0 到 2 不等,3 只用于极低级的核心运行时属性。VLOG 系统在启动时被配置为打印 0 到整数 N 之间的 VLOG 语句。 N 可以每个文件设置或全局设置。

VLOG 默认不打印或影响二进制大小或运行时间(当编译时使用适当的优化)。要启用 VLOGging,请执行以下操作:

  1. config/cmake 中,确保设置 set(USE_RELAY_DEBUG ON)。该标志用于启用 VLOGging。

  2. 启动 Python 传递 TVM_LOG_DEBUG=<spec>,其中 <spec>> 是逗号分隔的级别赋值列表,格式为 <file_name>=<level>;特别地:

    • 特殊的文件名 DEFAULT 设置所有文件的 VLOG 级别设置。

    • <level>> 可以设置为 -1 来禁用 VLOG。

    • <file_name> 是相对于 TVM repo 中的 src/ 目录的 C++ 源文件的名称(例如 .cc,而不是 .h)。在指定文件路径时,您不需要提供 src/,但是如果您这样做了,VLOG 仍然会正确地解释该路径。

示例:

# enable VLOG(0), VLOG(1), VLOG(2) in all files.
$ TVM_LOG_DEBUG=DEFAULT=2 python3 -c 'import tvm'

# enable VLOG(0), VLOG(1), VLOG(2) in all files, except not VLOG(2) in src/bar/baz.cc.
$ TVM_LOG_DEBUG=DEFAULT=2,bar/baz.cc=1 python3 -c 'import tvm'

# enable VLOG(0), VLOG(1), VLOG(2) in all files, except not in src/foo/bar.cc.
$ TVM_LOG_DEBUG=DEFAULT=2,src/foo/bar.cc=-1 python3 -c 'import tvm'