Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

TVM and Deep Learning Compiler Conference


お髭の人が盛り上がっていたTVM and Deep Learning Compiler Conference

当日はTwitterにいろいろ流れてきたのですが、講演ビデオやスライドが公開されていないのでさっぱり。

追記)、2018.12.30
どうやら昨夜(現地時間2018.12.29)に、スライドがアップされたようです。めでたしめでたし。

でしたが、NTT研究所の森田さんという方がMediumにレポートを。。。


NTT研究所では、「OpenCL backend for FPGA」として、TVMへコミットしていますね。


こんな感じで、FPGAのbitstreamを生成するんですね。
引用します
import tvm

tgt_host="llvm"
tgt="aocl_sw_emu"

n = tvm.var("n")
A = tvm.placeholder((n,), name='A')
B = tvm.placeholder((n,), name='B')
C = tvm.compute(A.shape, lambda i: A[i] + B[i], name="C")

s = tvm.create_schedule(C.op)
px, x = s[C].split(C.op.axis[0], nparts=1)

s[C].bind(px, tvm.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.aocx")

tvm.contrib.cc.create_shared("myadd.so", ["myadd.o"])

ここでは、"aocl_sw_emu" ということで、エミュレータにて動作させるようですね。

実行は、次のようなコードです。
引用します
import tvm
import numpy as np
import os

tgt="aocl_sw_emu"

fadd = tvm.module.load("myadd.so")
fadd_dev = tvm.module.load("myadd.aocx")
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())

ランタイムは、こちらのディレクトリ