下载代码
sudo mkdir tvm
sudo git clone --recursive https://github.com/apache/tvm tvm
- 选项
--recursive
用于获取 TVM 的依赖(位于tvm/3rdparty
目录下)的源码。
如果第三方依赖下载过慢,则可以稍后在 tvm 目录中执行如下命令单独更新第三方依赖:
git submodule init
git submodule update
选择构建工具
构建工具可以是 GNU make
、ninja
等。为了可能地更快增量编译可以使用 ninja
,但是也可以直接使用 GUN make
。
如果使用 ninja
,安装 ninja
:
sudo apt-get install ninja-build
查看 ninja
的版本:
ninja --version
调整配置参数
我们可以调整配置参数,以获取定制的 TVM。可调整的配置参数由 tvm/CMakeLists.txt
文件中的 tvm_option
命令指定。可通过命令行指定需要修改的参数(形如 -DOPTION=VALUE
),但不要直接修改该文件进行调整。
指定生成的 TVM 版本是 DEBUG 还是 RELEASE:
构建 TVM 的目的主要是为了生成共享库 libtvm.so
和 libtvm_runtime.so
。
TVM 的默认配置是构建 RELEASE 版本的共享库。如果要构建 DEBUG 版本的,可以使用如下选项:
-DCMAKE_BUILD_TYPE=Debug
上述选项的用法如下:
cmake -DCMAKE_BUILD_TYPE=Debug -G Ninja ..
** 指定是否启用 CUDA 后端:**
TVM 的默认配置不启用 CUDA 后端(不需要安装 CUDA)。如果要启用 CUDA 后端(需要安装 CUDA),可以使用如下选项:
-DUSE_CUDA=ON
指定是否构建 DEBUG 版本的 Relay:
-DUSE_RELAY_DEBUG=ON
指定是否使用 LLVM:
-DUSE_LLVM=ON
执行上述命令后,构建工具会自动搜索 LLVM 相关的共享库。如果没有安装 LLVM 库,可以按照如下方式快速安装:
下载预编译的 llvm
解压缩:
sudo xz –d clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz
sudo tar –xvf clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04.tar
在 ~/.bashrc
中添加:
export PATH=$PATH:/usr/local/llvm/bin # 实际的 llvm 路径
验证 llvm:
source ~/.bashrc
llvm-config --version
出现:
10.0.0
编译
ninja 编译
创建并切换到构建目录:build_ninja
:
mkdir build_ninja && cd build_ninja
编译:
cmake -DCMAKE_BUILD_TYPE=Debug -DUSE_RELAY_DEBUG=ON -DUSE_LLVM=ON -G Ninja .
ninja
编译成功后,生成的共享库 libtvm.so
和 libtvm_runtime.so
位于构建目录下:
ls build_ninja/
CMakeCache.txt CTestTestfile.cmake Testing cmake_install.cmake 'cpptest[1]_include.cmake' libtvm.so rules.ninja tvmConfig.cmake
CMakeFiles DartConfiguration.tcl build.ninja compile_commands.json libbacktrace libtvm_runtime.so temp_config_file.cmake
查看生成的共享库是否是 DEBUG 版本。在构建目录中执行如下命令:
file libtvm.so
libtvm.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[xxHash]=8b7ca1993606b422, with debug_info, not stripped
file libtvm_runtime.so
libtvm_runtime.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[xxHash]=4ce49599b4715cfc, with debug_info, not stripped
make 编译
回到 TVM 的源码目录,执行:
sudo mkdir build
sudo cp cmake/config.cmake build
修改 build/config.cmake
使能 llvm:
set(USE_LLVM ON)
进入 build
目录,执行:
sudo cmake ..
sudo make -j4
python 环境
环境依赖
安装需要的环境:
sudo apt-get install -y python3 python3-dev python3-setuptools gcc libtinfo-dev zlib1g-dev build-essential cmake libedit-dev libxml2-dev
如果你要安装到一个受管理的本地环境,如 virtualenv,则不需要 --user flag
。
必要的依赖:
pip3 install --user numpy decorator attrs
如果你想使用 RPC Tracker:
pip3 install --user tornado
如果你想使用 auto-tuning 模块:
pip3 install --user tornado psutil xgboost cloudpickle
安装 python 包
这里要安装的 Python 包位于 tvm/python 目录下。
在 ~/.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
tvmc
TVMC(TVM命令行驱动程序)。
运行 tvmc:
python3 -m tvm.driver.tvmc --help
建立别名,~/.bashrc
:
alias tvmc='python3 -m tvm.driver.tvmc'
之后就可以直接使用:
tvmc --help
测试
在 jupyter notebook 中测试一下:
import tvm
import numpy as np
from tvm import te
def vector_add(n):
""" TVM expression for vector add
"""
A = te.placeholder((n,),name='a')
B = te.placeholder((n,),name='b')
C = te.compute(A.shape,lambda i : A[i] + B[i],name="c")
return A,B,C
n = 100
A,B,C = vector_add(n)
print(type(A),type(A.op),A.dtype,A.shape)
print(type(B),type(B.op),B.dtype,B.shape)
print(type(C),type(C.op),C.dtype,C.shape)
print(A.op.__class__.__bases__[0])