TVM + ubuntu18.04 源码编译与安装

下载代码

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 makeninja 等。为了可能地更快增量编译可以使用 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.solibtvm_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.solibtvm_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.solibtvm_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])

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值