在 Jetson Nano 上部署预训练模型

Apache TVM 是一个端到端的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 → https://tvm.hyper.ai/

此教程介绍如何用 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)

用 synset 将 ImageNet 类的标签转换为人类更容易理解的单词。

synset_url = "".join(
    [
        "https://gist.githubusercontent.com/zhreshold/",
        "4d0b62f3d01426887599d4f7ede23ee5/raw/",
        "596b27d23537e5a1b5751d2b0481ef172f58b539/",
        "imagenet1000_clsid_to_human.txt",
    ]
)
synset_name = "imagenet1000_clsid_to_human.txt"
synset_path = download_testdata(synset_url, synset_name, module="data")
with open(synset_path) as f:
    synset = eval(f.read())

以下代码可将 Gluon 模型移植到可移植的计算图上:

# 在 mxnet.gluon 中支持 MXNet 静态图(符号)和 HybridBlock
shape_dict = {"data": x.shape}
mod, params = relay.frontend.from_mxnet(block, shape_dict)
# 添加 softmax 算子提高概率
func = mod["main"]
func = relay.Function(func.params, relay.nn.softmax(func.body), None, func.type_params, func.attrs)

以下是一些基本的数据工作负载配置:

batch_size = 1
num_classes = 1000
image_shape = (3, 224, 224)
data_shape = (batch_size,) + image_shape

编译计算图

用计算图的配置和参数调用 relay.build() 函数,从而编译计算图。但是,不能在具有 ARM 指令集的设备上部署 x86 程序。除了用来指定深度学习工作负载的参数 netparams,Relay 还需要知道目标设备的编译选项。不同选项会导致性能不同。

如果在 x86 服务器上运行示例,可将其设置为 llvm。如果在 Jetson Nano 上运行,需要将其设置为 nvidia/jetson-nano。若要在真实设备上运行,需将 local_demo 设置为 False。

local_demo = True

if local_demo:
    target = tvm.target.Target("llvm")
else:
    target = tvm.target.Target("nvidia/jetson-nano")
    assert target.kind.name == "cuda"
    assert target.attrs["arch"] == "sm_53"
    assert target.attrs["shared_memory_per_block"] == 49152
    assert target.attrs["max_threads_per_block"] == 1024
    assert target.attrs["thread_warp_size"] == 32
    assert target.attrs["registers_per_block"] == 32768

with tvm.transform.PassContext(opt_level=3):
    lib = relay.build(func, target, params=params)

# 在 `relay.build` 之后,会得到三个返回值:计算图,库和新参数,因为我们做了一些优化,它们会改变参数,但模型的结果不变。

# 将库保存在本地临时目录中。
tmp = utils.tempdir()
lib_fname = tmp.relpath("net.tar")
lib.export_library(lib_fname)

输出结果:

/workspace/python/tvm/relay/build_module.py:348: DeprecationWarning: Please use input parameter mod (tvm.IRModule) instead of deprecated parameter mod (tvm.relay.function.Function)
  DeprecationWarning,
/workspace/python/tvm/driver/build_module.py:267: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
  "target_host parameter is going to be deprecated. "

通过 RPC 远程部署模型

利用 RPC 可将模型从主机部署到远程设备。

# 从远程设备获取 RPC session。
if local_demo:
    remote = rpc.LocalSession()
else:
    # 下面是教程环境,把这个改成你目标设备的 IP 地址
    host = "192.168.1.11"
    port = 9091
    remote = rpc.connect(host, port)

# 将库上传到远程设备,并加载它
remote.upload(lib_fname)
rlib = remote.load_module("net.tar")

# 创建远程 runtime 模块
if local_demo:
    dev = remote.cpu(0)
else:
    dev = remote.cuda(0)

module = runtime.GraphModule(rlib["default"](dev))
# 设置输入数据
module.set_input("data", tvm.nd.array(x.astype("float32")))
# 运行
module.run()
# 获取输出
out = module.get_output(0)
# 得到排第一的结果
top1 = np.argmax(out.numpy())
print("TVM prediction top-1: {}".format(synset[top1]))

输出结果:

TVM prediction top-1: tiger cat
### 回答1: 要在Jetson Nano部署YoloX,您可以按照以下步骤进行操作: 1. 安装JetPack SDK:JetPack SDK是NVIDIA Jetson平台的软件开发工具包,包括操作系统、CUDA、TensorRT等必要组件。您可以从NVIDIA官网下载并安装适用于Jetson Nano的JetPack SDK。 2. 安装PyTorch:YoloX是基于PyTorch框架实现的,因此您需要在Jetson Nano上安装PyTorch。您可以使用pip命令安装PyTorch,也可以从源代码编译安装。 3. 下载YoloX代码:您可以从YoloX的GitHub仓库下载源代码,并将其复制到Jetson Nano上。 4. 下载预训练模型:YoloX需要使用预训练模型进行目标检测。您可以从YoloX的GitHub仓库下载预训练模型,并将其复制到Jetson Nano上。 5. 运行YoloX:在Jetson Nano上运行YoloX,您需要使用Python脚本调用YoloX的API,并传入相应的参数。您可以参考YoloX的文档和示例代码进行操作。 需要注意的是,由于Jetson Nano的计算资源有限,可能会影响YoloX的性能。您可以通过调整模型参数、使用更高效的算法等方式来优化YoloX的性能。 ### 回答2: Jetson Nano是一款小型、低功耗的人工智能计算机,而YOLOX则是一种基于目标检测的模型,用于实时识别图像中的对象。在Jetson Nano部署YOLOX可以让我们使用这个强大的小型计算机进行高效的目标检测。 首先,我们需要准备Jetson Nano开发板和一台电脑。在电脑上,我们需要进行一些准备工作,包括安装JetPack和配置SSH远程连接。JetPack是一种能够在Jetson Nano上安装所需软件的软件包,其中包括CUDA、cuDNN等开发工具,这些工具可以支持将YOLOX部署Jetson Nano上。SSH远程连接可以使我们在Jetson Nano上直接使用电脑的命令行。 接下来,我们需要下载YOLOX的源代码,并进行配置和编译。具体来说,我们需要安装Python3、Numpy、Pillow、torch、opencv-python等软件包,并将其与Jetson Nano的架构匹配。这些工具可以使我们更加方便地进行模型训练和推理。 然后,我们需要选择适合我们的数据集并进行训练。这里我们可以使用COCO数据集或其他开源数据集进行训练。在训练过程中,我们需要进行超参数的调整和优化,以达到最佳的目标检测效果。 最后,在经过训练的YOLOX模型上运行推理,并确定模型在不同场景下的准确率。为了实现实时目标检测,我们可以使用OpenCV库将摄像头的实时图像输入到YOLOX模型中,以检测图像中的对象。 总之,在Jetson Nano部署YOLOX需要执行一系列复杂的步骤,包括软件安装、数据集训练和模型推理。我们需要耐心和精力投入,才能最终实现高效的目标检测。 ### 回答3: Jetson Nano是针对边缘计算开发的一款小型计算机,而YoloX是一种新型的目标检测算法,可以在低功耗设备上快速识别目标。在Jetson Nano部署YoloX可以让我们在嵌入式设备上实现实时目标检测,非常有用。 部署YoloX的过程相对复杂,但是我们可以按照下面的步骤逐步实现: 1. 安装JetPack 4.4+: JetPack是NVIDIA官方提供的一套软件开发工具包,其中包含了CUDA、cuDNN等深度学习库。首先需要下载并安装 JetPack 4.4+,具体安装步骤可以参考官网提示。 2. 安装OpenCV:在Jetson Nano上运行YoloX需要使用OpenCV库,下载之后进行安装,安装命令如下: ``` sudo apt-get update sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev libv4l-dev ``` 3. 下载并编译YoloX源码:从 GitHub 下载 YoloX 源码,然后进行编译。编译命令如下: ``` git clone https://github.com/Megvii-BaseDetection/YOLOX.git cd YOLOX sudo apt-get install python3-pip pip3 install Cython numpy sudo apt-get install ninja-build python3 setup.py build develop ``` 注:为了编译 YoloX 代码,您需要一张 NVIDIA GPU 卡,并配置好 CUDA 和 cuDNN。 4. 下载预训练模型权重:在进行模型训练之前,需要准备一个已经训练好的模型权重。您可以从 YoloX 官方仓库 处下载预训练的权重,或是使用自己的数据集训练出自己的模型权重。 5. 测试模型:在部署完成后,我们可以使用 YoloX 官方提供的测试脚本来测试模型,具体的测试命令如下: ``` python tools/demo.py image -n yolox-s-416 --path assets/dog.jpg --conf 0.25 --nms 0.45 ``` 这个脚本将会加载预训练的 yolox-s 模型,然后使用一张测试图片(dog.jpg)进行测试,并将结果保存到 output 文件夹下。 总结: 在这篇文章中,我们介绍了在Jetson Nano部署YoloX的过程及方法,从安装基本的JetPack到编译源代码,再到下载预训练模型,最后通过测试脚本检验模型的准确性。这个过程可能比较繁琐,需要好好的理解和操作。随着AI的深入应用,我们相信越来越多的开发者、技术爱好者们会对边缘计算的优化、应用上有更多的发现和深入研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值