如果有GPU,可以选择cuda
import numpy as np
from tvm import relay
from tvm.relay import testing
import tvm
from tvm.contrib import graph_runtime
batch_size = 1
num_class = 1000
image_shape = (3, 224, 224)
data_shape = (batch_size,) + image_shape
out_shape = (batch_size, num_class)
mod, params = relay.testing.resnet.get_workload(
num_layers=18, batch_size=batch_size, image_shape=image_shape)
# set show_meta_data=True if you want to show meta data
print(mod.astext(show_meta_data=False))
opt_level = 3
target = tvm.target.cuda()
with relay.build_config(opt_level=opt_level):
graph, lib, params = relay.build_module.build(
mod, target, params=params)
# create random input
ctx = tvm.gpu()
data = np.random.uniform(-1, 1, size=data_shape).astype("float32")
# create module
module = graph_runtime.create(graph, lib, ctx)
# set input and parameters
module.set_input("data", data)
module.set_input(**params)
# run
module.run()
# get output
out = module.get_output(0, tvm.nd.empty(out_shape)).asnumpy()
# Print first 10 elements of output
print(out.flatten()[0:10])
如上图所示:
target 是指构建目标,一般是一个字符串,例如”cuda”, “llvm”。
ctx是部署模块的上下文。当只有一个TVMContext时,它可以是本地的或远程的。否则,列表中的第一个上下文将被用于部署模块。
例如,使用GPU时,可以这么设置:
target = ‘cuda’ #或 target = tvm.target.cuda()
ctx=tvm.gpu(0) #或 ctx=tvm.gpu()
如果没有GPU,也可以用CPU:
target = ‘llvm’
ctx=tvm.cpu(0)
或是自定义的硬件:
target = ‘llvm’
ctx=tvm.vacc(0)