在 Jetson Nano 上部署预训练模型
备注
单击 此处 下载完整的示例代码
作者:BBuf
此教程介绍如何用 Relay 编译 ResNet 模型,并将其部署到 Jetson Nano。
import tvm
from tvm import te
import tvm.relay as relay
from tvm import rpc
from tvm.contrib import utils, graph_executor as runtime
from tvm.contrib.download import download_testdata
在 Jetson Nano 上构建 TVM Runtime
第一步是在远程设备上构建 TVM runtime。
备注
本节和下一节中的所有指令都应在目标设备(例如 Jetson Nano)及 Linux 上执行。
由于我们是在本地机器上进行编译,远程设备仅用于运行生成的代码,因此只需在远程设备上构建 TVM runtime。
git clone --recursive https://github.com/apache/tvm tvm
cd tvm
mkdir build
cp cmake/config.cmake build
cd build
cmake ..
make runtime -j4
备注
如果要用 Jetson Nano 的 GPU 进行推理,需要在 config.cmake 中开启 CUDA 选项,即 set(USE_CUDA ON)。
runtime 构建完成后,在 ~/.bashrc
文件中设置环境变量。可以用 vi ~/.bashrc
命令来编辑 ~/.bashrc
,添加下面这行代码(假设 TVM 目录在 ~/tvm
中):
export PYTHONPATH=$PYTHONPATH:~/tvm/python
执行 source ~/.bashrc
来更新环境变量。
在设备上设置 RPC 服务器
若要启动 RPC 服务器,请在远程设备(示例中为 Jetson Nano)上运行以下命令:
python -m tvm.exec.rpc_server --host 0.0.0.0 --port=9091
看到如下结果,则表示 RPC 服务器启动成功:
INFO:RPCServer:bind to 0.0.0.0:9091
准备预训练模型
注意:确保主机已经(用 LLVM)安装了完整的 TVM。
使用 MXNet Gluon 模型集合 中的预训练模型。更多有关这部分的信息详见 编译 MXNet 模型 教程。
from mxnet.gluon.model_zoo.vision import get_model
from PIL import Image
import numpy as np
# 获取模型
block = get_model("resnet18_v1", pretrained=True)
为了测试模型,下载一张猫的图片,并转换其格式:
img_url = "https://github.com/dmlc/mxnet.js/blob/main/data/cat.png?raw=true"
img_name = "cat.png"
img_path = download_testdata(img_url, img_name, module="data")
image = Image.open(img_path).resize((224, 224))
def transform_image(image):
image = np.array(image) - np.array([123.0, 117.0, 104.0])
image /= np.array([58.395, 57.12, 57.375])
image = image.transpose((2, 0, 1))
image = image[np.newaxis, :]
return image
x = transform_image(image)