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 做好准备。


如何从源码构建和安装 TVM(On Ubuntu 20.04 X86-64)

step 1: 获取源码

执行如下命令获取 TVM 及其依赖的源码:

$ git clone --recursive https://github.com/apache/tvm tvm

注:

如果第三方依赖下载过慢,则可以稍后在 tvm 目录中执行如下命令单独更新第三方依赖:

$ git submodule init
$ git submodule update

step 2: 选择构建工具

构建工具可以是GNU makeninja等。为了可能地更快增量编译,这里使用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.solibtvm_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.solibtvm_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

注:

修改完成后,上述配置对之后新建的 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

References


下一篇:TVM 篇(2):如何使用 TVMC 编译和优化模型

上一篇:上一级目录

首页