如果有GPU,可以选择cuda
import numpy as npfrom tvm import relayfrom tvm.relay import testingimport tvmfrom tvm.contrib import graph_runtimebatch_size = 1num_class = 1000image_shape = (3, 224, 224)data_shape = (batch_size,) + image_shapeout_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 dataprint(mod.astext(show_meta_data=False))opt_level = 3target = tvm.target.cuda()with relay.build_config(opt_level=opt_level):graph, lib, params = relay.build_module.build(mod, target, params=params)# create random inputctx = tvm.gpu()data = np.random.uniform(-1, 1, size=data_shape).astype("float32")# create modulemodule = graph_runtime.create(graph, lib, ctx)# set input and parametersmodule.set_input("data", data)module.set_input(**params)# runmodule.run()# get outputout = module.get_output(0, tvm.nd.empty(out_shape)).asnumpy()# Print first 10 elements of outputprint(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)
