TVM交叉编译和远程RPC
TVM交叉编译和远程RPC
本文介绍了TVM中使用RPC的交叉编译和远程设备执行。
使用交叉编译和RPC,可以在本地计算机上编译程序,然后在远程设备上运行它。当远程设备资源受到限制时(如Raspberry Pi和移动平台),此功能很有用。本文将使用Raspberry Pi作为CPU示例,并使用Firefly-RK3399作为OpenCL示例。
在设备上构建TVM运行时
第一步是在远程设备上构建TVM运行时。
本文所有指令都应在目标设备(例如Raspberry Pi)上执行。假设目标正在运行Linux。
由于在本地计算机上进行编译,因此远程设备仅用于运行生成的代码。只需要在远程设备上构建TVM运行时。
git clone --recursive https://github.com/apache/tvm tvm
cd tvm
make runtime -j2
成功构建运行时后,需要在/.bashrc文件中设置环境变量。可以/.bashrc 使用进行编辑并添加以下行(假设TVM目录位于):vi /.bashrc/tvm
export PYTHONPATH=$PYTHONPATH:~/tvm/python
要更新环境变量,执行。source ~/.bashrc
在设备上设置RPC服务器
要启动RPC服务器,在远程设备上运行以下命令(在本示例中为Raspberry Pi)。
python -m tvm.exec.rpc_server --host 0.0.0.0 --port=9090
如果看到下面的行,则表明RPC服务器已在设备上成功启动。
INFO:root:RPCServer: bind to 0.0.0.0:9090
在本地计算机上声明并交叉编译内核
现在,返回安装了完整TVM(带有LLVM)的本地计算机。
将在本地计算机上声明一个简单的内核:
import numpy as np
import tvm
from tvm import te
from tvm import rpc
from tvm.contrib import utils
n = tvm.runtime.convert(1024)
A = te.placeholder((n,), name=“A”)
B = te.compute((n,), lambda i: A[i] + 1.0, name=“B”)
s = te.create_schedule(B.op)
然后交叉编译内核。对于Raspberry Pi 3B,目标应该是’llvm -mtriple = armv7l-linux-gnueabihf’,在这里使用’llvm’来使本文可在网页构建服务器上运行。参见以下块中的详细说明。
local_demo = True
if local_demo:
target = “llvm”
else:
target = “llvm -mtriple=armv7l-linux-gnueabihf”
func = tvm.build(s, [A, B], target=target, name=“add_one”)
save the lib at a local temp folder
temp = utils.tempdir()
path = temp.relpath(“lib.tar”)
func.export_library(path)
Readme
要运行这个教程与真正的远程设备,更改local_demo 为False,并取代target在build与三联供设备适当的目标。目标三元组对于不同的设备可能有所不同。例如,它适用 于Raspberry Pi 3B和 RK3399。‘llvm -mtriple=armv7l-linux-gnueabihf’‘llvm -mtriple=aarch64-linux-gnu’
可以通过在设备上运行并查询以 ()开头的行)来查询目标(尽管可能仍然是宽松的配置。)gcc -vTarget:
此外-mtriple,还可以设置别的编译选项,例如:
• -mcpu =
在当前架构中指定要为其生成代码的特定芯片。默认情况下,这是从目标三元组推断出来的,并自动检测到当前体系结构。
• -mattr = a1,+ a2,-a3,…
覆盖或控制目标的特定属性,例如是否启用SIMD操作。默认属性集由当前CPU设置。要获取可用属性的列表,可以执行以下操作:
llc -mtriple= -mattr=help
这些选项与llc一致。建议设置目标三元组和功能集以包含可用的特定功能,充分利用开发板的功能。可以从《交叉编译的LLVM指南》中找到有关交叉编译属性的更多详细信息 。
通过RPC远程运行CPU内核
展示了如何在远程设备上运行生成的CPU内核。首先,从远程设备获取RPC会话。
if local_demo:
remote = rpc.LocalSession()
else:
# The following is my environment, change this to the IP address of your target device
host = “10.77.1.162”
port = 9090
remote = rpc.connect(host, port)
将库上传到远程设备,然后调用设备本地编译器以重新链接。现在func是一个远程模块对象。
remote.upload(path)
func = remote.load_module(“lib.tar”)
create arrays on the remote device
ctx = remote.cpu()
a = tvm.nd.array(np.random.uniform(size=1024).astype(A.dtype), ctx)
b = tvm.nd.array(np.zeros(1024, dtype=A.dtype), ctx)
the function will run on the remote device
func(a, b)
np.testing.assert_equal(b.asnumpy(), a.asnumpy() + 1)
当要评估远程设备上内核的性能时,避免网络开销很重要。 time_evaluator将返回一个远程函数,该函数多次运行该函数,测量该远程设备上的每次运行成本,并返回测得的成本。排除网络开销。
time_f = func.time_evaluator(func.entry_name, ctx, number=10)
cost = time_f(a, b).mean
print("%g secs/op" % cost)
输出:
1.161e-07 secs/op
通过RPC远程运行OpenCL内核
对于远程OpenCL设备,工作流程与上面的工作流程几乎相同。可以定义内核,上传文件并通过RPC运行。
Raspberry Pi不支持OpenCL,以下代码在Firefly-RK3399上进行了测试。可以按照本文 为RK3399设置操作系统和OpenCL驱动程序。
另外,需要在rk3399板上启用OpenCL来构建运行时。在TVM根目录中,执行
cp cmake/config.cmake .
sed -i “s/USE_OPENCL OFF/USE_OPENCL ON/” config.cmake
make runtime -j4
以下函数显示了如何远程运行OpenCL内核
def run_opencl():
# NOTE: This is the setting for my rk3399 board. You need to modify
# them according to your environment.
target_host = “llvm -mtriple=aarch64-linux-gnu”
opencl_device_host = “10.77.1.145”
opencl_device_port = 9090
# create schedule for the above "add one" compute declaration
s = te.create_schedule(B.op)
xo, xi = s[B].split(B.op.axis[0], factor=32)
s[B].bind(xo, te.thread_axis("blockIdx.x"))
s[B].bind(xi, te.thread_axis("threadIdx.x"))
func = tvm.build(s, [A, B], "opencl", target_host=target_host)remote = rpc.connect(opencl_device_host, opencl_device_port)# export and upload
path = temp.relpath("lib_cl.tar")
func.export_library(path)
remote.upload(path)
func = remote.load_module("lib_cl.tar")# run
ctx = remote.cl()
a = tvm.nd.array(np.random.uniform(size=1024).astype(A.dtype), ctx)
b = tvm.nd.array(np.zeros(1024, dtype=A.dtype), ctx)
func(a, b)
np.testing.assert_equal(b.asnumpy(), a.asnumpy() + 1)
print("OpenCL test passed!")
概括
本文提供了TVM中的交叉编译和RPC功能的演练。
• 在远程设备上设置RPC服务器。
• 设置目标设备配置以交叉编译本地计算机上的内核。
• 通过RPC API远程上载和运行内核。
TVM交叉编译和远程RPC相关推荐
- frida sekiro 实现 taobao sgmain 70102 远程 rpc 调用
前言 使用 frida + sekiro 远程 rpc 调用淘宝 sgmain 70102 之前写过一篇类似的,可以参考一下 androidAsync fridaManager 实现某宝 sgmain ...
- Dubbo——远程(RPC)调用原理
摘要 服务暴露和服务引入两个流程了,而这两个流程就是为了服务的调用,本博文将详细的介绍Dubbo的服务调用流程. PRC架构组件 一个基本的RPC架构里面应该至少包含以下4个组件: 客户端(Clien ...
- TVM:交叉编译和RPC
TVM:交叉编译和RPC 之前我们介绍了 TVM 的安装.本机demo和树莓派远程demo.本文将介绍了在 TVM 中使用 RPC 进行交叉编译和远程设备执行. 通过交叉编译和 RPC,我们可以在本地 ...
- go语言net包rpc远程调用的使用
一.基于http的RPC 服务端: package main;import ("net/rpc""net/http""log" )//go对 ...
- 用TVM在硬件平台上部署深度学习工作负载的端到端 IR 堆栈
用TVM在硬件平台上部署深度学习工作负载的端到端 IR 堆栈 深度学习已变得无处不在,不可或缺.这场革命的一部分是由可扩展的深度学习系统推动的,如滕索弗洛.MXNet.咖啡和皮托奇.大多数现有系统针对 ...
- AI System 人工智能系统 TVM深度学习编译器 DSL IR优化 计算图 编译 优化 内存内核调度优化 DAG 图优化 DFS TaiChi 函数注册机 Registry
DSL 领域专用语言 TVM深度学习编译器 AI System 人工智能系统 参考项目 TaiChi 三维动画渲染物理仿真引擎DSL TVM 深度学习DSL 密集计算DSL LLVM 模块化编译器 编 ...
- 【TVM帮助文档学习】使用TVMC编译和优化模型
本文翻译自Compiling and Optimizing a Model with TVMC - tvm 0.9.dev0 documentation 在本节中,我们将使用TVM命令行驱动程序TVM ...
- 陈天奇团队发布TVM:把深度学习部署到手机、树莓派等更多硬件
本文来自AI新媒体量子位(QbitAI) △ 陈天奇,华盛顿大学计算机系博士生,此前毕业于上海交通大学ACM班.XGBoost.cxxnet等著名机器学习工具的作者,MXNet的主要贡献者之一. DM ...
- TVM:通过Python接口(AutoTVM)来编译和优化模型
TVM:通过Python接口(AutoTVM)来编译和优化模型 上次我们已经介绍了如何从源码编译安装 tvm,本文我们将介绍在本机中使用 tvm Python 接口来编译优化模型的一个demo. TV ...
最新文章
- 【连载】优秀程序员的 45 个习惯之习惯25
- 前端发给后台的参数中含有中文
- Facebook开源Horizon:首个用于大规模产品和服务的强化学习平台
- Win10 Powershell ssh到WSL
- 数学表达式3+(a+b)2对应的python表达式是_与数学表达式cd/2ab对应的Python表达式中,不正确的是:...
- asp.net中控制反转的理解
- Android通过包名启动应用程序
- uniapp发布苹果IOS测试版 下载无法安装
- 百度地图API秘钥问题
- Android信任Https自签名证书详细教程
- 彩色星球科技旗下娱乐元宇宙产品“彩色世界”正式上线;GIGABYTE推出新一代AORUS专业电竞笔电 | 全球TMT...
- 使用xlwt将数据保存到excel文件中,python
- 招聘网站数百万条敏感数据泄露,简历、身份证扫描件统统曝光
- 卡西欧计算机的型号配置,【卡西欧 CASIO fx-82CN X计算器使用总结】菜单|供电|设置|输入|运算_摘要频道_什么值得买...
- leetcode总结
- [Nucleo-F411RE] 第2篇--用stm32CubeMx创建工程配置GPIO的流程
- 部署Kubernetes单机版
- 《悠悠岁月》悠悠岁月,浅藏浅忆,且行且珍惜
- 前端css弹性布局各种属性
- 无lnternet_无线网络已连接 无internet访问
热门文章
- 2022-2028年中国水基胶行业市场深度评估及前瞻研究报告
- Linux shell 学习笔记(2)— 监测程序、磁盘空间和处理文件(ps -ef、top、kill、df、du 、grep、tar)
- 三层交换机原理:01路由器如何隔离广播域?
- BiLSTM-CRF学习笔记(原理和理解) 维特比
- 高级教程: 作出动态决策和 Bi-LSTM CRF 重点
- Linux 内核,30 年C 语言将升级至 C11
- OpenCV读写视频文件解析(二)
- YOLOV4各个创新功能模块技术分析(一)
- EventBus的粘性事件原理
- 2021年大数据常用语言Scala(二十三):函数式编程 扁平化映射 flatMap