hls后端示例
tvm支持带有sdaccel的xilinx fpga板。这是有关如何将tvm部署到aws f1 fpga实例的文档。
此功能仍处于试验阶段。暂时无法使用sdaccel部署端到端神经网络。
本文使用两个python脚本。
build.py-用于合成fpga位流的脚本。
import tvm
from tvm import te
tgt_host="llvm"
tgt="sdaccel"
n = te.var("n")
a = te.placeholder((n,), name='a')
b = te.placeholder((n,), name='b')
c = te.compute(a.shape, lambda i: a[i] + b[i], name="c")
s = te.create_schedule(c.op)
px, x = s[c].split(c.op.axis[0], nparts=1)
s[c].bind(px, tvm.te.thread_axis("pipeline"))
fadd = tvm.build(s, [a, b, c], tgt, target_host=tgt_host, name="myadd")
fadd.save("myadd.o")
fadd.imported_modules[0].save("myadd.xclbin")
tvm.contrib.cc.create_shared("myadd.so", ["myadd.o"])
run.py-使用fpga作为加速器的脚本。
import numpy as np
import os
fadd = tvm.runtime.load_module("myadd.so")
if os.environ.get("xcl_emulation_mode"):
fadd_dev = tvm.runtime.load_module("myadd.xclbin")
else:
fadd_dev = tvm.runtime.load_module("myadd.awsxclbin")
fadd.import_module(fadd_dev)
ctx = tvm.context(tgt, 0)
n = 1024
a = tvm.nd.array(np.random.uniform(size=n).astype("float32"), ctx)
b = tvm.nd.array(np.random.uniform(size=n).astype("float32"), ctx)
c = tvm.nd.array(np.zeros(n, dtype="float32"), ctx)
fadd(a, b, c)
tvm.testing.assert_allclose(c.asnumpy(), a.asnumpy() + b.asnumpy())
设定
使用fpga developer ami启动实例。不需要f1实例进行仿真和综合,因此建议使用成本较低的实例。
设置aws fpga开发套件工具。
git clone https://github.com/aws/aws-fpga.git
cd aws-fpga
source sdaccel_setup.sh
source ${xilinx_sdx}/settings64.sh
在启用opencl的情况下设置tvm。
仿真
创建emconfig.json进行仿真。
emconfigutil --platform ${aws_platform} --nd 1
将emconfig.json复制到python二进制目录。当前的xilinx工具包假定主机二进制文件和emconfig.json文件都在同一路径中。
cp emconfig.json $(dirname $(which python))
运行软件仿真
export xcl_emulation_mode=1
export xcl_target=sw_emu
python build.py
python run.py
运行硬件仿真
export xcl_target=hw_emu
synthesis
使用以下脚本运行综合。
unset xcl_emulation_mode
export xcl_target=hw
创建aws fpga映像并将其上传到aws s3。
${sdaccel_dir}/tools/create_sdaccel_afi.sh \
-xclbin=myadd.xclbin -o=myadd \
-s3_bucket=<bucket-name> -s3_dcp_key=<dcp-folder-name> \
-s3_logs_key=<logs-folder-name>
生成awsxclbin文件,对于在f1实例上使用aws fpga映像是必需的。
运行
启动amazon ec2 f1实例。
将myadd.so,myadd.awsxclbin和run.py复制到f1实例。
设置aws fpga开发套件。
设置root和setup环境变量。
sudo sh
source ${install_root}/setup.sh
https://tvm.apache.org/docs/deploy/hls.html
人工智能芯片与自动驾驶