最近和大佬聊天,谈到对于现在项目上部署的一些问题,总觉得各大部署框架对“自家”产品都支持的很好,但是对其他平台可能效果一般.于是聊到通用的部署框架TVM,可能对特定的设备优化不如那些针对“自家”产品优化的好,但是普适性来说还是非常好的,起码很多时候不会因为换了一个硬件平台就得重复编译优化.况且现在TVM还加入了Tensorrt的算子优化,基本上和纯Tensorrt部署性能上差距也不会太大.
目前实验室项目部署大多还是用Tensorrt都没有安装TVM环境,所以这次就来聊聊最近的安装经历.建议在Linux下安装,Win系统上没试过也不想试,毕竟结合之前的经验在Win上总会有一些莫名奇妙的坑,太折磨人了
首先去官网查看教程,一般这种大型框架的教程都十分详细,所以可以直接跟着教程一步步来.
首先看看安装教程,我选择从源码编译,当然也可以直接用docker,看个人选择.大致浏览一遍,可以总结一下步骤:
首先按照步骤先去官网克隆下来源码以及一些依赖
git clone --recursive https://github.com/apache/tvm tvm
,这一步可能有些第三方库会下载失败,所以下载完成后检查一下,缺什么就直接去对应目录下重新git clone
不论是Win还是Linux都最好执行下面两条命令,不然后面编译的时候很可能报错版本匹配不上
git submodule init
git submodule update
其实准备工作不止这些,比如对cmake版本要求要大于3.18,但是很多ubuntu用apt安装的都没有这么高版本,所以需要去源码下载再链接;如果需要cuda还需要安装cuda和cudnn;想要支持Tensorrt还需要预先编译安装Tensorrt,不过这些基本网上都有教程,所以这里不多说.
对于其他预先需要的环境配置,可以执行下面的命令
sudo apt-get update
sudo apt-get install -y python3 python3-dev python3-setuptools gcc libtinfo-dev zlib1g-dev build-essential cmake libedit-dev libxml2-dev
安装llvm一开始我是源码进行安装,但是最后编译的时候总是提示有一个zstd.so找不到,怀疑是版本安装的太新了,于是google一波,直接选择下载二进制文件算了.参考教程很多,我这里随便放一个llvm安装教程.教程上安装的是10.0,我选择的是13.0,至于更新的版本没有尝试,毕竟之前编译最新版本遇到的那个Bug让我太难受了.配置好环境变量之后应该可以看到下面的效果
然后ninja安装也很简单,直接sudo apt install ninja-build
这一步骤是可以省略的,NNPACK主要是优化加速神经网络的框架,可以提高在CPU上的计算效率,但是根据官网说的目前只支持Linux和Mac,Win上貌似不支持.
安装还是源码编译的方式,首先克隆代码然后用ninja编译NNPACK就行了.
git clone --recursive https://github.com/Maratyszcza/NNPACK.git
cd NNPACK
# Add PIC option in CFLAG and CXXFLAG to build NNPACK shared library
sed -i "s|gnu99|gnu99 -fPIC|g" CMakeLists.txt
sed -i "s|gnu++11|gnu++11 -fPIC|g" CMakeLists.txt
mkdir build
cd build
# Generate ninja build rule and add shared library in configuration
cmake -G Ninja -D BUILD_SHARED_LIBS=ON ..
ninja
sudo ninja install
# Add NNPACK lib folder in your ldconfig
echo "/usr/local/lib" > /etc/ld.so.conf.d/nnpack.conf
sudo ldconfig
这里直接复制官网的教程,不过最后添加lib的时候按照上面的会一直提示权限不足,所以google一番可以看到这个解决方案
改为下面的命令执行就好了
sudo sh -c "echo '/usr/local/lib'>> /etc/ld.so.conf.d/nnpack.conf"
到目前为止所有的准备工作算是完成,所以现在就可以开始编译TVM了.首先进入tvm文件夹,新建build文件夹并把config.cmake
复制进来修改配置.
mkdir build
cp cmake/config.cmake build
这里我把llvm,cuda,cudnn,nnpack,tensorrt相关的全部改为ON,然后为了debug最好把中间表示(IR intermediate representation)以及一些其他的执行器也选上
set(USE_GRAPH_EXECUTOR ON)
set(USE_PROFILER ON)
set(USE_RELAY_DEBUG ON)
set(USE_CUDA ON)
set(USE_NNPACK ON)
set(USE_LLVM "/home/shelgi/clang+llvm-13.0.0-x86_64-linux-gnu-ubuntu-20.04/bin/llvm-config --link-static")
set(USE_TENSORRT_CODEGEN ON)
set(USE_TENSORRT_RUNTIME ON)
set(USE_CUDNN ON)
set(HIDE_PRIVATE_SYMBOLS ON)
配置好之后保存,然后开始编译.编译选择cmake或者ninja都可以,如果是cmake就老规矩
cmake ..
make -j12
如果是ninja
cmake .. -G Ninja
ninja
稍微等待编译一会儿,摸摸鱼应该就能顺利看到编译结果(这样一套下来应该不会有什么问题了)
有两种方式,第一种直接添加环境变量,在~/.bashrc里面添加变量
export TVM_HOME=/path/to/tvm
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}
让python去环境变量里面找路径,或者直接进入tvm里的python文件夹进行安装
cd python; python setup.py install
安装好之后还要安装一些依赖
pip3 install --user numpy decorator attrs
pip3 install --user tornado
pip3 install --user tornado psutil 'xgboost<1.6.0' cloudpickle
这里xgboost是为了模型调优搜索,一定要选择低于1.6.0的版本,不然运行的时候会报错说无法引入某些模块,因为新的版本有些模块被移除了
安装好环境之后可以去看看tutorial,里面可以尝试模型编译调优等等,具体的可以参考官网教程
这一步步下来如果都成功那应该就没什么问题了,接下来就是慢慢学习框架使用.
其实还是比较好奇普适性与独家性能优化到底模型推理效率到底差多少,所以最近学习TVM期间也会接着更新比较一下性能差异.