1.背景
TVM是一个开源的机器学习编译器栈,用于优化和编译深度学习模型,以在各种硬件平台上实现高效性能。以下是关于TVM的详细介绍:
- TVM的目标是将深度学习模型的优化和编译过程自动化,以便开发人员可以轻松地将其模型部署到各种硬件平台上,包括CPU、GPU、FPGA等。
- TVM的核心功能包括自动优化、代码生成和硬件抽象。它可以根据硬件平台的特点自动调整模型的计算图,生成高效的代码,并通过硬件抽象层与底层硬件交互。
- TVM支持多种深度学习框架,包括TensorFlow、PyTorch、MXNet等。这意味着开发人员可以使用他们熟悉的框架来开发模型,并将其转换为TVM可优化的格式。
- TVM还具有可扩展性和灵活性。它允许开发人员自定义优化策略和硬件后端,以适应特定的应用场景和硬件平台。
- 在性能方面,TVM通过优化计算图和利用硬件特性来提高模型的执行效率。它还可以与其他编译器和优化工具集成,以进一步提高性能。
- 最后,TVM是一个开源项目,得到了广泛的社区支持和贡献。这意味着开发人员可以从社区中获取支持和帮助,并与其他人共享他们的工作和成果。
TVM可以在ARM开发板上进行部署和优化。以下是TVM在ARM开发板上的一些应用和优化方法:
- 模型优化:TVM可以根据ARM开发板的硬件特性,自动优化深度学习模型的计算图,以提高执行效率。它可以通过减少计算量、优化内存访问和利用硬件加速等方法来改进模型性能。
- 代码生成:TVM可以生成适应ARM开发板的机器代码。它可以根据ARM的指令集和硬件特性,生成高效的汇编代码或C++代码,以实现模型的高效执行。
- 硬件抽象:TVM通过硬件抽象层与底层硬件交互,可以屏蔽不同ARM开发板之间的硬件差异。这意味着开发人员可以在不同的ARM开发板上使用相同的TVM接口和工具链,简化了开发和部署过程。
- 深度学习框架支持:TVM支持多种深度学习框架,包括TensorFlow、PyTorch等。开发人员可以使用他们熟悉的框架来开发模型,并将其转换为TVM可优化的格式,以便在ARM开发板上进行部署和优化。
- 自定义优化策略和硬件后端:TVM具有可扩展性和灵活性,允许开发人员自定义优化策略和硬件后端。这意味着开发人员可以根据ARM开发板的具体特性和需求,定制适合该平台的优化策略和硬件后端,以进一步提高性能。
- 社区支持和贡献:TVM是一个开源项目,得到了广泛的社区支持和贡献。开发人员可以从社区中获取支持和帮助,并与其他人共享他们的工作和成果,以推动TVM在ARM开发板上的应用和优化。
2. 源码安装
(1)下载源码
TVM源码地址:https://github.com/apache/tvm/tags
通过Downloads下载就行了。
(2)详细步骤
根据博客在RK3588 CPU 安装TVM - 知乎
第1步-第3步都可以按照博主的步骤来
step1:准备环境
sudo apt-get update sudo apt-get install -y python3 python3-dev python3-setuptools gcc libtinfo5 libtinfo-dev zlib1g-dev build-essential cmake libedit-dev libxml2-dev
如果出现CMake版本不匹配时可以通过源码安装。采用源码方式安装3.18.6版本。源码下载路径:https://cmake.org/files/
$ tar zxvf cmake-3.18.6.tar.gz cmake-3.18.6$ ./configure cmake-3.18.6$ make -j4 cmake-3.18.6$ sudo make install 重启设备
step2:查看(1)的源码下载下来
tar zxvf apache-tvm-src-v0.10.0.tar.gz cd apache-tvm-src-v0.10.0 mkdir build cp cmake/config.cmake build
step3:准备llvm
TVM的CPU代码生成需要LLVM(4.0或者更高版本)。
下载预编译的llvm 14.0.0版本 https://github.com/llvm/llvm-project/releases/tag/llvmorg-14.0.0
解压到指定路径,并将解压后的bin目录添加到PATH。
tar xvf clang+llvm-14.0.0-aarch64-linux-gnu.tar.xz vim ~/.bashrc export PATH=$PATH:/home/firefly/clang+llvm-14.0.0-aarch64-linux-gnu/bin source ~/.bashrc
在build/config.cmake 编辑set(USE_LLVM /home/username/clang+llvm-14.0.0-aarch64-linux-gnu/bin/llvm-config)
set(USE_LLVM ON):这里的ON在build/config.cmake 中替换掉
set(USE_CCACHE AUTO) 加速TVM编译
step4:开始编译
cd build
cmake .. -G Ninja
ninja
step5:安装Python版本的tvm
如果相关的库没有安装,根据提示进行安装即可,我将我的贴出来
sudo vim ~/.bashrc
export TVM_HOME=/path/to/tvm # 编译的python/tvm路径
# export TVM_HOME=/home/ubuntu/apache-tvm-src-v0.14.0/python/tvm
# export PYTHONPATH=$TVM_HOME/python3.7:${PYTHONPATH}
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}
source ~/.bashrc
cd /home/ubuntu/apache-tvm-src-v0.10.0/python
python3.7 setup.py install --user # 我的是3.7,根据自己的修改
到此,已经安装完成
3. 样例执行
1、下载模型
wget https://github.com/onnx/models/raw/b9a54e89508f101a1611cd64f4ef56b9cb62c7cf/vision/classification/resnet/model/resnet50-v2-7.onnx
2、编辑脚本 tvmcpythonintro.py
from tvm.driver import tvmc
model = tvmc.load('resnet50-v2-7.onnx')
tvmc.tune(model, target="llvm")
package = tvmc.compile(model, target="llvm", tuning_records = "records.log")
result = tvmc.run(package, device="cpu")
print(result )