TVM 篇(1):如何从源码构建并安装 TVM
Author: stormQ
Created: Friday, 03. September 2021 08:44PM
Last Modified: Saturday, 04. September 2021 10:23PM
本文介绍了在 Ubuntu 20.04 系统中从源码构建和安装 TVM 的过程,从而为进一步研究 TVM 做好准备。
step 1: 获取源码
执行如下命令获取 TVM 及其依赖的源码:
$ git clone --recursive https://github.com/apache/tvm tvm
注:
选项--recursive
用于获取 TVM 的依赖(位于 tvm/3rdparty 目录下)的源码。
下载的 TVM 源码默认基于main
分支。
如果第三方依赖下载过慢,则可以稍后在 tvm 目录中执行如下命令单独更新第三方依赖:
$ git submodule init
$ git submodule update
step 2: 选择构建工具
构建工具可以是GNU make
、ninja
等。为了可能地更快增量编译,这里使用ninja
。
1) 安装 ninja
在 Ubuntu 20.04 中安装ninja
的命令如下:
$ sudo apt-get install ninja-build
查看ninja
的版本:
$ ninja --version
1.10.0
step 3: 调整配置参数(optional)
我们可以调整配置参数,以获取定制的 TVM。可调整的配置参数由 tvm/CMakeLists.txt 文件中的tvm_option
命令指定。可通过命令行指定需要修改的参数(形如-DOPTION=VALUE
),但不要直接修改该文件进行调整。
1) 指定生成的 TVM 版本是 DEBUG 还是 RELEASE
构建 TVM 的目的主要是为了生成共享库libtvm.so
和libtvm_runtime.so
。
TVM 的默认配置是构建 RELEASE 版本的共享库。如果要构建 DEBUG 版本的,可以使用如下选项:
-DCMAKE_BUILD_TYPE=Debug
上述选项的用法如下:
$ cmake -DCMAKE_BUILD_TYPE=Debug -G Ninja ..
执行上述命令后,输出结果如下:
-- Build in Debug mode
2) 指定是否启用 CUDA 后端
TVM 的默认配置不启用 CUDA 后端(不需要安装 CUDA)。如果要启用 CUDA 后端(需要安装 CUDA),可以使用如下选项:
-DUSE_CUDA=ON
上述选项的用法如下:
$ cmake -DUSE_CUDA=ON -G Ninja ..
3) 指定是否构建 DEBUG 版本的 Relay
TVM 的默认配置是构建 RELEASE 版本的 Relay。如果要构建 DEBUG 版本的,可以使用如下选项:
-DUSE_RELAY_DEBUG=ON
上述选项的用法如下:
$ cmake -DUSE_RELAY_DEBUG=ON -G Ninja ..
执行上述命令后,输出结果如下:
-- Building Relay in debug mode...
4) 指定是否使用 LLVM
TVM 的默认配置关闭了 LLVM 选项(即不需要安装 LLVM)。如果要使用 LLVM(需要安装 LLVM),可以使用如下选项:
-DUSE_LLVM=ON
上述选项的用法如下:
$ cmake -DUSE_LLVM=ON -G Ninja ..
执行上述命令后,构建工具会自动搜索 LLVM 相关的共享库。输出结果如下(部分):
-- Not found - LLVM_LIBS
-- Fall back to using llvm-config
-- Use llvm-config=/usr/local/bin/llvm-config
-- Found LLVM_INCLUDE_DIRS=/usr/local/include
-- Found LLVM_DEFINITIONS=-D_GNU_SOURCE;-D_DEBUG;-D__STDC_CONSTANT_MACROS;-D__STDC_FORMAT_MACROS;-D__STDC_LIMIT_MACROS
-- Found LLVM_LIBS=/usr/local/lib/libLLVMWindowsManifest.so;/usr/local/lib/libLLVMXRay.so;省略...
-- Found TVM_LLVM_VERSION=140
-- Build with LLVM 14.0.0
-- Set TVM_LLVM_VERSION=140
step 4: 编译
1) 创建并切换到构建目录——build_ninja
在 tvm 目录中执行如下命令:
$ mkdir build_ninja && cd build_ninja
2) 编译
$ cmake -DCMAKE_BUILD_TYPE=Debug -DUSE_RELAY_DEBUG=ON -DUSE_LLVM=ON -G Ninja ..
$ ninja
编译成功后,生成的共享库libtvm.so
和libtvm_runtime.so
位于构建目录下。如下所示:
$ ls build_ninja/
build.ninja CMakeCache.txt CMakeFiles cmake_install.cmake libbacktrace libtvm_runtime.so libtvm.so rules.ninja
查看生成的共享库是否是DEBUG
版本。在构建目录中执行如下命令:
$ file libtvm.so
libtvm.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=57549746b04cd3a7cb359e375db427e1b01a63a2, with debug_info, not stripped
$ file libtvm_runtime.so
libtvm_runtime.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=0101648081939d9d6b9498d47498121ecd2aba5b, with debug_info, not stripped
从上面的结果可以看出,上述编译生成的共享库确实都是DEBUG
版本。
step 5: 安装 Python 包
这里要安装的 Python 包位于 tvm/python 目录下。比如:TVM 命令行工具——tvmc(位于 tvm/python/tvm/driver 目录下)。
1) 修改~/.bashrc
文件
在~/.bashrc
文件中添加如下内容:
export TVM_HOME=~/git-projects/tvm
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}
export TVM_LIBRARY_PATH=$TVM_HOME/build_ninja
注:
添加环境变量PYTHONPATH
是为了允许执行python3 -m tvm.driver.tvmc
命令。
添加环境变量TVM_LIBRARY_PATH
是为了执行python3 -m tvm.driver.tvmc
命令时能够搜索到共享库libtvm.so
和libtvm_runtime.so
,从而该命令可以执行成功。
修改完成后,上述配置对之后新建的 Shell 窗口生效。执行如下命令对本 Shell 窗口生效:
$ source ~/.bashrc
2) 安装 tvmc 的依赖
$ sudo pip3 install numpy decorator attrs scipy
注: 如果某些依赖下载失败,则多试几次。
3) 运行 tvmc
$ python3 -m tvm.driver.tvmc --help
输出结果如下:
usage: tvmc [-h] [-v] [--version] {tune,compile,run} ...
TVM compiler driver
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase verbosity
--version print the version and exit
commands:
{tune,compile,run}
tune auto-tune a model
compile compile a model.
run run a compiled module
TVMC - TVM driver command-line interface
4) 建立别名(optional)
为了更方便地使用 TVM 命令行工具,我们可以为上述命令建立别名。在~/.bashrc
文件中添加如下内容:
alias tvmc='python3 -m tvm.driver.tvmc'
建立别名后,可以直接通过tvmc
命令运行 TVM 命令行工具。输出结果如下:
$ tvmc --help
usage: tvmc [-h] [-v] [--version] {tune,compile,run} ...
TVM compiler driver
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase verbosity
--version print the version and exit
commands:
{tune,compile,run}
tune auto-tune a model
compile compile a model.
run run a compiled module
TVMC - TVM driver command-line interface
下一篇:TVM 篇(2):如何使用 TVMC 编译和优化模型
上一篇:上一级目录