日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

TVM交叉编译和远程RPC

發(fā)布時間:2023/11/28 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TVM交叉编译和远程RPC 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

TVM交叉編譯和遠程RPC
本文介紹了TVM中使用RPC的交叉編譯和遠程設(shè)備執(zhí)行。
使用交叉編譯和RPC,可以在本地計算機上編譯程序,然后在遠程設(shè)備上運行它。當遠程設(shè)備資源受到限制時(如Raspberry Pi和移動平臺),此功能很有用。本文將使用Raspberry Pi作為CPU示例,并使用Firefly-RK3399作為OpenCL示例。
在設(shè)備上構(gòu)建TVM運行時
第一步是在遠程設(shè)備上構(gòu)建TVM運行時。
本文所有指令都應(yīng)在目標設(shè)備(例如Raspberry Pi)上執(zhí)行。假設(shè)目標正在運行Linux。
由于在本地計算機上進行編譯,因此遠程設(shè)備僅用于運行生成的代碼。只需要在遠程設(shè)備上構(gòu)建TVM運行時。
git clone --recursive https://github.com/apache/tvm tvm
cd tvm
make runtime -j2
成功構(gòu)建運行時后,需要在/.bashrc文件中設(shè)置環(huán)境變量。可以/.bashrc 使用進行編輯并添加以下行(假設(shè)TVM目錄位于):vi /.bashrc/tvm
export PYTHONPATH=$PYTHONPATH:~/tvm/python
要更新環(huán)境變量,執(zhí)行。source ~/.bashrc
在設(shè)備上設(shè)置RPC服務(wù)器
要啟動RPC服務(wù)器,在遠程設(shè)備上運行以下命令(在本示例中為Raspberry Pi)。
python -m tvm.exec.rpc_server --host 0.0.0.0 --port=9090
如果看到下面的行,則表明RPC服務(wù)器已在設(shè)備上成功啟動。
INFO:root:RPCServer: bind to 0.0.0.0:9090
在本地計算機上聲明并交叉編譯內(nèi)核
現(xiàn)在,返回安裝了完整TVM(帶有LLVM)的本地計算機。
將在本地計算機上聲明一個簡單的內(nèi)核:
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)
然后交叉編譯內(nèi)核。對于Raspberry Pi 3B,目標應(yīng)該是’llvm -mtriple = armv7l-linux-gnueabihf’,在這里使用’llvm’來使本文可在網(wǎng)頁構(gòu)建服務(wù)器上運行。參見以下塊中的詳細說明。
local_demo = True

if local_demo:
target = “l(fā)lvm”
else:
target = “l(fā)lvm -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(“l(fā)ib.tar”)
func.export_library(path)
Readme
要運行這個教程與真正的遠程設(shè)備,更改local_demo 為False,并取代target在build與三聯(lián)供設(shè)備適當?shù)哪繕恕D繕巳M對于不同的設(shè)備可能有所不同。例如,它適用 于Raspberry Pi 3B和 RK3399。‘llvm -mtriple=armv7l-linux-gnueabihf’‘llvm -mtriple=aarch64-linux-gnu’
可以通過在設(shè)備上運行并查詢以 ()開頭的行)來查詢目標(盡管可能仍然是寬松的配置。)gcc -vTarget:
此外-mtriple,還可以設(shè)置別的編譯選項,例如:
? -mcpu =
在當前架構(gòu)中指定要為其生成代碼的特定芯片。默認情況下,這是從目標三元組推斷出來的,并自動檢測到當前體系結(jié)構(gòu)。
? -mattr = a1,+ a2,-a3,…
覆蓋或控制目標的特定屬性,例如是否啟用SIMD操作。默認屬性集由當前CPU設(shè)置。要獲取可用屬性的列表,可以執(zhí)行以下操作:
llc -mtriple= -mattr=help
這些選項與llc一致。建議設(shè)置目標三元組和功能集以包含可用的特定功能,充分利用開發(fā)板的功能。可以從《交叉編譯的LLVM指南》中找到有關(guān)交叉編譯屬性的更多詳細信息 。
通過RPC遠程運行CPU內(nèi)核
展示了如何在遠程設(shè)備上運行生成的CPU內(nèi)核。首先,從遠程設(shè)備獲取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)
將庫上傳到遠程設(shè)備,然后調(diào)用設(shè)備本地編譯器以重新鏈接。現(xiàn)在func是一個遠程模塊對象。
remote.upload(path)
func = remote.load_module(“l(fā)ib.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)
當要評估遠程設(shè)備上內(nèi)核的性能時,避免網(wǎng)絡(luò)開銷很重要。 time_evaluator將返回一個遠程函數(shù),該函數(shù)多次運行該函數(shù),測量該遠程設(shè)備上的每次運行成本,并返回測得的成本。排除網(wǎng)絡(luò)開銷。
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內(nèi)核
對于遠程OpenCL設(shè)備,工作流程與上面的工作流程幾乎相同。可以定義內(nèi)核,上傳文件并通過RPC運行。
Raspberry Pi不支持OpenCL,以下代碼在Firefly-RK3399上進行了測試。可以按照本文 為RK3399設(shè)置操作系統(tǒng)和OpenCL驅(qū)動程序。
另外,需要在rk3399板上啟用OpenCL來構(gòu)建運行時。在TVM根目錄中,執(zhí)行
cp cmake/config.cmake .
sed -i “s/USE_OPENCL OFF/USE_OPENCL ON/” config.cmake
make runtime -j4
以下函數(shù)顯示了如何遠程運行OpenCL內(nèi)核
def run_opencl():
# NOTE: This is the setting for my rk3399 board. You need to modify
# them according to your environment.
target_host = “l(fā)lvm -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功能的演練。
? 在遠程設(shè)備上設(shè)置RPC服務(wù)器。
? 設(shè)置目標設(shè)備配置以交叉編譯本地計算機上的內(nèi)核。
? 通過RPC API遠程上載和運行內(nèi)核。

總結(jié)

以上是生活随笔為你收集整理的TVM交叉编译和远程RPC的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。