news 2026/6/15 13:56:20

【TVM 教程】设置 RPC 系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【TVM 教程】设置 RPC 系统

TVM 现已更新到 0.21.0 版本,TVM 中文文档已经和新版本对齐。

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

概述

远程过程调用(RPC)是 Apache TVM 中非常重要和有用的功能,它允许我们在真实硬件上运行已编译好的神经网络(NN)模型,无需手动操作远程设备,输出结果会通过网络自动返回。

通过省去一些人工操作,比如将输入数据转储到文件、将导出的神经网络模型拷贝到远程设备、设置设备用户环境、将输出结果拷贝回主机开发环境,RPC 极大地提升了开发效率。

此外,由于只有已编译神经网络模型的执行部分运行在远程设备上,所有其他部分都运行在主机开发环境中,因此可以使用任何 Python 包来完成预处理和后处理工作。

RPC 在以下两种情况下特别有用:

RPC 的队列和资源管理机制能够让硬件设备为众多开发者和测试任务提供服务,确保编译后的神经网络模型正常运行。

除了已编译的神经网络模型,其他所有处理都在主机开发环境中运行,因此可以轻松实现复杂的预处理和后处理逻辑。

推荐的架构

Apache TVM 的 RPC 系统包含三个工具:RPC Tracker、RPC Proxy 和 RPC Server。RPC Server 是必要组件,一个基本的 RPC 系统即使没有 RPC Proxy 和 RPC Tracker 也可以正常运行。RPC Proxy 在无法直接访问 RPC Server 时使用。强烈推荐在系统中添加 RPC Tracker,它提供了许多有用的功能,例如:队列能力、多 RPC Server 管理、通过 key 而非 IP 地址管理 RPC Server。

如图所示,由于机器 A 与机器 C、D 之间没有物理连接通道,因此我们在机器 B 上设置了一个 RPC Proxy。RPC Tracker 会为每个 RPC key 管理一个请求队列。任何用户都可以随时通过一个 RPC key 请求一个 RPC Server,如果有空闲的匹配 key 的 RPC Server,则分配给用户,否则请求将排入队列,稍后再检查是否可用。

设置 RPC 追踪器和 RPC 代理

一般来说,RPC 追踪器和 RPC 代理只需在主机(例如开发服务器或 PC)上运行,它们不依赖于设备端环境。只需根据 TVM 文档完成 TVM 安装后,在相应主机上执行以下命令即可:

$ python3 -m tvm.exec.rpc_tracker --host RPC_TRACKER_IP --port 9190 --port-end 9191

$ python3 -m tvm.exec.rpc_proxy --host RPC_PROXY_IP --port 9090 --port-end 9091 --tracker RPC_TRACKER_IP:RPC_TRACKER_PORT

请根据实际环境替换命令中的 RPC_TRACKER_IP、RPC_TRACKER_PORT、RPC_PROXY_IP 及端口号。port-end参数可避免服务绑定到意外的端口号,这可能导致其他服务无法正确连接,特别是在自动化测试系统中,这一点尤为重要。

设置 RPC 服务器

TVM 社区提供了多个 RPC 服务器实现,例如:apps/android_rpcapps/cpp_rpcapps/ios_rpc。以下内容只聚焦于 Python 版本的 RPC Server(python/tvm/exec/rpc_server.py)。其他版本请参考对应目录下的文档。

RPC Server 需运行在设备端,通常依赖于 xPU 驱动、增强版支持 xPU 的 TVM 运行时及其他库,因此请先安装相关依赖组件,例如 KMD 驱动,并确保所需动态库路径已加入LD_LIBRARY_PATH环境变量。

如果可以在设备上直接设置编译环境(无需交叉编译),请参考 /docs/getting-started/installing-tvm/install-from-source 完成编译,并直接跳转至 步骤 3:启动 RPC Server。

1. 交叉编译 TVM 运行时

我们使用 CMake 来管理编译过程,对于交叉编译,CMake 需要一个工具链文件来获取所需的信息,因此您需要根据设备平台准备该文件。下面是一个示例,适用于 CPU 为 64 位 ARM 架构且操作系统为 Linux 的设备机器。

set(CMAKE_SYSTEM_NAME Linux) set(root_dir "/XXX/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu") set(CMAKE_C_COMPILER "${root_dir}/bin/aarch64-linux-gnu-gcc") set(CMAKE_CXX_COMPILER "${root_dir}/bin/aarch64-linux-gnu-g++") set(CMAKE_SYSROOT "${root_dir}/aarch64-linux-gnu/libc") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

在 TVM 源码根目录下执行以下命令可完成交叉编译(根据需要在config.cmake中启用额外选项):

$ mkdir cross_build $ cd cross_build $ cp ../cmake/config.cmake ./ # 可能需要启用如 USE_OPENCL、USE_xPU 的选项。 $ sed -i "s|USE_LLVM.*)|USE_LLVM OFF)|" config.cmake $ sed -i "s|USE_LIBBACKTRACE.*)|USE_LIBBACKTRACE OFF)|" config.cmake $ cmake -DCMAKE_TOOLCHAIN_FILE=/YYY/aarch64-linux-gnu.cmake -DCMAKE_BUILD_TYPE=Release .. $ cmake --build . -j -- runtime $ cd ..

2.打包并部署到设备端

使用如下命令打包 Python 版本 RPC Server:

$ git clean -dxf python $ cp cross_build/libtvm_runtime.so python/tvm/ $ tar -czf tvm_runtime.tar.gz python

然后将压缩包tvm_runtime.tar.gz复制到你的具体设备上,并在该设备上通过如下所示的命令正确设置环境变量PYTHONPATH

$ tar -xzf tvm_runtime.tar.gz $ export PYTHONPATH=`pwd`/python:${PYTHONPATH}

3. 启动 RPC Server

根据环境修改以下命令中的 RPC_TRACKER_IP、RPC_TRACKER_PORT、RPC_PROXY_IP、RPC_PROXY_PORT 和 RPC_KEY,并在设备端执行启动:

# 如果使用了 RPC Proxy: $ python3 -m tvm.exec.rpc_server --host RPC_PROXY_IP --port RPC_PROXY_PORT --through-proxy --key RPC_KEY # 如果未使用 RPC Proxy: $ python3 -m tvm.exec.rpc_server --tracker RPC_TRACKER_IP:RPC_TRACKER_PORT --key RPC_KEY

验证 RPC 系统

$ python3 -m tvm.exec.query_rpc_tracker --host RPC_TRACKER_IP --port RPC_TRACKER_PORT

通过上述命令,我们可以查询所有可用的 RPC 服务器以及队列状态。如果你有 3 个通过 RPC 代理连接到 RPC 跟踪器的 RPC 服务器,那么输出结果应如下所示。

Tracker address RPC_TRACKER_IP:RPC_TRACKER_PORT Server List ---------------------------- server-address key ---------------------------- RPC_PROXY_IP:RPC_PROXY_PORT server:proxy[RPC_KEY0,RPC_KEY1,RPC_KEY2] ---------------------------- Queue Status --------------------------------------- key total free pending --------------------------------------- RPC_KEY0 0 0 3 ---------------------------------------

故障排查

1. 由于设备上缺少numpy,导致无法启动 RPC Server

在一些依赖于 RPC 服务器的 Python 文件中,导入了numpy包,而消除这种导入关系是比较困难的。对于某些设备来说,交叉编译numpy也非常困难。

TVM Runtime 实际并不依赖numpy,因此一个简单的解决方法是创建一个「空」的numpy。只需将以下内容保存为numpy.py文件,放入如/usr/local/lib/python3.9/site-packages等路径中即可:

class bool_: pass class int8: pass class int16: pass class int32: pass class int64: pass class uint8: pass class uint16: pass class uint32: pass class uint64: pass class float16: pass class float32: pass class float64: pass class float_: pass class dtype: def __init__(self, *args, **kwargs): pass class ndarray: pass def sqrt(*args, **kwargs): pass def log(*args, **kwargs): pass def tanh(*args, **kwargs): pass def power(*args, **kwargs): pass def exp(*args, **kwargs): pass

2. 由于设备端缺少cloudpickle,导致 RPC 服务器无法启动。

由于cloudpickle是一个纯 Python 包,因此只需将其从其他机器复制到设备机器上的目录(例如/usr/local/lib/python3.9/site-packages),即可解决该问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 2:12:41

【Triton 教程】triton_language.load

Triton 是一种用于并行编程的语言和编译器。它旨在提供一个基于 Python 的编程环境,以高效编写自定义 DNN 计算内核,并能够在现代 GPU 硬件上以最大吞吐量运行。 更多 Triton 中文文档可访问 →triton.hyper.ai/ triton.language.load(pointer, maskNo…

作者头像 李华
网站建设 2026/6/12 18:52:09

二叉树的构建和遍历、查询

一、构建二叉树1.引入:如图,树的一个节点拥有三个关键部分,分别是左子节点(lChild)、右子节点(rChild)和值(data)。就拿有序二叉树来说,它的特点是&#xff1…

作者头像 李华
网站建设 2026/6/14 21:37:51

使用x64dbg进行加密狗复制的步骤

使用x64dbg进行加密狗复制的步骤准备工作确保拥有合法的加密狗硬件和软件授权,仅用于学习或授权逆向工程。安装x64dbg调试器,并准备好目标程序的加密狗驱动及配套软件。分析加密狗通信运行目标程序并使用x64dbg附加进程。在调试器中设置断点,…

作者头像 李华
网站建设 2026/6/13 22:55:55

从 IT 技术岗转行网络安全,到底值不值得投入时间和精力?

2024年的年前年后对于互联网人都不是一个太平的时间,互联网大厂的“裁员潮”愈演愈烈。京东裁员横跨多个板块,比例在 10-30%。有赞两轮裁员近七成,腾讯也不例外。虽已春暖花开,大厂却仍“寒冬正至”。 互联网行业迎来寒冬&#xf…

作者头像 李华
网站建设 2026/6/14 13:52:03

国密一卡通系统实现访客全流程智能化管理,通过国密算法保障数据安全。系统以管理中心为核心,集成访客管理、人行通道、门禁控制、电梯控制四大模块,支持人脸/卡双认证。

以 “国密一卡通管理中心” 为核心枢纽,通过统一的密钥管理和数据交互,实现 访客管理、人行通道、门禁控制、电梯控制 四大场景的智能化联动,形成“一卡(或人脸)通”的闭环管理模式。各子系统间通过标准接口协议&#…

作者头像 李华
网站建设 2026/6/14 2:40:42

枪手榜首代价大 后防三将伤停陷危机

在刚刚结束的英超联赛中,阿森纳虽然2-1艰难战胜副班长狼队,继续保持2分领跑优势,但这场胜利却付出了沉重代价。主力后卫本怀特在比赛中拉伤腿筋,成为枪手后防线最新一位进入伤病名单的关键球员,为球队的赛季冲刺阶段蒙…

作者头像 李华