在TVM的Realy图中,包含全局变量(IR图中以@标识)和局部变量(IR图中以%标识)。
局部变量创建完成后,是可以合入到完整模型的IR图中的。比如想在模型的IR图中改变模型,就可以先创建局部变量,再插入到模型的指定位置,这样新的IR图就生成了。
tvm.relay.Var()函数可以理解为使用python创建一个tvm Relay图节点(局部变量)的一个功能API,完整语法如下:
tvm.relay.Var(name_hint, type_annotation=None)
- name_hint 指定局部变量的名称
- type_annotation 用来表明局部变量的TensorType,包含了shape和dtype
不带TensorType创建的局部变量实例如下:
import tvm.relay
x = tvm.relay.Var("x")
print(x)
输出打印:
free_var %x;
%x
带TensorType创建的局部变量实例如下:
其中TensorType中就指定了局部变量的shape和dtype属性。
import tvm.relay
x = tvm.relay.Var("x",tvm.relay.TensorType([10,10],dtype="float32"))
print(x)
输出打印:
free_var %x: Tensor[(10, 10), float32];
%x
tvm.relay.Var还包括如下的等效写法:
x = tvm.relay.Var("x",tvm.relay.TensorType([10,10],dtype=None))
x = tvm.relay.Var("x",tvm.relay.TensorType([10,10]))
x = tvm.relay.var("x",tvm.relay.TensorType([10,10]))
x = tvm.relay.var("x",shape=[10,10],dtype="float32")
x = tvm.relay.var("x",shape=[10,10])
x = tvm.relay.var("x","float32")
其中2、3、4、5四种写法的输出是一样的,dtype不设为空的话,会默认设为float32
x = tvm.relay.Var("x",tvm.relay.TensorType([10,10]))
x = tvm.relay.var("x",tvm.relay.TensorType([10,10]))
x = tvm.relay.var("x",shape=[10,10],dtype="float32")
x = tvm.relay.var("x",shape=[10,10])
第一种写法,dtype设为None的话,局部变量中就不会设置默认type float32:
x = tvm.relay.Var("x",tvm.relay.TensorType([10,10],dtype=None))
输出:
free_var %x: Tensor[(10, 10), ];
%x
最后一种写法,不给shape的话,局部变量中便不包含shape:
x = tvm.relay.var("x","float32")
输出:
free_var %x: float32;
%x