设置 RPC 系统
远程过程调用(RPC)是 Apache TVM 的一个非常重要且有用的功能,它允许我们在实际硬件上运行编译后的神经网络(NN)模型,而无需触及远程设备,输出结果将通过网络自动传回。
通过消除手动工作,如将输入数据转储到文件、将导出的 NN 模型复制到远程设 备、设置设备用户环境以及将输出结果复制到主机开发环境,RPC 极大地提高了开发效率。
此外,由于仅在编译后的 NN 模型的远程设备上运行执行部分,所有其他部分都在主机开发环境上运行,因此可以使用任何 Python 包来执行预处理和后处理工作。
RPC 在以下两种情况下非常有帮助
-
硬件资源有限
RPC 的队列和资源管理机制可以使硬件设备为许多开发人员和测试作业正确运行编译后的 NN 模型。
-
早期端到端评估
除编译后的 NN 模型外,所有其他部分都在主机开发环境上执行,因此可以轻松实现复杂的预处理或后处理。
建议的架构
Apache TVM RPC 包含 3 个工具,RPC 追踪器、RPC 代理和 PRC 服务器。RPC 服务器是必不可少的,RPC 系统可以在没有 RPC 代理和 RPC 追踪器的情况下正常工作。只有在无法直接访问 RPC 服务器时才需要 RPC 代理。强烈建议在 RPC 系统中添加 RPC 追踪器,因为它提供许多有用的功能,例如队列功能、多个 RPC 服务器的管理以及通过密钥而不是 IP 地址管理 RPC 服务器。
如上图所示,因为机器 A 和机器 D, C 之间没有物理连接通道,所以我们在机器 B 上设置了一个 RPC 代理。RPC 追踪器管理每个 RPC 密钥的请求队列,每个用户都可以随时通过 RPC 密钥从 RPC 追踪器请求一个 RPC 服务器,如果存在具有相同 RPC 密钥的空闲 RPC 服务器,则 RPC 追踪器将该 RPC 服务器分配给用户,如果当前没有空闲的 RPC 服务器,则该请求将放入该 RPC 密钥的请求队列中,并稍后进行检查。
设置 RPC 追踪器和 RPC 代理
通常情况下,RPC 追踪器和 RPC 代理只需要在主机机器上运行,例如,开发服务器或 PC,它们不需要依赖于设备机器的任何环境,因此在根据官方文档 https://tvm.apache.org/docs/install/index.html 安装 Apache TVM 后,在相应的机器上执行以下命令即可完成设置。
-
RPC 追踪器
$ python3 -m tvm.exec.rpc_tracker --host RPC_TRACKER_IP --port 9190 --port-end 9191
-
RPC 代理
$ 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 服务器
在我们的社区中,有多个 RPC 服务器实现,例如 apps/android_rpc
、apps/cpp_rpc
、apps/ios_rpc
,以下内容只关注由 python/tvm/exec/rpc_server.py
实现的 Python 版本 RPC 服务器的设置说明,请参阅其相应目录的文档以获取其他版本 RPC 服务器的设置说明。
RPC 服务器需要在设备机器上运行,通常会依赖于 xPU 驱动程序、带有 xPU 支持的增强 TVM 运行时以及其他库,因此请先设置相关组件,例如安装 KMD 驱动程序,确保从环境变量 LD_LIBRARY_PATH
中可以找到所需的动态库。
如果可以在设备机器上设置所需的编译环境,即不需要进行交叉编译,则只需按照 https://tvm.apache.org/docs/install/from_source.html 中的说明编译 TVM 运行时,并直接跳到步骤 3. 启动RPC服务器。