TVM AutoTVM 树莓派4B 调优

细节请参阅官方文档,这里只作相关内容记录和踩坑记录而已。

在树莓派上构建 TVM Runtime

我们只用树莓派跑模型,所以只需要构建 Runtime

网络条件差的话记得更换 apt 的源

git clone --recursive https://github.com/apache/tvm tvm
cd tvm
mkdir build
cp cmake/config.cmake build
cd build
cmake ..
make runtime -j4

如果在 cmake .. 的时候说找不到 cmake 那就

sudo apt update
sudo apt install -y cmake

(我是分割线)

如果在 cmake .. 的时候找不到 llvm 那就

sudo apt install -y llvm

我执行这条指令的时间是 2021年2月19日,清华源 apt 给我装的是 llvm-7

编译好 runtime 之后,我们需要设置 PYTHONPATH 环境变量(如果你用的是 bash,那你编辑 .bashrc,如果是 zsh,那你编辑 .zshrc)

(下面这条命令的 current working directory 为:~,使用的是 zsh)

echo "export PYTHONPATH=$PYTHONPATH:~/tvm/python" >> ~/.zshrc
source ~/.zshrc

在树莓派上配置 RPC Server

由于 Raspberry OS 里,python 默认是 python2.7 ,所以我们这里强制使用 python3

python3 -m tvm.exec.rpc_server --host 0.0.0.0 --port=9090

(Tips:共建和谐未来,建议所有项目都是用 python3, 抛弃python2人人有责)

如果你看到了这样的字眼,说明你成功在树莓派上启动了 RPC 服务器:

INFO:RPCServer:bind to 0.0.0.0:9090

准备 Pre-trained Model

查看 target (-mtriple的值)

➜  ~ gcc -dumpmachine
aarch64-linux-gnu
# 通过 gcc -dumpmachine 即可了解到 -mtriple 要写的值
# 这条指令是在树莓派上运行的
target = tvm.target.Target('llvm -device=arm_cpu -model=bcm2711 -mtriple=aarch64-linux-gnu -mattr=+neon')
# 这个代码是在训练机上运行的

树莓派的 CPU 为 bcm2711,mtriple是aarch64-linux-gnu,mattr 一律写 +neon

踩坑记录(注意事项)

RPC tracker - server 的模式,不能通过 frp 反代使用。

没有公网 IP 的话,必须 VPN 异地组网打洞才可以。

最终决定本地搭建一个 TVM 环境,用服务器进行 training,把模型下载到笔记本虚拟机,然后 tuning raspi