此教程介绍如何用 Relay 编译 ResNet 模型,并将其部署到树莓派。
1 | javascript复制代码import tvm |
在设备上构建 TVM Runtime
首先在远程设备上构建 TVM runtime。
本节和下一节中的所有指令都应在目标设备(例如树莓派)及 Linux 上执行。
由于我们是在本地机器上进行编译,远程设备仅用于运行生成的代码,因此只需在远程设备上构建 TVM runtime。
1 | bash复制代码git clone --recursive https://github.com/apache/tvm tvm |
runtime 构建完成后,在 ~/.bashrc
文件中设置环境变量——用 vi ~/.bashrc
命令来编辑 ~/.bashrc
,添加下面这行代码(假设 TVM 目录在 ~/tvm
中):
1 | ruby复制代码export PYTHONPATH=$PYTHONPATH:~/tvm/python |
执行 source ~/.bashrc
来更新环境变量。
在设备上设置 RPC 服务器
在远程设备(该示例中为树莓派)上运行以下命令,启动 RPC 服务器:
1 | css复制代码python -m tvm.exec.rpc_server --host 0.0.0.0 --port=9090 |
看到如下结果,则表示 RPC 服务器启动成功:
1 | ruby复制代码INFO:root:RPCServer: bind to 0.0.0.0:9090 |
准备预训练模型
注意:确保主机已经(用 LLVM)安装了完整的 TVM。
使用 MXNet Gluon 模型集合 中的预训练模型。更多有关这部分的信息详见 编译 MXNet 模型 教程。
1 | python复制代码from mxnet.gluon.model_zoo.vision import get_model |
为了测试模型,下载一张猫的图片,并转换其格式:
1 | ini复制代码img_url = "https://github.com/dmlc/mxnet.js/blob/main/data/cat.png?raw=true" |
synset 用于将 ImageNet 类的标签,转换为人类更容易理解的单词。
1 | ini复制代码synset_url = "".join( |
以下代码可将 Gluon 模型移植到可移植的计算图上:
1 | ini复制代码# 在 mxnet.gluon 中支持 MXNet 静态计算图(符号)和 HybridBlock |
以下是一些基本的数据工作负载配置:
1 | ini复制代码batch_size = 1 |
编译计算图
用计算图的配置和参数调用 relay.build()
函数,从而编译计算图。但是,不能在具有 ARM 指令集的设备上部署 x86 程序。除了用来指定深度学习工作负载的参数 net
和 params
,Relay 还需要知道目标设备的编译选项。不同选项会导致性能不同。
如果在 x86 服务器上运行示例,可将其设置为 llvm
。如果在树莓派上运行,需要指定它的指令集。若要在真实设备上运行,需将 local_demo
设置为 False。
1 | ini复制代码local_demo = True |
输出结果:
1 | vbnet复制代码/workspace/python/tvm/relay/build_module.py:411: DeprecationWarning: Please use input parameter mod (tvm.IRModule) instead of deprecated parameter mod (tvm.relay.function.Function) |
通过 RPC 远程部署模型
利用 RPC 可将模型从主机部署到远程设备。
1 | ini复制代码# 从远程设备获取 RPC session。 |
输出结果:
1 | bash复制代码TVM prediction top-1: tiger cat |
下载 Python 源代码:deploy_model_on_rasp.py
下载 Jupyter Notebook:deploy_model_on_rasp.ipynb
本文转载自: 掘金