交叉编译和 RPC

【RPC方案调研】Grpc 嵌入式移植流程 由于项目需求,准备在嵌入式上使用rpc方案,调研了多个方案,最终由于Grpc和protobuf天然的亲和性,决定对Grpc进行移植。 Grpc地址:https://github.com/grpc/grpc Grpc的交叉编译支持三种方式:bazel,cmake,makefile;bazel 由于编译太麻烦,主要适合google内部,直接放弃了,本文主要讲解基于cmake的交叉编译方式,makefile 也是类似方式。 一 交叉编译 1. 首先下载Grpc: git clonegit@g... 阅读详情

本篇文章译自英文文档 Cross Compilation and RPC 作者是 Ziheng Jiang,Lianmin Zheng。更多 TVM 中文文档可访问 →TVM 中文站

本教程介绍了如何在 TVM 中使用 RPC 进行交叉编译和远程设备执行。

利用交叉编译和 RPC,可以实现程序在本地机器编译,在远程设备运行。这个特性在远程设备资源有限时(如在树莓派和移动平台上)尤其有用。本教程将把树莓派作为 CPU 示例,把 Firefly-RK3399 作为 OpenCL 示例进行演示。

在设备上构建 TVM Runtime

首先在远程设备上构建 TVM runtime。

注意 本节和下一节中的所有命令都应在目标设备(例如树莓派)上执行。假设目标设备运行 Linux 系统。

由于在本地机器上只做编译,而远程设备用于运行生成的代码。所以只需在远程设备上构建 TVM runtime。

git clone --recursive https://github.com/apache/tvm tvm
cd tvm
make runtime -j2

成功构建 runtime 后,要在 ~/.bashrc 文件中设置环境变量。可以用 vi ~/.bashrc命令编辑 ~/.bashrc,在这个文件里添加下面这行代码(假设 TVM 目录在 ~/tvm 中):

export PYTHONPATH=$PYTHONPATH:~/tvm/python

执行 source ~/.bashrc 来更新环境变量。

在设备上设置 RPC 服务器

在远程设备(本例为树莓派)上运行以下命令来启动 RPC 服务器:

python -m tvm.exec.rpc_server --host 0.0.0.0 --port=9090

看到下面这行提示,则表示 RPC 服务器已成功启动。

INFO:root:RPCServer: bind to 0.0.0.0:9090

在本地机器上声明和交叉编译内核

备注 现在回到本地机器(已经用 LLVM 安装了完整的 TVM)。

在本地机器上声明一个简单的内核:

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)

然后交叉编译内核。对于树莓派 3B,target 是“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")
# 将 lib 存储在本地临时文件夹
temp = utils.tempdir()
path = temp.relpath("lib.tar")
func.export_library(path)

备注

要使本教程运行在真正的远程设备上,需要将 local_demo 改为 False,并将 build 中的 target 替换为适合设备的 target 三元组。不同设备的 target 三元组可能不同。例如,对于树莓派 3B,它是 llvm -mtriple=armv7l-linux-gnueabihf;对于 RK3399,它是 llvm -mtriple=aarch64-linux-gnu。

通常,可以在设备上运行 gcc -v 来查询 target,寻找以 Target 开头的行:(尽管它可能仍然是一个松散的配置。)
除了 -mtriple,还可设置其他编译选项,例如:

  • -mcpu=< cpuname>

指定生成的代码运行的芯片架构。默认情况这是从 target 三元组推断出来的,并自动检测到当前架构。

  • -mattr=a1,+a2,-a3,…

覆盖或控制 target 的指定属性,例如是否启用 SIMD 操作。默认属性集由当前 CPU 设置。要获取可用属性列表,执行:

  llc -mtriple=<your device target triple> -mattr=help

这些选项与 llc 一致。建议设置 target 三元组和功能集,使其包含可用的特定功能,这样我们可以充分利用单板的功能。查看 LLVM 交叉编译指南获取有关交叉编译属性的详细信息。

通过 RPC 远程运行 CPU 内核

下面将演示如何在远程设备上运行生成的 CPU 内核。首先,从远程设备获取 RPC 会话:

if local_demo:
    remote = rpc.LocalSession()
else:
    # 下面是我的环境,将这个换成你目标设备的 IP 地址
    host = "10.77.1.162"
    port = 9090
    remote = rpc.connect(host, port)

将 lib 上传到远程设备,然后调用设备的本地编译器重新链接它们。其中 func 是一个远程模块对象。

remote.upload(path)
func = remote.load_module("lib.tar")

# 在远程设备上创建数组
dev = remote.cpu()
a = tvm.nd.array(np.random.uniform(size=1024).astype(A.dtype), dev)
b = tvm.nd.array(np.zeros(1024, dtype=A.dtype), dev)
# 这个函数将在远程设备上运行
func(a, b)
np.testing.assert_equal(b.numpy(), a.numpy() + 1)

要想评估内核在远程设备上的性能,避免网络开销很重要。time_evaluator 返回一个远程函数,这个远程函数多次运行 func 函数,并测试每一次在远程设备上运行的成本,然后返回测试的成本(不包括网络开销)。

time_f = func.time_evaluator(func.entry_name, dev, number=10)
cost = time_f(a, b).mean
print("%g secs/op" % cost)

输出结果:

1.369e-07 secs/op

通过 RPC 远程运行 OpenCL 内核

远程 OpenCL 设备的工作流程与上述内容基本相同。可以定义内核、上传文件,然后通过 RPC 运行。

备注
树莓派不支持 OpenCL,下面的代码是在 Firefly-RK3399 上测试的。可以按照 教程 为 RK3399 设置 OS 及 OpenCL 驱动程序。
在 rk3399 板上构建 runtime 也需启用 OpenCL。在 TVM 根目录下执行:

cp cmake/config.cmake .
sed -i "s/USE_OPENCL OFF/USE_OPENCL ON/" config.cmake
make runtime -j4

下面的函数展示了如何远程运行 OpenCL 内核:

def run_opencl():
    # 注意:这是 rk3399 板的设置。你需要根据你的环境进行修改
    opencl_device_host = "10.77.1.145"
    opencl_device_port = 9090
    target = tvm.target.Target("opencl", host="llvm -mtriple=aarch64-linux-gnu")

    # 为上面的计算声明 "add one" 创建 schedule
    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], target=target)

    remote = rpc.connect(opencl_device_host, opencl_device_port)

    # 导出并上传
    path = temp.relpath("lib_cl.tar")
    func.export_library(path)
    remote.upload(path)
    func = remote.load_module("lib_cl.tar")

    # 运行
    dev = remote.cl()
    a = tvm.nd.array(np.random.uniform(size=1024).astype(A.dtype), dev)
    b = tvm.nd.array(np.zeros(1024, dtype=A.dtype), dev)
    func(a, b)
    np.testing.assert_equal(b.numpy(), a.numpy() + 1)
    print("OpenCL test passed!")

总结

本教程介绍了 TVM 中的交叉编译和 RPC 功能。

  • 在远程设备上设置 RPC 服务器。
  • 设置目标设备配置,使得可在本地机器上交叉编译内核。
  • 通过 RPC API 远程上传和运行内核。

下载 Python 源代码
下载 Jupyter Notebook

以上就是该文档的全部内容,查看更多 TVM 中文文档,请访问→TVM 中文站

TVM交叉编译和远程RPC TVM交叉编译和远程RPC 本文介绍了TVM中使用RPC的交叉编译和远程设备执行。 使用交叉编译和RPC,可以在本地计算机上编译程序,然后在远程设备上运行它。当远程设备资源受到限制时(如Raspberry Pi和移动平台),此功能很有用。本文将使用Raspberry Pi作为CPU示例,并使用Firefly-RK3399作为OpenCL示例。 在设备上构建TVM运行时 第一步是在远程设备上构建TVM运行时。 本文所有指令都应在目标设备(例如Raspberry Pi)上执行。假设目标正在运行Linux。 由于 阅读详情

相关推荐

解决RISC-V交叉编译lmbench时‘pmap_set未定义’错误的完整排查记录

本文详细解析了在RISC-V架构上交叉编译lmbench时遇到的‘pmap_set未定义’错误,揭示了历史代码与现代系统不兼容的问题根源。通过分析Sun RPC与libtirpc的演变,提供了安装必要库、修改构建系统等系统性解决方案,并分享了交叉编译环境下的特殊考量与验证方法。

weixin_30415113的博客 444

通过vcpkg交叉编译grpc:构建Arm64平台的Docker化开发环境

利用Docker和vcpkg构建ARM64平台的gRPC交叉编译环境,实现在x86主机上为ARM架构开发高性能RPC服务。

kpengk的博客 1395

在RISC-V 64位平台上交叉编译与调优lmbench性能基准测试套件

本文详细介绍了在RISC-V 64位平台上交叉编译与调优lmbench性能基准测试套件的完整流程。从搭建riscv64工具链、解决libtirpc依赖问题,到编译优化和测试技巧,为开发者提供了实用的性能评估方案。文章特别强调了交叉编译在RISC-V开发中的重要性,并分享了实战中的经验教训。

weixin_30329623的博客 718

交叉编译和RPC

本文翻译自Cross Compilation and RPC — tvm 0.9.dev0 documentation 本教程介绍在TVM中交叉编译和使用RPC进行远程设备执行。 使用交叉编译和RPC,您可以在本地机器上编译程序,然后在远程设备上运行它。当远程设备资源有限时,它是有用的,如树莓派和移动平台。在本教程中,我们将使用树莓派的CPU示例和萤火虫- rk3399的OpenCL示例。 在设备上编译TVM运行时 第一步是在远程设备上构建TVM运行时。 注意:本节和下一节中的所有指令都应该在

zx_ros的博客 490

极智AI | 使用tvm交叉编译和RPC部署在raspberry pi和rk3399教程

使用tvm rpc模块可通过ip、端口远程在编译设备部署,把繁杂且耗内存的调优工作在服务器上做,而在边缘端只需编译代价相对小得多的tvm runtime执行库。

极智视界 931

linux下NFS及交叉编译环境的配置

此文档有比较详细的NFS配置,arm-linux交叉编译环境的配置

交叉编译nfs-utils

NFS在信息传送中依赖RPC协议,NFS服务端需要安装rpcbind和nfs-utils,客户端只需要安装 nfs-utils。 交叉编译比x86上编译复杂一些,主要是交叉编译环境不能使用软件仓库中的程序,需要下载依赖库的源码,在交叉编译环境编译、安装后才能使用。 rpcbind依赖libtirpc nfs-utils依赖libevent、device-mapper、IPv6 先编译这些依赖库,./configure指定交叉编译参数 ./configure CC=arm-hisiv400-linu

willy16的专栏 4117

rpcbind(如果linux没有portmap或rpcbind服务的话装这个)

libgssglue-0.1-8.1.el6.i686.rpm libtirpc-0.2.1-1.el6.i686.rpm rpcbind-0.2.0-8.el6.i686.rpm 包括以上三个,如果linux没有portmap或rpcbind服务,就依次安装这三个文件就可以了。都是手工安装

手把手交叉编译mysql

手把手交叉编译mysql

houge101的博客 3498

卡尔曼滤波、互补滤波与Tsinghua滤波:平衡车姿态感知的三大算法对比

本文对比了平衡车姿态感知中的卡尔曼滤波、互补滤波与Tsinghua滤波三大核心算法。互补滤波计算简单,适合入门;卡尔曼滤波理论最优但实现复杂;Tsinghua滤波则是一种面向嵌入式优化的轻量级方案,通过动态权重调整和零偏估计,在资源受限的MCU上实现了性能与效率的平衡,是智能车竞赛等场景的实用选择。

weixin_29232121的博客 349

用Python实现四叉树(quad tree)

import numpy as np #正方形类 class square: #lx、ly为左上角坐标(x对应行号,y对应列号),rx、ry为右下角坐标 def __init__(self,lx,ly,rx,ry): self.lx=lx self.ly=ly self.rx=rx self.ry=ry #检查该矩阵中是否满足条件 #参数:原矩阵,阈值 #返回值:布尔类型 def check(s

weixin_44164489的博客 5868

【TVM 教程】交叉编译与 RPC

​在远程设备上设置 RPC 服务器;在本地设置目标设备的交叉编译配置;通过 RPC API 上传并远程运行内核程序。可右键另存为下载。

HyperAI超神经 688

从零到一:基于Rocky Linux 9的Kubernetes高可用集群部署实战

本文提供了一份基于Rocky Linux 9操作系统,从零开始部署Kubernetes高可用集群的完整实战指南。详细讲解了包括系统初始化、容器运行时配置、使用kubeadm工具进行集群初始化、节点加入以及Calico网络插件安装在内的核心步骤,并针对国内网络环境提供了镜像加速等优化方案,旨在帮助读者构建一个稳定可靠的生产级K8s环境。

weixin_29197835的博客 137

brpc交叉编译指南:为嵌入式设备构建高性能RPC服务

brpc是一款工业级的C++ RPC框架,广泛应用于搜索、存储、机器学习等高性能系统中。本文将详细介绍如何为嵌入式设备交叉编译brpc,帮助开发者在资源受限的环境中构建高效的RPC服务。 ## 为什么选择brpc进行嵌入式开发? brpc作为一款"better RPC"框架,具有以下优势: - 高性能:专为高并发场景优化,支持多种协议 - 低资源占用:适合嵌入式设备有限的硬件资源 - 丰富特性

gitblog_00807的博客 874

保姆级教程:2025新版JavPlayer 3.01整合修复版安装配置全流程(N卡/A卡/CPU通用)

本文提供2025新版JavPlayer 3.01整合修复版的保姆级安装配置教程,涵盖N卡、A卡和CPU环境。详细讲解硬件要求、分步安装流程、显卡优化配置及超分辨率模型选择,帮助用户高效完成视频修复任务。

weixin_42665255的博客 1881

用FPGA驱动WS2812B点阵,手把手教你实现动态文字显示(附完整Verilog代码)

本文详细介绍了如何使用FPGA驱动WS2812B点阵实现动态文字显示,包括硬件连接、Verilog代码实现和动态效果设计。通过精确的时序控制和数据处理,读者可以掌握FPGA与WS2812B的交互技术,并实现炫酷的显示效果。附完整Verilog代码,适合硬件爱好者和工程师参考实践。

weixin_30482383的博客 669

TVM:交叉编译和RPC

TVM:交叉编译和RPC 之前我们介绍了 TVM 的安装、本机demo和树莓派远程demo。本文将介绍了在 TVM 中使用 RPC 进行交叉编译和远程设备执行。 通过交叉编译和 RPC,我们可以在本地机器上编译程序,然后在远程设备上运行它。 当远程设备资源有限时很有用,例如 Raspberry Pi 和移动平台。 在本文中,我们将使用 Raspberry Pi 作为 CPU 示例,使用 Firefly-RK3399 作为 OpenCL 示例。 在远程设备上构建 TVM Runtime 首先我们要在远程设备上

weixin_44966641的博客 1145

如何实现VMware虚拟机上的ubuntu与windows主机共享文件夹

windows主机部分   在硬盘上任意位置新建文件夹,此处命名为Share,实际上随意。 接下来右键属性,操作如下系列图所示: 在硬盘上任意位置新建文件夹,此处命名为Share,实际上随意。 成功修改后,显示如下界面: VMware部分 ubuntu在关机状态下,点击“编辑虚拟机设置” 接下来,开启ubuntu系统,在终端输入: ·· vmware-hgfsclient ·· 将会显示如下画面,但是此时你可能找不到 /mnt/hgfs 这个路径,如果找不到该路径,则需要在虚拟

Mr.Sliver的博客 8216

protobuf、protobuf-c、protobuf-c-rpc在Linux(Ubuntu18.04)编译安装及交叉编译arm\aarch64版本

如下介绍c语言的protobuf+rpc的开源库protobuf-c和protobuf-c-rpc,其适合于嵌入式分布式场景,利用protobuf协议的可扩展性比较方便进行协议兼容升级,利用rpc接口的网络易用性,不需要再从头到尾实现一遍socket通信、通信接口设计,只需要实现C函数接口设计和开发以及利用proto设计好交互协议即可,并且具备一定的跨编程语言交互特性,每个具备联网能力的嵌入式设备都可作为rpc客户端和服务端,可以快速进行嵌入式设备业务组网开发(此外,还有一些适合于stm32的protobu

逍遥游的博客 1554

数学史学习资料:史前数学

著名物理学家伽莫夫(宇宙大爆炸理论以及核聚变理论的提出者)在他的科普书《从1到无穷大》中举了这样一个例子。两个原始部落的酋长比赛,看谁说的数字大。第一个酋长说了三,第二个酋长想了半天,然后说你赢了。你今天听起来觉得这两个人真可笑,至少说出四,岂不就赢了?但是对这两位酋长来讲,所拥有的东西就很少超过三个,比三个多的东西他们就觉得没有必要数清楚了,就用许多来形容了。也就是说,他们生活的环境限制了他们的认知。

howard2005的专栏 902

Python爬虫实战:使用最新技术抓取采购网招标公告信息

本文将详细介绍如何使用Python最新爬虫技术构建一个高效的采购网招标公告信息抓取系统。我们将从爬虫基础概念讲起,逐步深入到高级技巧,包括异步处理、反爬虫对策、数据解析与存储等,并提供完整的代码实现。本文旨在为读者提供一套完整的网络数据采集解决方案,适用于各类政府采购平台和商业招标网站。网络爬虫(Web Crawler)是一种自动抓取互联网信息的程序或脚本,它们按照一定的规则,自动地浏览万维网并提取所需数据。在现代商业环境中,爬虫技术广泛应用于价格监控、竞争情报收集、市场研究等领域。

2201_76125261的博客 1622

【TVM 教程】设置 RPC 系统

Apache TVM是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →远程过程调用(RPC)是 Apache TVM 的一个非常重要且有用的功能,它允许我们在实际硬件上运行编译后的神经网络(NN)模型,而无需触及远程设备,输出结果将通过网络自动传回。通过消除手动工作,如将输入数据转储到文件、将导出的 NN 模型复制到远程设备、设置设备用户环境以及将输出结果复制到主机开发环境,RPC 极大地提高了开发效率。

HyperAI超神经 1072

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

交叉编译grpc

本文介绍了gRPC的版本查看、代码下载及编译安装过程。首先通过命令查看protoc和gRPC版本,然后下载指定版本(1.29.1)的gRPC代码并初始化子模块。详细说明了x86平台的编译安装步骤,包括创建构建目录、执行cmake和make命令。同时提供了ARM平台的交叉编译方法,需要设置交叉编译工具链并修改相关链接文件路径。最后都通过make install完成安装,为不同平台下的gRPC开发环境搭建提供了完整指导。

sjgfmqj的博客 279

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

深入解析 Diffusers 中的 ChromaTransformer2DModel:基于 Flux 架构改进的文本到图像扩散 Transformer

Chroma 是社区基于 Flux 打造的文本到图像生成模型,而 `ChromaTransformer2DModel` 正是其在 Diffusers 中的核心 DiT(Diffusion Transformer)实现。本文以 [docs/source/en/api/models/chroma_transformer.md](https://link.gitcode.com/i/534a4ae3ba

gitblog_00784的博客 428

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Flutter开发android app中调用C#的研究记录

flutter开发android app中调用C#库的研究记录

yaoSir的博客 2646
上一篇: 用 Real-ESRGAN 拯救座机画质,自制高清版动漫资源
下一篇: OpenAI CTO、吴恩达夫人……AI 领域值得关注的「她」力量,个个都是女强人
HyperAI超神经
博客等级 码龄7年 8872粉丝 1753原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值