最近在看深度学习编译器相关的工作,其中FlexTensor给我留下了比较深刻的印象,加上这项工作是开源的,所以想看看这份工作的源码。首先是怎么把工程跑起来,FlexTensor倚仗TVM做代码生成,所以首先得安装TVM。
首先给出官方网站的安装教程TVM安装流程-从源码安装,最好的安装步骤就是从上面一步步来,正如教程所说,整个安装过程分两个大步骤:
1.从C++代码构建共享库
2.安装语言支持
首先是获取源码到本地并解压:
在写这篇文章时,tvm源码的版本是v0.8.0,下载下来解压之就可以了,我使用的是WSL2来做这些事情。(写完这篇博客后回头看,奉劝各位能用虚拟机的用虚拟机,能用正儿八经的Ubuntu的就用Ubuntu,WSL这个过程走的有点坎坷,WSL旨在Windows平台下体验Linux开发环境,写轻量级代码没问题,做这种破活确实坑很多)
如果是开发者,这里也可以从GitHub上下载源码,按下不表:
随后进入第一步,构建共享库
一、构建共享库
首先文档中给出了一些对工具链的最低要求,要完成对TVM的安装,这些基本的工具链是不可或缺的,可以直接运行文档里的命令行来完成对最低版本的工具链的安装。
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
这块插入一个小消息,如果按照这个版本来安装工具链,cmake的最低版本应该达不到llvm安装的最低配置,所以cmake应该到官网上下载一个比较新的版本。我是按照一个网上的教程来做的,其实也很简单,你可以选择下载源码到本地来编译,也可以选择下载预编译好的版本来下载,我下载的是预编译好的版本。
解压之,然后给一个软链接让cmake指向这个解压之后的文件夹中的/bin/cmake
然后查看一下当前的cmake版本,应该是已经能正确找到cmake了:
完成这一步之后就是配置config.cmake,在这里可以对TVM进行编译选项配置,这一步也可以通过在命令行里向TVM传入选项来实现,两者均可。
这里可以根据自己的需求来配置config.cmake文件,比如在后端开启CUDA、开启debug帮助、对中间表示(IR)进行debug等。 我在自己的辣鸡轻薄核显本上搭TVM, CUDA这方面有是不可能有的,这辈子不可能有的 很多选项我暂时没有动,但是这里注意TVM在后端使用LLVM为CPU做代码生成,所以config.cmake中的LLVM支持应该是要打开的,如下图:
所以这里引入的另一个问题就是安装LLVM了,和cmake一样,可以从官网上下载源码到本地编译,不过这个花费的时间很长。还可以从官网上下载预编译好的版本,我是下载的预编译版本。
因为TVM对LLVM的版本要求并不高(>=Version 4.0),所以在官网上找一个适合自己系统的版本就可以了,我选择的是10.0.0:
下载预编译版本到本地后,可以参考这篇博客中的步骤来完成LLVM的配置。安装完成之后应该可以直接在命令行中找到LLVM,如下图:
随后按照教程上的要求完成接下来的配置,可以手动设置来帮助TVM找到LLVM的配置文件,或者在只有一个LLVM版本可用时,也可以直接使用set(USE_LLVM ON)来让TVM自动寻找可用版本的LLVM。还有对于pytorch用户,可以选择像第三个箭号说明的那样完成设置,这部分也是直接在config-cmake中直接添加或者简单的修改即可,因为我习惯用pytorch,所以在最后加入了:
set(USE_LLVM "PATH/TO/LLVM-CONFIG --link-static")
set(HIDE_PRIVATE_SYMBOLS_ON)
这两行,注意PATH/TO/LLVM-CONFIG用改替换成自己的路径。
然后就可以去编译TVM源码和相关支持库了:
也就是在build目录下分别执行这两个命令:
cmake ..
make -j4 # 启用四个线程编译,如果
这将会花费一段时间,请安静等待,完成之后应该如下所示:
然后这里提到,其实tvm文件夹中已经有一个写好的makefile文件可以帮助我们完成上述的所有动作。还说明了可以将build文件夹的位置建立在其他地方,但是这样需要在环境变量中使用TVM_BUILD_PATH指明一下build文件夹的位置,如果不指明的话就默认在tvm文件夹下,等等。
二、安装语言支持
注意,这里需要python的版本大于3.8,起码我这边是这样的,可能是因为我用的是WSL2,所以在最上面的工具链最低要求安装是满足不了的,安装的python是3.6的版本,故在此出错。如果你没有遇到这个坎,说明你可能用的是虚拟机或者真正的Ubuntu系统,这里可以略过。
嗯,还有就是要提前安装numpy…,否则也会直接寄:
sudo apt install python3-numpy
sudo apt install python3-scipy # 唉,顺手把这个也装了吧
# 如果你不确定软件包的名字可以执行下面的命令行,看看有哪些numpy的软件包可用
apt-cache search numpy
然后看官方文档,这里提到有两种方法安装python语言支持,我们选择第二种:
也就是进入TVM目录下的python文件夹,执行以下命令行:
python setup.py install --user
# python3.8 setup.py install ---user
等待它执行完成,这时候应该会如下图所示:
接下来就是安装具体的依赖库,依照官方教程所言有些是可选的:
其中必要的依赖就是第一条,也就是在命令行中执行以下命令:
pip3 install --user numpy decorator attrs
我当时出了一点小错误:
如果你也遇到了同样的问题(没有就算了),说明还需要安装一些库:
sudo apt install python3.8-dev # 不一定叫python3.8-dev,你得找最适合自己的
然后再执行安装依赖库的命令行,这下应该可以了:
RPC Tracker和auto-tuning可以按照自己的喜好来添加,我安装了一个auto-tuning,因为这是AutoTVM的精华所在。也就是执行以下命令行即可:
pip3 install --user tornado psutil xgboost cloudpickle
在这里我也多少踩了一些小坑,执行官方文档中的命令行时出现了以下报错:
那就去安装pybind11去呗:
安装完之后发现,又有新的报错:
接着安呗,这些都是安装scipy需要的一些库,从这里找到的解决方案:
sudo apt install gfortran libopenblas-dev liblapack-dev
pip3 install --user pythran
然后就是开始安装scipy,这里应该也有些依赖要准备一下,可以参考一下这篇文章的做法,我们从源码去安装一下scipy可能会好一点,在这里我选择的是scipy v1.4.0的这个版本,我下载的是这个:
下载到本地之后安装一下,应该是可以行得通的:
说了一大堆,这其实都是在执行完:
pip3 install --user tornado psutil xgboost cloudpickle
这个命令行之后的一些小错误和其解决方案,现在可以再试着执行一下上面的命令行,看看还有没有什么问题,我这儿是没问题了:
到这应该该做的都做了,看看tvm能不能用吧:
BTW,这里貌似对cmake的版本有点要求,cmake version > 3.10,WSL上从apt里安装的cmake貌似不太行,不过正如前面所述,我使用的是3.17的预编译版本,这里应该没啥问题,xgboost是Tianqi Chen et al做的一篇漂亮的工作,可以去读一下他们的这篇paper。
最后还有一些在MacBook M1上的额外tips,在此按下不表,有需求的自己可以去摸索一下。
大概就是这些东西,最后就是TVM还有docker提供,也可以用那个,当然也欢迎踩上面的坑。写在最后是不是很气人?:)
Have fun with TVM!