tvm.relax.op
tvm.relax.op
Relax 核心运算符。
- tvm.relax.op.assert_op(condition: RelaxExpr | PrimExpr, format_args: RelaxExpr | List[RelaxExpr] | None = None, format: str | RelaxExpr = '') RelaxExpr
创建对 Relax 的 assert_op 操作的调用(assert 在 Python 中是保留字,因此名称必须不同)。
- tvm.relax.op.call_builtin_with_ctx(func: str | RelaxExpr, args: RelaxExpr, *, sinfo_args: StructInfo | List[StructInfo] | None = None) Call
relax.Call 调用内置函数 func。
- 参数:
func (Expr) – 要调用的内置函数。
args (Expr) – 输入参数。
sinfo_args (Optional[Union[StructInfo, List[StructInfo]]]) – 调用节点的结构信息参数。
- 返回:
ret – 创建的调用节点。
- 返回类型:
- tvm.relax.op.call_dps_packed(func: str | RelaxExpr, args: RelaxExpr, out_sinfo: TensorStructInfo | List[TensorStructInfo]) Call
relax.Call 调用目标传递风格的 packed 函数并返回输出。
注意:假定调用的函数是 _pure_ 的(除了修改指定的输出参数)。如果该函数 _确实_ 导致其他副作用,则编译器最终可能会删除、重新排序或重复这些影响——无法做出任何保证。
- 参数:
func (Union[str, Expr]) – 目标传递风格的函数,可以是 ExternFunc。
args (Expr) – 输入参数。
out_sinfo (Union[TensorStructInfo, List[TensorStructInfo]]) – call_dps_packed 输出的结构信息。它应该是单个或 TensorStructInfo 列表。每个都表示返回张量的结构信息。
- 返回:
ret – call_dps_packed 运算符的调用节点。
- 返回类型:
- tvm.relax.op.call_inplace_packed(func: str | ExternFunc | GlobalVar, *args: RelaxExpr, inplace_indices: int | List[int], sinfo_args: StructInfo | List[StructInfo]) RelaxExpr
构造对 packed 函数的调用,该函数“就地”消耗其某些参数并返回已变异的参数(别名),但应被认为是纯函数。inplace_indices 参数指示哪些输出是已变异的参数。
生成的调用将具有与直接调用 packed 函数相同的语义。
注意:这应该用于用户知道使用这些参数调用 packed 函数实际上不会导致任何其他副作用的情况。如果它用于确实导致其他副作用的调用,则编译器最终可能会删除、重新排序或重复该调用,并且不对被调用者的任何副作用做出任何保证。
警告:即使此运算符正在执行副作用(变异某些参数),类型系统也会将其视为纯运算符。因此,用户有责任确保安全地使用它(即,变异的参数在变异后不再有效,它们不会别名变异后仍然有效的值)。
- 参数:
func (Union[str, ExternFunc]) – PackedFunc 或 ExternFunc 节点的名称(全局符号)。
args (Expr) – PackedFunc 的参数。
inplace_indices (Union[int, List[int]]) – 指定应将哪些参数用于就地计算。如果 inplace_indices 是单个整数,则将其设为单例列表。假设 inplace_indices[i] = j,其中 j >= 0。那么第 i 个输出将是 args[j] 的别名。如果 inplace_indices[i] = -1,则第 i 个输出将是新分配的张量。inplace_indices 的至少一个成员不能为 -1。
sinfo_args (Union[StructInfo, List[StructInfo]]) – 结构信息参数列表(给出返回值的结构信息)。
- 返回:
result – Relax 调用,对应于 call_pure_packed(ExternFunc(func), args, DictAttrs(kwargs), sinfo_args)
- 返回类型:
Expr
- tvm.relax.op.call_pure_packed(func: str | ExternFunc | GlobalVar, *args: RelaxExpr, sinfo_args: StructInfo | List[StructInfo]) RelaxExpr
构造对 packed 函数的调用,即使 packed 调用通常不被视为纯函数,也应将其视为纯函数。
生成的调用将具有与直接调用 packed 函数相同的语义。
注意:这应该用于用户知道使用这些参数调用 packed 函数实际上不会导致任何副作用的情况。如果它用于确实导致副作用的调用,则编译器最终可能会删除、重新排序或重复该调用,并且不对被调用者的任何副作用做出任何保证。
- 参数:
func (Union[str, ExternFunc]) – PackedFunc 或 ExternFunc 节点的名称(全局符号)。
args (Expr) – PackedFunc 的参数。
sinfo_args (Union[StructInfo, List[StructInfo]]) – 结构信息参数列表(给出返回值的结构信息)。
- 返回:
result – Relax 调用,对应于 call_pure_packed(ExternFunc(func), args, DictAttrs(kwargs), sinfo_args)
- 返回类型:
Expr
- tvm.relax.op.call_tir(gvar: GlobalVar, args: RelaxExpr, out_sinfo: TensorStructInfo | List[TensorStructInfo], tir_vars: ShapeExpr | Tuple[PrimExpr] | List[PrimExpr] | None = None) Call
relax.Call 调用 tir.prim_func 并返回输出。
- 参数:
gvar (GlobalVar) – 指向 tir PrimFunc 的 GlobalVar。
args (Expr) – 输入参数。
out_sinfo (Union[TensorStructInfo, List[TensorStructInfo]]) – call_tir 输出的结构信息。它应该是单个或 TensorStructInfo 列表。每个都表示返回张量的结构信息。
tir_vars (Optional[Union[ShapeExpr, Tuple[PrimExpr], List[PrimExpr]]]) – ShapeExpr,表示调用 func 时要解包的整数元组。如果不使用,则为空
- 返回:
ret – call_tir 运算符的调用节点。
- 返回类型:
- tvm.relax.op.call_tir_inplace(gvar: GlobalVar, args: RelaxExpr, inplace_indices: int | List[int], out_sinfo: TensorStructInfo | List[TensorStructInfo], tir_vars: ShapeExpr | Tuple[PrimExpr] | List[PrimExpr] | None = None) Call
relax.Call 调用 TIR PrimFunc 并返回结果,根据 inplace_indices 参数就地执行指定的计算;输出将别名由就地索引选择的输入。
警告:此运算符被类型系统视为纯运算符,但实际上会变异 inplace_indices 指定的参数。不应直接使用此运算符,而应由已检查就地执行操作是否安全的 pass 插入此运算符(即,指定为输出的参数均未被别名,并且在调用 call_tir_inplace 后不再有效)。
仅应出于测试目的直接调用此运算符。
- 参数:
gvar (GlobalVar) – 指向 TIR PrimFunc 的 GlobalVar。
args (Expr) – 输入参数。
inplace_indices (Union[int, List[int]]) – 指定应将哪些参数用于就地计算。如果 inplace_indices 是单个整数,则将其设为单例列表。假设 inplace_indices[i] = j,其中 j >= 0。那么第 i 个输出将是 args[j] 的别名。如果 inplace_indices[i] = -1,则第 i 个输出将是新分配的张量。inplace_indices 的至少一个成员不能为 -1。
out_sinfo (Union[TensorStructInfo, List[TensorStructInfo]]) – call_tir_inplace 输出的结构信息。它应该是单个 TensorStructInfo 或 TensorStructInfo 列表。每个都表示返回张量的结构信息。如果给定 TensorStructInfo 列表,则结果将是 TensorStructInfo 元组。
tir_vars (Optional[Union[ShapeExpr, Tuple[PrimExpr], List[PrimExpr]]]) – ShapeExpr,表示调用 func 时要解包的整数元组。如果不使用,则为空
- 返回:
ret – call_tir 运算符的调用节点。
- 返回类型:
- tvm.relax.op.call_tir_with_grad(gvar: GlobalVar, args: RelaxExpr, out_sinfo: TensorStructInfo | List[TensorStructInfo], te_grad_name: str, te_grad_kwargs: Dict[str, Object] = None, tir_vars: ShapeExpr | Tuple[PrimExpr] | List[PrimExpr] | None = None) Call
relax.Call 一个 tir.prim_func 并返回输出。此内联函数将一个 te 梯度函数(由 te_grad_name 引用)绑定到 call_tir_with_grad 节点。te 梯度函数将由 Gradient pass 调用。
- 参数:
gvar (GlobalVar) – 指向 tir PrimFunc 的 GlobalVar。
args (Expr) – 输入参数。
out_sinfo (Union[TensorStructInfo, List[TensorStructInfo]]) – call_tir_with_grad 输出的结构信息。它应该是一个 TensorStructInfo 或 TensorStructInfo 列表。每一个都表示返回张量的结构信息。
te_grad_name (str) – 与 call_tir_with_grad 节点关联的 te 梯度函数的注册名称。必须作为关键字参数提供。
te_grad_kwargs (Dict[str, Object], optional) – 传递给 te 梯度函数的关键字参数。 可选地作为关键字参数提供。默认值:{}。
tir_vars (Optional[Union[ShapeExpr, Tuple[PrimExpr], List[PrimExpr]]]) – ShapeExpr,表示调用 func 时要解包的整数元组。如果不使用,则为空
- 返回:
ret – call_tir_with_grad 运算符的调用节点。
- 返回类型:
- tvm.relax.op.hint_on_device(data, dst_vdevice) RelaxExpr
它提供了一个提示,指定输入数据应在其上执行的设备。 RealizeVDevice 利用此提示来传播虚拟设备。”
- 参数:
data (Expr) – 要复制的张量。
dst_device (VDevice) – 数据应该在其上执行的目标设备。
- 返回:
result – 结果。
- 返回类型:
Expr
- tvm.relax.op.invoke_closure(closure: RelaxExpr, args: RelaxExpr, sinfo_args: List[StructInfo] | StructInfo) Call
调用闭包。
- 参数:
closure (Expr) – VMClosure 对象。
args (Expr) – 输入参数。
type_args (Union[List[StructInfo], StructInfo]) – CallNode 的结构信息参数
- 返回:
ret – 对 invoke_closure 的调用。
- 返回类型:
- tvm.relax.op.invoke_pure_closure(closure: RelaxExpr, args: RelaxExpr, sinfo_args: List[StructInfo] | StructInfo) Call
调用闭包,并向编译器指示它是纯函数。
注意:这应该用于用户知道使用这些参数调用闭包**实际上**不会导致任何副作用的情况。如果它用于_确实_导致副作用的调用,那么编译器最终可能会删除、重新排序或重复该调用,并且不保证来自被调用者的任何副作用。
- 参数:
closure (Expr) – VMClosure 对象。
args (Expr) – 输入参数。
type_args (Union[List[StructInfo], StructInfo]) – CallNode 的结构信息参数
- 返回:
ret – 对 invoke_pure_closure 的调用。
- 返回类型:
- tvm.relax.op.make_closure(func: RelaxExpr, args: RelaxExpr) Object
创建带有自由变量的闭包并返回该闭包。
- 参数:
func (Expr) – 闭包,可以是 ExternFunc 或 PrimFunc。
args (Expr) – 输入参数。
- 返回:
ret – VMClosure。
- 返回类型:
Object
- tvm.relax.op.print(*values: List[RelaxExpr], format: str | RelaxExpr = '') RelaxExpr
打印操作以打印值
- 参数:
values (List[Expr]) – 要打印的值。
format (Union[str, Expr]) – 格式字符串或 StringImm。
- 返回:
result – 一个 relax relax.Call,它将在运行时打印值。
- 返回类型:
Expr
- tvm.relax.op.register_gradient(op_name: str, fgradient: Callable[[Var, Call, Var, BlockBuilder], List[RelaxExpr]] = None, level: int = 10)
为 relax 运算符注册运算符梯度函数。
- tvm.relax.op.shape_of(expr: RelaxExpr) RelaxExpr
获取张量的形状。
- 参数:
expr (Expr) – 输入 Expr。
- 返回:
result – 一个 relax relax.Call,它获取输入的形状
- 返回类型:
Expr
- tvm.relax.op.shape_to_tensor(expr: RelaxExpr) RelaxExpr
将形状转换为张量表达式。 :param expr: 输入 Expr :type expr: Expr
- 返回:
result – 一个 relax relax.Call,它将形状值转换为张量
- 返回类型:
Expr
- tvm.relax.op.tensor_to_shape(expr: RelaxExpr) RelaxExpr
将张量转换为形状表达式。 :param expr: 输入 Expr :type expr: Expr
- 返回:
result – 一个 relax relax.Call,它将张量值转换为形状
- 返回类型:
Expr
- tvm.relax.op.to_vdevice(data, dst_vdevice) RelaxExpr
将数据复制到目标设备。此运算符有助于为异构执行在不同设备之间传输数据。
- 参数:
data (Expr) – 要复制的张量。
dst_device (VDevice) – 数据复制到的目标设备。
- 返回:
result – 复制的结果。
- 返回类型:
Expr
- tvm.relax.op.add(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
使用 numpy 风格广播进行加法。
- 参数:
x1 (Expr) – 第一个输入张量。
x2 (Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
Expr
示例
bb = relax.BlockBuilder() a = relax.Var("a", relax.TensorStructInfo(shape=(2, 3), dtype="float32")) b = relax.Var("b", relax.TensorStructInfo(shape=(2, 1), dtype="float32")) c = bb.normalize(relax.op.add(a, b)) # c has TensorStructInfo(shape=(2, 3), dtype="float32")
- tvm.relax.op.bitwise_and(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
按位与 :param x1: 第一个输入张量。 :type x1: relax.Expr :param x2: 第二个输入张量。 :type x2: relax.Expr
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.bitwise_or(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
按位或 :param x1: 第一个输入张量。 :type x1: relax.Expr :param x2: 第二个输入张量。 :type x2: relax.Expr
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.bitwise_xor(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
按位异或 :param x1: 第一个输入张量。 :type x1: relax.Expr :param x2: 第二个输入张量。 :type x2: relax.Expr
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.divide(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
使用 numpy 风格广播进行除法。
- 参数:
x1 (relax.Expr) – 第一个输入张量。
x2 (relax.Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.equal(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
广播元素方式测试 (lhs == rhs)。
- 参数:
x1 (relax.Expr) – 第一个输入张量。
x2 (relax.Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.floor_divide(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
使用 numpy 风格广播进行向下取整除法。
- 参数:
x1 (relax.Expr) – 第一个输入张量。
x2 (relax.Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.floor_mod(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
使用 numpy 风格广播进行向下取整求模。
- 参数:
x1 (Expr) – 第一个输入张量。
x2 (Expr) – 第二个输入张量。
- tvm.relax.op.greater(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
广播元素方式测试 (lhs > rhs)。
- 参数:
x1 (relax.Expr) – 第一个输入张量。
x2 (relax.Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.greater_equal(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
广播元素方式测试 (lhs >= rhs)。
- 参数:
x1 (relax.Expr) – 第一个输入张量。
x2 (relax.Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.left_shift(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
按位左移 :param x1: 要移位的输入张量。 :type x1: relax.Expr :param x2: 要移位的位数。 :type x2: relax.Expr
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.less(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
广播元素方式测试 (lhs < rhs)。
- 参数:
x1 (relax.Expr) – 第一个输入张量。
x2 (relax.Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.less_equal(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
广播元素方式测试 (lhs <= rhs)。
- 参数:
x1 (relax.Expr) – 第一个输入张量。
x2 (relax.Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.logical_and(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
逻辑与 :param x1: 第一个输入张量。 :type x1: relax.Expr :param x2: 第二个输入张量。 :type x2: relax.Expr
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.logical_or(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
逻辑或 :param x1: 第一个输入张量。 :type x1: relax.Expr :param x2: 第二个输入张量。 :type x2: relax.Expr
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.logical_xor(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
逻辑异或 :param x1: 第一个输入张量。 :type x1: relax.Expr :param x2: 第二个输入张量。 :type x2: relax.Expr
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.maximum(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
元素方式最大值
- 参数:
x1 (relax.Expr) – 第一个输入张量。
x2 (relax.Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.minimum(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
元素方式最小值
- 参数:
x1 (relax.Expr) – 第一个输入张量。
x2 (relax.Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.mod(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
NumPy 风格的广播取模。
- 参数:
x1 (Expr) – 第一个输入张量。
x2 (Expr) – 第二个输入张量。
- tvm.relax.op.multiply(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
NumPy 风格的广播乘法。
- 参数:
x1 (Expr) – 第一个输入张量。
x2 (Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
Expr
- tvm.relax.op.not_equal(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
广播元素级不等式测试 (lhs != rhs)。
- 参数:
x1 (relax.Expr) – 第一个输入张量。
x2 (relax.Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.power(x1: RelaxExpr, x2: RelaxExpr)
NumPy 风格的广播幂运算。
- 参数:
x1 (relax.Expr) – 第一个输入张量。
x2 (relax.Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.right_shift(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
位右移 :param x1: 要进行位移的输入张量。 :type x1: relax.Expr :param x2: 位移的位数。 :type x2: relax.Expr
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.subtract(x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
NumPy 风格的广播减法。
- 参数:
x1 (relax.Expr) – 第一个输入张量。
x2 (relax.Expr) – 第二个输入张量。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.arange(start: int | PrimExpr | PrimValue, end: int | PrimExpr | PrimValue | None = None, step: int | PrimExpr | PrimValue = 1, dtype: str | DataType | None = None) RelaxExpr
构造一个包含均匀间隔元素的张量。
- tvm.relax.op.full(shape: Tuple[int | PrimExpr] | RelaxExpr, fill_value: RelaxExpr, dtype: str | DataType | None = None) RelaxExpr
使用标量值填充数组。
- tvm.relax.op.full_like(x: RelaxExpr, fill_value: RelaxExpr, dtype: str | DataType | None = None) RelaxExpr
构造一个张量,使其: - 形状与输入数据张量的形状相同, - 其值填充为输入的标量填充值。
- 参数:
x (relax.Expr) – 输入张量,提供形状,并在未指定 dtype 字段时提供 dtype。
fill_value (relax.Expr) – 要填充的值。必须是标量张量。
dtype (Optional[Union[str, DataType]]) – 创建的张量的数据类型。如果未给定 dtype,默认情况下将使用输入张量的 dtype。
- 返回:
result – 结果张量。
- 返回类型:
relax.Expr
- tvm.relax.op.ones(shape: Tuple[int | PrimExpr] | RelaxExpr, dtype: str | DataType) RelaxExpr
构造一个所有元素都为 1 的张量,具有输入形状和 dtype。
- tvm.relax.op.ones_like(x: RelaxExpr, dtype: str | DataType | None = None) RelaxExpr
构造一个所有元素都为 1 的张量,其形状与输入张量的形状相同。
- 参数:
x (relax.Expr) – 输入张量,提供形状,并在未指定 dtype 字段时提供 dtype。
dtype (Optional[Union[str, DataType]]) – 创建的张量的数据类型。如果未给定 dtype,默认情况下将使用输入张量的 dtype。
- 返回:
result – 结果张量。
- 返回类型:
relax.Expr
- tvm.relax.op.eye(n: int | PrimExpr | PrimValue, m: int | PrimExpr | PrimValue | None = None, k: int | PrimExpr | PrimValue = 0, dtype: str | DataType = 'float32') RelaxExpr
构造一个 2 维张量,对角线上为 1,其他地方为 0。
- tvm.relax.op.eye_like(x: RelaxExpr, k: int | PrimExpr | PrimValue = 0, dtype: str | DataType | None = None) RelaxExpr
返回一个 2 维张量,对角线上为 1,其他地方为 0,形状与输入张量相同。
- tvm.relax.op.tril(x: RelaxExpr, k: int | PrimExpr | RelaxExpr = 0) RelaxExpr
返回矩阵或一批矩阵的下三角部分。
- 参数:
x (relax.Expr) – 将应用 tril 的张量。要求至少具有两个维度。
k (int) – 指示对角线索引,高于该对角线的元素将置零。如果 k = 0,则对角线为主对角线。如果 k < 0,则对角线位于主对角线下方。如果 k > 0,则对角线位于主对角线上方。
- 返回:
ret – 结果张量。
- 返回类型:
relax.Expr
- tvm.relax.op.triu(x: RelaxExpr, k: int | PrimExpr | RelaxExpr = 0) RelaxExpr
返回矩阵或一批矩阵的上三角部分。
- 参数:
x (relax.Expr) – 将应用 triu 的张量。要求至少具有两个维度。
k (int) – 指示对角线索引,低于该对角线的元素将置零。如果 k = 0,则对角线为主对角线。如果 k < 0,则对角线位于主对角线下方。如果 k > 0,则对角线位于主对角线上方。
- 返回:
ret – 结果张量。
- 返回类型:
relax.Expr
- tvm.relax.op.zeros(shape: Tuple[int | PrimExpr] | RelaxExpr, dtype: str | DataType) RelaxExpr
构造一个所有元素都为 0 的张量,具有输入形状和 dtype。
- tvm.relax.op.zeros_like(x: RelaxExpr, dtype: str | DataType | None = None) RelaxExpr
构造一个所有元素都为 0 的张量,其形状与输入张量的形状相同。
- 参数:
x (relax.Expr) – 输入张量,提供形状,并在未指定 dtype 字段时提供 dtype。
dtype (Optional[Union[str, DataType]]) – 创建的张量的数据类型。如果未给定 dtype,默认情况下将使用输入张量的 dtype。
- 返回:
result – 结果张量。
- 返回类型:
relax.Expr
- tvm.relax.op.astype(x: RelaxExpr, dtype: str | DataType) RelaxExpr
将输入张量转换为给定的数据类型。
- 参数:
x (relax.Expr) – 运算符的输入数据。
dtype (Union[str, DataType]) – 目标数据类型
- 返回:
result – 转换后的结果。
- 返回类型:
relax.Expr
- tvm.relax.op.wrap_param(data: RelaxExpr, dtype: str | DataType = 'float32') RelaxExpr
如果输入数据的dtype与给定的dtype不同,则将作为模型参数的输入张量转换为数据类型。 :param data: 运算符的输入数据。 :type data: relax.Expr :param dtype: 目标数据类型 :type dtype: Union[str, DataType]
- 返回:
result – 转换后的结果。
- 返回类型:
relax.Expr
- tvm.relax.op.dynamic_strided_slice(x: RelaxExpr, begin: RelaxExpr, end: RelaxExpr, strides: RelaxExpr) RelaxExpr
张量的动态步幅切片。 begin,end,strides 可以在运行时计算。
- 参数:
x (Expr) – 要切片的源张量。
begin (Expr) – 切片开始的索引,包含在内。
end (Expr) – 指示切片结束的索引,不包含在内。
strides (Expr) – 指定步幅值,它可以为负数,在这种情况下,输入张量将在该特定轴中反转。如果未指定,则默认情况下它是与 axes 长度相同的 1 列表。
- 返回:
ret – 切片结果。
- 返回类型:
relax.Expr
Note
dyn_strided_slice 要求输入 begin,end 和 strides 的长度与 data 张量的秩相同。
- tvm.relax.op.strided_slice(x: RelaxExpr, axes: RelaxExpr, begin: RelaxExpr, end: RelaxExpr, strides: RelaxExpr | None = None, assume_inbound: bool = False) RelaxExpr
张量的步幅切片。
- 参数:
x (relax.Expr) – 要切片的源张量。
axes (List[int]) – 应用切片的轴。
begin (List[PrimExprLike]) – 切片开始的索引,包含在内。
end (List[PrimExprLike]) – 指示切片结束的索引,不包含在内。
strides (Optional[List[PrimExprLike]]) – 指定步幅值,它可以为负数,在这种情况下,输入张量将在该特定轴中反转。如果未指定,则默认情况下它是与 axes 长度相同的 1 列表。
assume_inbound (bool) – 是否假定索引在界内。 如果设置为 false,则超出界限的索引将被裁剪到界限内。
- 返回:
ret – 切片结果。
- 返回类型:
relax.Expr
Note
strided_slice 要求输入 begin,end 和 strides 的长度与 axes 相同。
- tvm.relax.op.take(x: RelaxExpr, indices: RelaxExpr, axis: int | None = None) RelaxExpr
沿轴从张量中提取元素。 它的语义主要类似于 numpy.take (https://numpy.com.cn/doc/stable/reference/generated/numpy.take.html),它可以覆盖 torch.take (https://pytorch.ac.cn/docs/stable/generated/torch.take.html) 和 onnx.gather (https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Gather-13)。
- 参数:
x (relax.Expr) – 源张量。
indices (relax.Expr) – 要提取的值的索引。
axis (Optional[int]) – 选择值的轴。 如果为 None,则输入张量必须是一维的。
- 返回:
ret – 提取的结果。
- 返回类型:
relax.Expr
- tvm.relax.op.einsum(operands, subscripts)
在数据上评估爱因斯坦求和约定
- tvm.relax.op.linear(data: RelaxExpr, weight: RelaxExpr, bias: RelaxExpr | None = None, out_dtype: str | DataType | None = None) RelaxExpr
对传入数据应用线性变换:y = xA^T + b
- 参数:
data (relax.Expr) – 输入数据。
weight (relax.Expr) – 权重张量。
bias (Optional[Expr]) – 偏置张量。
out_dtype (Optional[Union[str, DataType]]) – matmul 结果的数据类型。 如果未指定,则输出 dtype 将与输入 dtype 相同。
Notes
Relax 不将 Linear Op 视为原始 Op,而是结合转置、matmul 和 add op 来实现它。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.matmul(x1: RelaxExpr, x2: RelaxExpr, out_dtype: str | DataType | None = None) RelaxExpr
两个张量的一般矩阵乘法,在批次维度上进行广播。
语义和输出形状推导规则指定为 https://data-apis.org/array-api/latest/API_specification/generated/array_api.matmul.html。
- 参数:
x1 (relax.Expr) – 第一个输入张量。
x2 (relax.Expr) – 第二个输入张量。
out_dtype (Optional[Union[str, DataType]]) – matmul 结果的数据类型。 如果未指定,则输出 dtype 将与输入 dtype 相同。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.broadcast_to(x: RelaxExpr, shape: Tuple[int | PrimExpr] | RelaxExpr) RelaxExpr
将张量广播到指定的形状。
- 参数:
x (relax.Expr) – 运算符的输入数据。
shape (Union[Tuple[PrimExprLike], Expr]) – 目标形状。
- 返回:
result – 广播后的张量。
- 返回类型:
relax.Expr
- tvm.relax.op.collapse_sum_like(data: RelaxExpr, collapse_target: RelaxExpr) RelaxExpr
返回与 collapse_target 形状相同的 data 的总和。
有关详细信息,请参阅 relax.op.collapse_sum_to。
- 参数:
data (relax.Expr) – 输入张量。
collapse_target (relax.Expr) – 其形状是要折叠到的形状的张量。
- 返回:
result – 求和后的结果张量。
- 返回类型:
relax.Expr
- tvm.relax.op.collapse_sum_to(data: RelaxExpr, shape: Tuple[int | PrimExpr] | RelaxExpr) RelaxExpr
返回与给定形状相同的 data 的总和。
collapse_sum_to 旨在作为 tvm.relax.op.broadcast_to 和自动微分过程中的其他广播运算符的反向运算符。
我们期望 data 是在某些广播操作中广播给定形状的某个张量的结果。 因此,给定的 shape 和 data.shape 必须遵循广播规则。
在计算期间,从右到左检查 data.shape 和 shape 的所有轴。 对于一个轴,如果它遵循以下规则,则 data 将在该轴上求和: - 该轴存在于 data.shape 中,但不存在于 shape 中,或者 - 该轴存在于 data.shape 中,并且在 shape 中等于 1。
- 参数:
data (relax.Expr) – 输入张量。
shape (Union[Tuple[PrimExprLike], relax.Expr]) – 要折叠到的形状。
- 返回:
result – 求和后给定形状的结果张量。
- 返回类型:
relax.Expr
- tvm.relax.op.concat(tensors: RelaxExpr | List[RelaxExpr], axis: int | None = 0) RelaxExpr
沿给定轴连接输入张量。
- 参数:
tensors (Union[relax.Expr, List[relax.Expr]]) – Tuple 类型中的 Expr,包含要连接的张量,或张量列表。
axis (Optional[int]) – 张量连接的轴。 如果 axis 为 None,则需要先展平输入张量,然后再进行连接。
- 返回:
result – 连接后的张量。
- 返回类型:
relax.Expr
- tvm.relax.op.flatten(x: RelaxExpr) RelaxExpr
将所有张量维度展平为一个维度。
- 参数:
x (relax.Expr) – 运算符的输入数据。
- 返回:
result – 展平的结果。
- 返回类型:
relax.Expr
- tvm.relax.op.flip(data, axis)
反转给定轴上元素的顺序,同时保留数组形状。
- 参数:
data (relax.Expr) – 运算符的输入数据。
axis (int) – 要翻转的轴
- 返回:
ret – 计算结果。
- 返回类型:
relax.Expr
示例
x = [[1., 2.], [3., 4.]] relax.flip(x, axis=0) = [[3., 4.], [1., 2.]] relax.flip(x, axis=1) = [[2., 1.], [4., 3.]]
- tvm.relax.op.gather_elements(data: RelaxExpr, indices: RelaxExpr, axis: int = 0) RelaxExpr
根据指定轴的索引从数据中收集元素。
- 参数:
data (relax.Expr) – 运算符的输入数据。
indices (relax.Expr) – 索引张量,必须为整数类型。
axis (int) – 索引的轴。 默认为 0。
- 返回:
ret – 计算结果。
- 返回类型:
relax.Expr
示例
data = [[1, 2], [3, 4]] indices = [[0, 0], [1, 0]] axis = 1 output = [[1, 1], [4, 3]] data = [[1, 2, 3], [4, 5, 6]] indices = [[1, 1, 1]] axis = 0 output = [[4, 5, 6]]
- tvm.relax.op.gather_nd(data: RelaxExpr, indices: RelaxExpr, batch_dims: int = 0) RelaxExpr
使用更新中的值更新索引定义位置的数据。
- 参数:
data (relax.Expr) – 运算符的输入数据。
indices (relax.Expr) – 索引张量,必须为整数类型。
batch_dims (int) – 批次维度的数量。 默认为 0。
- 返回:
ret – 计算结果。
- 返回类型:
relax.Expr
示例
batch_dims = 0 data = [[0,1],[2,3]] # data_shape = [2, 2] indices = [[0,0],[1,1]] # indices_shape = [2, 2] output = [0,3] # output_shape = [2] batch_dims = 1 data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2] indices = [[1],[0]] # indices_shape = [2, 1] output = [[2,3],[4,5]] # output_shape = [2, 2]
- tvm.relax.op.layout_transform(x: RelaxExpr, index_map: Callable | IndexMap, pad_value: int | float | PrimValue | None = None, axis_separators: int | axis_separator | None = None, input_axis_separators: int | axis_separator | None = None)
修改张量的布局。
- 参数:
- 返回:
result – 变换后的张量。
- 返回类型:
relax.Expr
- tvm.relax.op.one_hot(indices: RelaxExpr, on_value: PrimValue, off_value: PrimValue, depth: int, axis: int = -1) RelaxExpr
返回一个 one-hot 张量。
- 参数:
indices (relax.Expr) – 要设置为 on_value 的索引。
on_value (relax.PrimValue) – 在 indices 处填充的值。
off_value (relax.PrimValue) – 在其他位置填充的值。
depth (int) – one-hot 维度的深度。
axis (int, optional) – 要填充的轴。默认为 -1,这将在末尾添加一个新维度。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
示例
indices = [0, 1, 2] depth = 3 on_value = 1 off_value = 0 one_hot(indices, on_value, off_value, depth) = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
- tvm.relax.op.permute_dims(x: RelaxExpr, axes: List[int] | None = None) RelaxExpr
置换数组的维度。
- 参数:
x (relax.Expr) – 运算符的输入数据。
axes (Optional[List[int]]) – 目标轴顺序。如果未指定,permute_dims 将反转所有轴的顺序。
- 返回:
result – 转置后的结果。
- 返回类型:
relax.Expr
- tvm.relax.op.repeat(data: RelaxExpr, repeats: int, axis: int | None = None) RelaxExpr
重复数组的元素。
- 参数:
- 返回:
ret – 计算结果。
- 返回类型:
relax.Expr
示例
x = R.const([[1, 2], [3, 4]]) lv1 = R.repeat(x, repeats=2) # lv1 == [1, 1, 2, 2, 3, 3, 4, 4] lv2 = R.repeat(x, repeats=2, axis=1) # lv2 == [[1., 1., 2., 2.], # [3., 3., 4., 4.]]
- tvm.relax.op.reshape(x: RelaxExpr, shape: Tuple[int | PrimExpr] | RelaxExpr) RelaxExpr
重塑输入数组。
-1
通过使用输入维度的剩余部分来推断输出形状的维度,保持新数组的大小与输入数组的大小相同。形状中最多可以有一个维度为 -1。x.shape = (2, 3, 4), shape = (6, 1, -1), result.shape = (6, 1, 4) x.shape = (2, 3, 4), shape = (3, -1, 8), result.shape = (3, 1, 8) x.shape = (2, 3, 4), shape = (-1,), result.shape = (24,)
- 参数:
x (relax.Expr) – 运算符的输入数据。
shape (Union[Tuple[PrimExprLike], Expr]) – 新形状。应与原始形状兼容。
- 返回:
result – 重塑后的结果。
- 返回类型:
relax.Expr
Note
-1
推断仅在编译时执行。也就是说,在任何情况下,如果无法在编译时推断-1
的维度长度,则会抛出错误。
- tvm.relax.op.scatter_elements(data: RelaxExpr, indices: RelaxExpr, updates: RelaxExpr, axis: int = 0, reduction: str = 'update')
ONNX 风格的 scatter elements。此操作在 indices 指定的特定索引位置,将其在 data 中的值更新为 updates 指定的值。例如,在 2D 张量中,对应于 [i][j] 条目的更新执行如下:
output[indices[i][j]][j] = updates[i][j] if axis = 0 output[i][indices[i][j]] = updates[i][j] if axis = 1
当 reduction 设置为某个归约函数 f 时,对应于 [i][j] 条目的更新执行如下:
output[indices[i][j]][j] += f(output[indices[i][j]][j], updates[i][j]) if axis = 0 output[i][indices[i][j]] += f(output[i][indices[i][j]], updates[i][j]) if axis = 1
其中 f 是 update、add、mul、mean、max、min。
- 参数:
- 返回:
result – 结果的大小与 data 相同,形状与 data 相同
- 返回类型:
relax.Expr
示例
# inputs data = [ [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], ] indices = [ [1, 0, 2], [0, 2, 1], ] updates = [ [1.0, 1.1, 1.2], [2.0, 2.1, 2.2], ] axis = 0 reduction = "update" # output P output = [ [2.0, 1.1, 0.0] [1.0, 0.0, 2.2] [0.0, 2.1, 1.2] ]
- tvm.relax.op.scatter_nd(data: RelaxExpr, indices: RelaxExpr, updates: RelaxExpr, reduction: str = 'update') RelaxExpr
根据索引将更新分散到数组中。
- 参数:
data (relax.Expr) – 要更新的输入数据。
indices (relax.Expr) – 要在 data 中更新的索引位置。
updates (relax.Expr) – 要替换为的值。
reduction (str) – 要应用的归约类型:update、add、mul、max、min。默认为 “update”。
- 返回:
result – 结果具有与 data 相同的形状。
- 返回类型:
relax.Expr
示例
# inputs data = [1, 2, 3, 4, 5, 6, 7, 8] indices = [[4], [3], [1], [7]] updates = [9, 10, 11, 12] # output output = [1, 11, 3, 10, 9, 6, 7, 12]
- tvm.relax.op.split(x: RelaxExpr, indices_or_sections: int | List[int | PrimExpr], axis: int = 0) RelaxExpr
沿轴按节或索引拆分输入张量。
如果 indices_or_sections 是一个整数,则输入将沿给定轴均匀分割(如果可能)。如果张量沿给定维度的大小不能被整数整除,则最后一节会更小。
如果 indices_or_sections 是 int 或 PrimExpr 混合的元组,则条目指示沿轴分割数组的索引。
- tvm.relax.op.tile(data: RelaxExpr, repeats: int | Tuple[int] | List[int]) RelaxExpr
通过将数据重复给定的次数来构造数组。
如果 repeats 的长度为 l,而数据的维度为 d,则结果的维度将为 max(l, d)。
如果 d < l,则通过预先添加新轴将数据提升为 l 维。因此,形状为 (3,) 的张量对于 2-D 复制会提升为 (1, 3),对于 3-D 复制会提升为形状 (1, 1, 3)。如果这不是所需的行为,请在调用此函数之前手动将数据提升为 d 维。
如果 d > l,则通过在其前面添加 1 将 reps 提升为长度 d。因此,对于形状为 (2, 3, 4, 5) 的数据,(2, 2) 的 reps 被视为 (1, 1, 2, 2)。
- 参数:
- 返回:
ret – 计算结果。
- 返回类型:
relax.Expr
示例
x = R.const([[1, 2], [3, 4]]) lv1 = R.tile(x, reps=(2, 3)) # lv1 = [[1., 2., 1., 2., 1., 2.], # [3., 4., 3., 4., 3., 4.], # [1., 2., 1., 2., 1., 2.], # [3., 4., 3., 4., 3., 4.]] lv2 = R.tile(x, reps=2) # lv2 = [[1., 2., 1., 2.], # [3., 4., 3., 4.]]
- tvm.relax.op.masked_fill(x: RelaxExpr, mask: RelaxExpr, value: RelaxExpr)
在由掩码定义的位置用指定值填充张量。 :param x: 算子的输入数据。 :type x: relax.Expr :param mask: 掩码。 :type mask: relax.Expr :param value: 在输入张量中设置的值。 :type value: relax.Expr
- 返回:
result – 填充后的张量。
- 返回类型:
relax.Expr
- tvm.relax.op.dequantize(data: RelaxExpr, scale: RelaxExpr, zero_point: RelaxExpr, axis: int = -1, out_dtype: str = 'float32')
反量化算子。此算子接受输入并生成反量化输出。输入张量可以是任何形状。输出形状与输入形状相同。
output = clamp(scale * (input_tensor - zero_point), out_dtype::min, out_dtype::max)
- tvm.relax.op.quantize(data: RelaxExpr, scale: RelaxExpr, zero_point: RelaxExpr, axis: int = -1, out_dtype: str = 'int8')
量化算子。此算子接受输入并生成量化输出。输入张量可以是任何形状。输出形状与输入形状相同。
Q_output = clamp((round(input_tensor/scale) + zero_point), out_dtype::min, out_dtype::max)
- tvm.relax.op.multinomial_from_uniform(prob: RelaxExpr, uniform_sample: RelaxExpr, sample_indices: RelaxExpr, dtype: str = 'int64') RelaxExpr
返回一个张量,其中每行包含从张量 prob 的相应行中的多项概率分布中采样的索引。
Notes
为了获得更好的 CPU 性能,请使用 ‘vm.builtin.multinomial_from_uniform’。为了获得准确的结果,请确保概率介于 0 和 1 之间,并且总和为 1。
- 参数:
prob (relax.Expr) – 形状为 (batch, vocab_size) 的 2-D 张量,表示概率分布。每行是批次词汇表的分布,其中:值范围为 [0, 1],表示每个词汇项的概率。每行中的值总和为 1,形成有效的分布。
uniform_sample (relax.Expr) – 均匀采样的 2-D 张量,形状为 (n, 1)。值范围为 0 到 1,表示均匀采样的概率。
sample_indices (relax.Expr) – 形状为 [n, 1] 的 2-D 张量,指示要从中采样的特定概率分布。 sample_indices[i] 的值确定第 i 个 token 应从第 sample_indices[i] 个概率分布中采样。例如,如果有 3 个不同的概率分布,并且要求分别从每个分布中采样 2、3 和 4 个 token,则 sample_indices 将为 [0, 0, 1, 1, 1, 2, 2, 2, 2]。
dtype (str) – 输出张量的数据类型。
- 返回:
result – 计算出的张量,形状为 (n, 1)。
- 返回类型:
relax.Expr
示例
prob = [[0.2, 0.3, 0.5], [0.3, 0.4, 0.3]] usample = [[0.4], [0.9]] sample_indices = [[0], [1]] multinomial_from_uniform(prob, usample) -> [[1], [2]] multinomial_from_uniform(prob, usample, sample_indices) -> [[1], [2]]
- tvm.relax.op.argmax(x: RelaxExpr, axis: int | None = None, keepdims: bool = False) RelaxExpr
计算给定轴上张量元素的最大值的索引。
- tvm.relax.op.argmin(x: RelaxExpr, axis: int | None = None, keepdims: bool = False) RelaxExpr
计算给定轴上张量元素的最小值的索引。
- tvm.relax.op.where(condition: RelaxExpr, x1: RelaxExpr, x2: RelaxExpr) RelaxExpr
根据条件的值从输入张量中选择元素。
对于给定的位置,如果 condition 为 True,则返回 x1 中的相应值,否则返回 x2 中的相应值。
- 参数:
condition (relax.Expr) – 当为 True 时,产生 x1;否则,产生 x2。必须与 x1 和 x2 广播兼容。必须具有布尔数据类型。
x1 (relax.Expr) – 第一个输入张量。必须与 condition 和 x2 广播兼容。
x2 (relax.Expr) – 第二个输入张量。必须与 condition 和 x1 广播兼容。
- 返回:
result – 结果张量。
- 返回类型:
relax.Expr
- tvm.relax.op.nonzero(x: RelaxExpr) RelaxExpr
查找张量中非零元素的索引。
- 参数:
x (relax.Expr) – 输入数据张量。
- 返回:
result – 包含非零元素索引的 2-D 张量。
- 返回类型:
relax.Expr
Note
此函数等效于 onnx.nonzero。
示例
x = [[0, 1], [2, 0]] nonzero(x) = [[0, 1], [1, 0]]
- tvm.relax.op.unique(x: RelaxExpr, sorted: bool | RelaxExpr = True, return_index: bool | RelaxExpr = False, return_inverse: bool | RelaxExpr = False, return_counts: bool | RelaxExpr = False, axis: int | RelaxExpr | None = None) RelaxExpr
查找给定张量中的唯一元素。此外,它还可以选择性地返回:- 给出唯一值的输入张量的索引;- 重构输入张量的唯一张量的索引;- 每个唯一值在输入张量中出现的次数。
- 参数:
x (relax.Expr) – 输入张量。
sorted (Union[bool, Expr]) – 是否在作为输出返回之前按升序对唯一元素进行排序。
return_index (Union[bool, Expr]) – 是否返回一个额外的张量,其中包含唯一张量中的元素来自原始输入的索引。
return_inverse (Union[bool, Expr]) – 是否返回一个额外的张量,其中包含原始输入中的元素在返回的唯一列表中最终位置的索引。
return_counts (Union[bool, Expr]) – 是否返回一个额外的张量,其中包含每个唯一元素的计数。
axis (Optional) – 应用 unique 的维度。如果未指定,则返回展平输入的唯一值。
- 返回:
ret – 使用以下内容创建的 relax 调用
- 返回类型:
relax.Expr
- tvm.relax.op.argsort(data: RelaxExpr, axis: int = -1, descending: bool = False, dtype: str = 'int32')
沿给定轴执行排序,并返回一个索引数组,该数组的形状与输入数组相同,用于按排序顺序索引数据。
- tvm.relax.op.topk(data: RelaxExpr, k: int = 1, axis: int = -1, ret_type: str = 'both', largest: bool = True, dtype: str = 'int32')
获取输入张量沿给定轴的前 k 个元素。
ret_type 指定返回类型,可以是 (“both”, “values”, “indices”) 之一。
- 参数:
- 返回:
out – 计算结果。
- 返回类型:
relax.Expr 或 List[relax.Expr]
- tvm.relax.op.cumprod(data: RelaxExpr, axis: int | None = None, dtype: str | DataType | None = None, exclusive: bool = False)
Numpy 风格的 cumprod 运算。返回给定轴上元素的累积乘积。
- 参数:
- 返回:
result – 结果的大小与 data 相同,如果 axis 不为 None,则形状与 data 相同。如果 axis 为 None,则结果为 1-d 数组。
- 返回类型:
relax.Expr
示例
a = [[1, 2, 3], [4, 5, 6]] cumprod(a) # if axis is not provided, cumprod is done over the flattened input. -> [ 1, 2, 6, 24, 120, 720] cumprod(a, dtype="float32") -> [ 1., 2., 6., 24., 120., 720.] cumprod(a, axis=0) # multiply over rows for each of the 3 columns -> [[1, 2, 3], [4, 10, 18]] cumprod(a, axis=1) -> [[ 1, 2, 6], [ 4, 20, 120]] a = [1, 1, 1, 0, 1, 1, 0] # a is a boolean array cumprod(a, dtype=int32) # dtype should be provided to get the expected results -> [1, 1, 1, 0, 0, 0, 0]
- tvm.relax.op.cumsum(data: RelaxExpr, axis: int | None = None, dtype: str | DataType | None = None, exclusive: bool = False)
Numpy 风格的 cumsum 运算。返回给定轴上元素的累积包含和。
- 参数:
- 返回:
result – 结果的大小与 data 相同,如果 axis 不为 None,则形状与 data 相同。如果 axis 为 None,则结果为 1-d 数组。
- 返回类型:
relax.Expr
示例
a = [[1, 2, 3], [4, 5, 6]] cumsum(a) # if axis is not provided, cumsum is done over the flattened input. -> [ 1, 3, 6, 10, 15, 21] cumsum(a, dtype="float32") -> [ 1., 3., 6., 10., 15., 21.] cumsum(a, axis=0) # sum over rows for each of the 3 columns -> [[1, 2, 3], [5, 7, 9]] cumsum(a, axis=1) -> [[ 1, 3, 6], [ 4, 9, 15]] a = [1, 0, 1, 0, 1, 1, 0] # a is a boolean array cumsum(a, dtype=int32) # dtype should be provided to get the expected results -> [1, 1, 2, 2, 3, 4, 4]
- tvm.relax.op.max(x: RelaxExpr, axis: int | List[int] | None = None, keepdims: bool = False) RelaxExpr
计算给定轴上张量元素的最大值。
- tvm.relax.op.mean(x: RelaxExpr, axis: int | List[int] | None = None, keepdims: bool = False) RelaxExpr
计算给定轴上张量元素的平均值。
- tvm.relax.op.min(x: RelaxExpr, axis: int | List[int] | None = None, keepdims: bool = False) RelaxExpr
计算给定轴上张量元素的最小值。
- tvm.relax.op.prod(x: RelaxExpr, axis: int | List[int] | None = None, keepdims: bool = False) RelaxExpr
计算给定轴上张量元素的乘积。
- tvm.relax.op.std(x: RelaxExpr, axis: int | List[int] | None = None, keepdims: bool = False) RelaxExpr
计算给定轴上张量元素的标准差。
- tvm.relax.op.sum(x: RelaxExpr, axis: int | List[int] | None = None, keepdims: bool = False) RelaxExpr
计算给定轴上张量元素的和。
- tvm.relax.op.variance(x: RelaxExpr, axis: int | List[int] | None = None, keepdims: bool = False) RelaxExpr
计算给定轴上张量元素的方差。
- tvm.relax.op.ewise_fma(x1: RelaxExpr, x2: RelaxExpr, x3: RelaxExpr) RelaxExpr
逐元素融合乘加运算符。返回 \(x1 * x2 + x3\) 的逐元素结果
- 参数:
x1 (relax.Expr) – 乘法的左操作数
x2 (relax.Expr) – 乘法的右操作数
x3 (relax.Expr) – 加法的操作数
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.abs(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素绝对值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.acos(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素反余弦值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.acosh(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素反双曲余弦值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.asin(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素反正弦值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.asinh(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素反双曲正弦值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.atan(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素反正切值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.atanh(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素反双曲正切值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.bitwise_not(x: RelaxExpr) RelaxExpr
计算输入数据的按位 NOT。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.ceil(x: RelaxExpr) RelaxExpr
对输入数据向上取整。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.clip(x: RelaxExpr, min: RelaxExpr, max: RelaxExpr) RelaxExpr
将张量值裁剪到指定的最小值和最大值之间。
- 参数:
x (relax.Expr) – 输入数据
min (relax.Expr) – 最小值
max (relax.Expr) – 最大值
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.cos(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素余弦值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.cosh(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素双曲余弦值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.erf(x: RelaxExpr) RelaxExpr
计算输入的误差函数。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 每个元素的计算误差函数。
- 返回类型:
relax.Expr
- tvm.relax.op.exp(x: RelaxExpr) RelaxExpr
计算数据的逐元素指数。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.floor(x: RelaxExpr) RelaxExpr
对输入数据向下取整。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.isfinite(x: RelaxExpr) RelaxExpr
检查输入值是否为有限值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.isinf(x: RelaxExpr) RelaxExpr
检查输入值是否为无穷大。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.isnan(x: RelaxExpr) RelaxExpr
检查输入值是否为 Nan。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.log(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素自然对数。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.logical_not(x: RelaxExpr) RelaxExpr
计算输入数据的逻辑 NOT。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.negative(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素负值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果
- 返回类型:
relax.Expr
- tvm.relax.op.round(x: RelaxExpr) RelaxExpr
将输入数据的每个元素四舍五入到最接近的整数。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.rsqrt(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素倒数平方根。
\[1/sqrt(x)\]- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.sigmoid(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素 Sigmoid 值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.sign(x: RelaxExpr) RelaxExpr
返回输入数据每个元素的符号指示。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.sin(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素正弦值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.sinh(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素双曲正弦值。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.sqrt(x: RelaxExpr) RelaxExpr
计算输入数据的逐元素平方根。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.square(x: RelaxExpr) RelaxExpr
计算输入数据每个元素的平方。
- 参数:
x (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
tvm.relax.op.nn
神经网络相关运算符。
- tvm.relax.op.nn.adaptive_avg_pool1d(data: RelaxExpr, output_size: int | Tuple[int] | None = None, layout: str = 'NCW', out_layout: str | None = None) RelaxExpr
1D 自适应平均池化运算符。此运算符为实验性。
此运算符将数据作为输入,并对由 W 表示的每个窗口执行 1D 平均值计算。
在默认情况下,当 data_layout 为 NCW 时,输入数据张量的形状为 (batch_size, in_channels, width),以生成形状为 (batch_size, in_channels, output_width) 的输出张量。
池化核和步幅大小会自动选择以达到所需的输出大小。
- 对于 output_size
如果未提供此参数,则输入的高度和宽度将用作输出宽度。
如果为 output_size 提供单个整数,则对于任何输入 (NCW),输出大小为 (N x C x output_size)。
- tvm.relax.op.nn.adaptive_avg_pool2d(data: RelaxExpr, output_size: int | Tuple[int, int] | None = None, layout: str = 'NCHW', out_layout: str | None = None) RelaxExpr
2D 自适应平均池化算子。此算子为实验性功能。
此算子将数据作为输入,并在由 WxH 表示的每个窗口上执行 2D 平均值计算。
在默认情况下,当 data_layout 为 NCHW 时,输入数据张量的形状为 (batch_size, in_channels, height, width),输出张量的形状为 (batch_size, in_channels, output_height, output_width)。
池化核和步幅大小会自动选择以达到所需的输出大小。
- 对于 output_size
如果未提供此参数,则输入的高度和宽度将用作输出的高度和宽度。
如果为 output_size 提供单个整数,则对于任何输入 (NCHW),输出大小为 (N x C x output_size x output_size)。
如果为 output_size 提供整数元组 (height, width),则对于任何输入 (NCHW),输出大小为 (N x C x height x width)。
- tvm.relax.op.nn.adaptive_avg_pool3d(data: RelaxExpr, output_size: int | Tuple[int, int] | None = None, layout: str = 'NCDHW', out_layout: str | None = None) RelaxExpr
3D 自适应平均池化算子。此算子为实验性功能。
此算子将数据作为输入,并在由 WxH 表示的每个窗口上执行 3D 平均值计算。
在默认情况下,当 data_layout 为 NCDHW 时,输入数据张量的形状为 (batch_size, in_channels, depth, height, width),输出张量的形状为 (batch_size, in_channels, output_depth, output_height, output_width)。
池化核和步幅大小会自动选择以达到所需的输出大小。
- 对于 output_size
如果未提供此参数,则输入的深度、高度和宽度将用作输出的深度、高度和宽度。
如果为 output_size 提供单个整数,则对于任何输入 (NCDHW),输出大小为 (N x C x output_size x output_size x output_size)。
如果为 output_size 提供整数元组 (depth, height, width),则对于任何输入 (NCDHW),输出大小为 (N x C x depth x height x width)。
- tvm.relax.op.nn.attention(query: RelaxExpr, key: RelaxExpr, value: RelaxExpr, bias: RelaxExpr | None = None, scale: FloatImm | None = None, causal_mask: str | None = None, window_size: int | None = None) RelaxExpr
计算融合多头注意力。
所有输入张量均为 BSNH 布局的 4 维张量。
\[FMA(Q, K, V) = \text{Softmax}(Q @ K^T) @ V\]Note
输入张量需要具有 float16 dtype
- 参数:
query (relax.Expr) – 算子的输入查询(query)。输入查询的布局应为 (batch_size, seq_len, num_head, head_dim)。
key (relax.Expr) – 算子的输入键(key)。输入键的布局应为 (batch_size, seq_len_kv, num_head, head_dim)。
value (relax.Expr) – 算子的输入值(value)。输入值的布局应为 (batch_size, seq_len_kv, num_head, head_dim_v)。
bias (Optional[Expr]) – 算子的可选注意力偏置(bias)。注意力偏置的布局应为以 seq_len_kv 结尾的 4 维张量,并且可广播到 (batch_size, num_head, seq_len, seq_len_kv)。
scale (Optional[float]) – 应用于注意力分数的缩放值(scale value),默认为 1 / sqrt(head_dim)。
causal_mask (Optional[str]) –
可选的因果掩码(causal mask),即 ‘TopLeft’ 和 ‘BottomRight’。对于 ‘TopLeft’,掩码矩阵类似于 np.tril(*, k=0),而对于 ‘BottomRight’,掩码矩阵类似于 np.tril(*, k=abs(seq_len - seq_len_kv))。例如,当 seq_len = 4,seq_len_kv = 2 时,‘TopLeft’ 的掩码为
[[1, 0], [1, 1], [1, 1], [1, 1]]
‘BottomRight’ 的掩码为
[[1, 1], [1, 1], [1, 1], [1, 1]]
当 seq_len = 2,seq_len_kv = 4 时,‘TopLeft’ 的掩码为
[[1, 0, 0, 0], [1, 1, 0, 0]]
‘BottomRight’ 的掩码为
[[1, 1, 1, 0], [1, 1, 1, 1]]
window_size (Optional[int]) – 滑动窗口注意力(sliding-window attention)的窗口大小。
- 返回:
result – 计算结果。输出的布局应为 (batch_size, seq_len, num_head, head_dim_v)。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.attention_var_len(queries: RelaxExpr, keys: RelaxExpr, values: RelaxExpr, seqstart_q: RelaxExpr, max_seqlen_q: RelaxExpr, seqstart_k: RelaxExpr | None = None, max_seqlen_k: RelaxExpr | None = None, scale: FloatImm | None = None, causal_mask: str | None = None, window_size: int | None = None) RelaxExpr
计算变长批次序列上的融合多头注意力。
给定连接的输入和序列长度信息,此算子比为每个序列单独调用普通注意力算子更有效地计算所有序列的注意力。
- 参数:
queries (relax.Expr) – 沿第二个轴连接的输入查询。其形状必须为 (1, total_seq_len, num_head, head_dim)。
keys (relax.Expr) – 沿第二个轴连接的输入键。其形状必须为 (1, total_seq_len_kv, num_head, head_dim)。
values (relax.Expr) – 沿第二个轴连接的输入值。其形状必须为 (1, total_seq_len_kv, num_head, head_dim_v)。
seqstart_q (Optional[Expr]) – 查询序列长度的累积和(cumsum),前面补 0。其 dtype 必须为 int32。例如,如果批处理的序列长度为 [2, 5, 3],则此张量的值为 [0, 2, 7, 10]。
seqstart_k (Optional[Expr]) – 键序列长度的累积和,前面补 0。默认情况下,它与 seqstart_q 相同。
max_seqlen_q (Optional[Expr]) – 批次中最大查询序列长度。它必须是 int32。
max_seqlen_k (Optional[Expr]) – 批次中最大键序列长度。它必须是 int32。默认情况下,它与 max_seqlen_q 相同。
scale (Optional[float]) – 应用于注意力分数的缩放值(scale value),默认为 1 / sqrt(head_dim)。
causal_mask (Optional[str]) –
可选的因果掩码(causal mask),即 ‘TopLeft’ 和 ‘BottomRight’。对于 ‘TopLeft’,掩码矩阵类似于 np.tril(*, k=0),而对于 ‘BottomRight’,掩码矩阵类似于 np.tril(*, k=abs(seq_len - seq_len_kv))。例如,当 seq_len = 4,seq_len_kv = 2 时,‘TopLeft’ 的掩码为
[[1, 0], [1, 1], [1, 1], [1, 1]]
‘BottomRight’ 的掩码为
[[1, 1], [1, 1], [1, 1], [1, 1]]
当 seq_len = 2,seq_len_kv = 4 时,‘TopLeft’ 的掩码为
[[1, 0, 0, 0], [1, 1, 0, 0]]
‘BottomRight’ 的掩码为
[[1, 1, 1, 0], [1, 1, 1, 1]]
window_size (Optional[int]) – 滑动窗口注意力(sliding-window attention)的窗口大小。
- 返回:
result – 计算结果,形状为 (1, total_seq_len, num_head, head_dim_v)。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.avg_pool1d(data: RelaxExpr, pool_size: int | Tuple[int, int] = (1,), strides: int | Tuple[int, int] = (1,), padding: int | Tuple[int, ...] = (0, 0), dilation: int | Tuple[int, int] = (1,), ceil_mode: bool = False, count_include_pad: bool = False, layout: str = 'NCW', out_layout: str | None = None) RelaxExpr
1D 平均池化算子。
此算子将数据作为输入,并在 pool_size 大小的窗口中,以 stride 定义的步长进行 1D 平均值计算。
在默认情况下,当 data_layout 为 NCW 时,输入数据张量的形状为 (batch_size, channels, width),以生成输出张量。
ceil_mode 用于在计算输出形状时选择向上取整或向下取整。count_include_pad 指示在计算中是否包括或排除填充的输入值。此算子接受数据布局规范。
- 参数:
data (relax.Expr) – 运算符的输入数据。
padding (Union[int, Tuple[int, int]]) – 池化的填充(padding)。长度必须为 1 或 2。
dilation (Union[int, Tuple[int]]) – 池化的空洞(dilation)。长度必须为 1。
ceil_mode (bool) – 一个布尔值,指示是使用向上取整还是向下取整来计算输出形状。通过使用向上取整,输入张量中的每个元素都将被滑动窗口覆盖。
count_include_pad (bool, optional) – 是否包含填充以计算平均值。
layout (str) – 输入的布局(Layout)。
out_layout (Optional[str]) – 输出的布局(Layout)。如果未指定,则与 data_layout 相同
- 返回:
result – 计算结果。
- 返回类型:
Expr
- tvm.relax.op.nn.avg_pool2d(data: RelaxExpr, pool_size: int | Tuple[int, int] = (1, 1), strides: int | Tuple[int, int] = (1, 1), padding: int | Tuple[int, ...] = (0, 0), dilation: int | Tuple[int, int] = (1, 1), ceil_mode: bool = False, count_include_pad: bool = False, layout: str = 'NCHW', out_layout: str | None = None) RelaxExpr
2D 平均池化算子。
此算子将数据作为输入,并在 pool_size 大小的窗口中,以 stride 定义的步长进行 2D 平均值计算。
在默认情况下,当 data_layout 为 NCHW 时,输入数据张量的形状为 (batch_size, in_channels, height, width),以生成符合以下规则的输出张量
对于形状为 (b, c, h, w) 的数据和 pool_size (kh, kw)
\[\mbox{out}(b, c, y, x) = \frac{1}{kh * kw} \sum_{m=0, \ldots, kh-1} \sum_{n=0, \ldots, kw-1} \mbox{data}(b, c, \mbox{stride}[0] * y + m, \mbox{stride}[1] * x + n)\]填充在计算之前应用于数据。ceil_mode 用于在计算输出形状时选择向上取整或向下取整。此算子接受数据布局规范。
- 参数:
data (relax.Expr) – 运算符的输入数据。
pool_size (Union[int, Tuple[int, int]]) – 池化窗口的大小。长度必须为 1 或 2。
padding (Union[int, Tuple[int, ...]]) – 池化的填充(padding)。长度必须为 1、2 或 4。
空洞率(dilation) (Union[int, Tuple[int, int]]) – 池化的空洞率。长度必须为 1 或 2。
ceil_mode (bool) – 一个布尔值,指示是使用向上取整还是向下取整来计算输出形状。通过使用向上取整,输入张量中的每个元素都将被滑动窗口覆盖。
count_include_pad (bool, optional) – 是否包含填充以计算平均值。
layout (str) – 输入的布局(Layout)。
out_layout (Optional[str]) – 输出的布局(Layout)。如果未指定,则与 data_layout 相同
- 返回:
result – 计算结果。
- 返回类型:
Expr
- tvm.relax.op.nn.avg_pool3d(data: RelaxExpr, pool_size: int | Tuple[int, int] = (1, 1, 1), strides: int | Tuple[int, int] = (1, 1, 1), padding: int | Tuple[int, ...] = (0, 0, 0), dilation: int | Tuple[int, int] = (1, 1, 1), ceil_mode: bool = False, count_include_pad: bool = False, layout: str = 'NCDHW', out_layout: str | None = None) RelaxExpr
2D 平均池化算子。
此运算符将数据作为输入,并通过步幅定义的 pool_size 大小的窗口执行 3D 平均值计算。
在默认情况下,当 data_layout 为 NCDHW 时,输入数据张量的形状为 (batch_size, channels, depth, height, width),以生成输出张量。
ceil_mode 用于在计算输出形状时选择向上取整或向下取整。count_include_pad 指示在计算中是否包括或排除填充的输入值。此算子接受数据布局规范。
- 参数:
data (relax.Expr) – 运算符的输入数据。
pool_size (Union[int, Tuple[int, int, int]]) – 池化窗口的大小。长度必须为 1 或 3。
strides (Union[int, Tuple[int, int, int]]) – 池化的步幅。长度必须为 1 或 3。
padding (Union[int, Tuple[int, ...]]) – 池化的填充。长度必须为 1、3 或 6。
dilation (Union[int, Tuple[int, int, int]]) – 池化的空洞率。长度必须为 1 或 3。
ceil_mode (bool) – 一个布尔值,指示是使用向上取整还是向下取整来计算输出形状。通过使用向上取整,输入张量中的每个元素都将被滑动窗口覆盖。
count_include_pad (bool, optional) – 是否包含填充以计算平均值。
layout (str) – 输入的布局(Layout)。
out_layout (Optional[str]) – 输出的布局(Layout)。如果未指定,则与 data_layout 相同
- 返回:
result – 计算结果。
- 返回类型:
Expr
- tvm.relax.op.nn.batch_norm(data: RelaxExpr, gamma: RelaxExpr, beta: RelaxExpr, moving_mean: RelaxExpr, moving_var: RelaxExpr, axis: int, epsilon: float = 1e-05, center: bool = True, scale: bool = True, momentum: float = 0.1) RelaxExpr
批归一化层 (Ioffe and Szegedy, 2014)。
在每个批次中对输入进行归一化,即应用一种变换,使平均激活值接近 0,激活值标准差接近 1。
\[\begin{split}data\_mean[i] = mean(data[:,i,:,...]) \\ data\_var[i] = var(data[:,i,:,...])\end{split}\]mean 和 var 都将输入视为向量,并返回标量。
然后计算归一化后的输出,其形状与输入相同,如下所示
\[out[:,i,:,...] = \frac{data[:,i,:,...] - data\_mean[i]}{\sqrt{data\_var[i]+\epsilon}} * gamma[i] + beta[i]\]假设输入在轴 1 上的大小为 k,则
gamma
和beta
的形状均为 (k,)。除了输入和输出之外,此运算符还接受两个辅助状态,
moving_mean
和moving_var
,它们是长度为 k 的向量。它们是整个数据集的全局统计信息,通过以下方式更新:moving_mean = moving_mean * momentum + data_mean * (1 - momentum) moving_var = moving_var * momentum + data_var * (1 - momentum)
参数
axis
指定输入形状的哪个轴表示“通道”(单独归一化的组)。默认值为 1。指定 -1 会将通道轴设置为输入形状中的最后一项。Note
此运算符有两种模式
- 训练模式。
使用从**此**批次计算的均值和方差进行归一化。
更新并返回运行均值和运行方差。
- 推理模式。
使用 running_mean 和 running_var 参数进行归一化。
不更新运行均值和运行方差。仅返回原始值。
在合法化阶段,此运算符默认将被合法化为训练模式。
您可以使用 tvm.relax.transform.DecomposeOpsForInference 来分解运算符,使其执行推理模式计算。类似地,使用 tvm.relax.transform.DecomposeOpsForTraining 来执行训练模式计算。
- 参数:
data (relax.Expr) – 运算符的输入数据。
gamma (relax.Expr) – Gamma 缩放因子。
beta (relax.Expr) – Beta 偏移因子。
moving_mean (relax.Expr) – 输入的运行均值。
moving_var (relax.Expr) – 输入的运行方差。
axis (int) – 应用归一化的轴。
epsilon (float) – 添加到方差中的小浮点数,以避免除以零。
center (bool) – 指示是否将 beta 偏移添加到归一化张量。
scale (bool) – 指示是否将乘以 gamma 缩放。
momentum (float) – 用于 moving_mean 和 moving_var 更新的值。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.conv1d(data: RelaxExpr, weight: RelaxExpr, strides: int | Tuple[int] = 1, padding: int | Tuple[int, ...] = 0, dilation: int | Tuple[int] = 1, groups: int = 1, data_layout: str = 'NCW', kernel_layout: str = 'OIW', out_layout: str | None = None, out_dtype: str | DataType | None = None) RelaxExpr
1D 卷积。
此运算符将权重作为 1D 卷积核,并将其与数据进行卷积以产生输出。
在默认情况下,当 data_layout 为 NCW 且 kernel_layout 为 OIW 时,conv1d 接受形状为 (batch_size, in_channels, width) 的数据张量和形状为 (channels, in_channels, kernel_w) 的权重张量,其中 kernel_w 是 W 核维度的长度,以生成具有以下规则的输出张量
\[\mbox{out}[b, c, x] = \sum_{dx, k} \mbox{data}[b, k, \mbox{strides} * x + dx] * \mbox{weight}[c, k, dx]\]填充和空洞分别应用于数据和权重,然后再进行计算。此运算符接受数据布局规范。从语义上讲,该运算符会将布局转换为规范布局(数据为 NCW,权重为 OIW),执行计算,然后转换为 out_layout。
- 参数:
data (relax.Expr) – 运算符的输入数据。
weight (relax.Expr) – 权重表达式。
padding (Union[int, Tuple[int, ...]]) – 卷积前在输入两侧的填充。长度必须为 1 或 2。
dilation (Union[int, Tuple[int, int]]) – 指定用于空洞卷积的空洞率。长度必须为 1。
groups (int) – 将输入拆分为组以进行分组卷积的组数。输入和输出通道的数量应可被组数整除。
data_layout (str) – 输入的布局。
kernel_layout (str) – 权重的布局。
out_layout (Optional[str]) – 输出的布局(Layout)。如果未指定,则与 data_layout 相同
out_dtype (Optional[Union[str, DataType]]) – 指定混合精度 conv1d 的输出数据类型。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.conv1d_transpose(data: RelaxExpr, weight: RelaxExpr, strides: int | Tuple[int] = 1, padding: int | Tuple[int, ...] = 0, output_padding: int | Tuple[int] = 0, dilation: int | Tuple[int] = 1, groups: int = 1, data_layout: str = 'NCW', kernel_layout: str = 'IOW', out_layout: str | None = None, out_dtype: str | DataType | None = None) RelaxExpr
1D 转置卷积运算符。
此运算符可以看作是 conv1d 的梯度运算符。
输出形状可以在简单情况下解释,即 data_layout == “NCW” 且 kernel_layout == “IOW”。假设 data 的形状为 (N, in_channel, in_w),weight 的形状为 (in_channel, out_channel, weight_w),我们需要确保 in_channel % groups == 0。输出的形状将为 (N, out_channel * groups, out_w),其中
out_w = ((in_w - 1) * strides[0] + weight_w - 2 * padding[0] + output_padding[0])
- 参数:
data (relax.Expr) – 运算符的输入数据。
weight (relax.Expr) – 权重表达式。
padding (Union[int, Tuple[int, ...]]) – 卷积前在输入两侧的填充。长度必须为 1 或 2。
output_padding (Union[int, Tuple[int, ...]], 可选) – 用于消除输出形状的歧义。
groups (int) – 将输入拆分为组以进行分组卷积的组数。输入和输出通道的数量应可被组数整除。
data_layout (str) – 输入的布局。
kernel_layout (str) – 权重的布局。
out_layout (Optional[str]) – 输出的布局(Layout)。如果未指定,则与 data_layout 相同
out_dtype (Optional[Union[str, DataType]]) – 指定混合精度 conv2d 的输出数据类型。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.conv2d(data: RelaxExpr, weight: RelaxExpr, strides: int | Tuple[int, int] = (1, 1), padding: int | Tuple[int, ...] = (0, 0), dilation: int | Tuple[int, int] = (1, 1), groups: int = 1, data_layout: str = 'NCHW', kernel_layout: str = 'OIHW', out_layout: str | None = None, out_dtype: str | DataType | None = None) RelaxExpr
二维卷积。
此运算符将权重作为卷积核,并将其与数据进行卷积以产生输出。
在默认情况下,当 data_layout 为 NCHW 且 kernel_layout 为 OIHW 时,conv2d 接受形状为 (batch_size, in_channels, height, width) 的数据张量和形状为 (channels, in_channels, kernel_h, kernel_w) 的权重张量,其中 kernel_h 和 kernel_w 是 H 和 W 核维度的长度,以生成具有以下规则的输出张量
\[\mbox{out}[b, c, y, x] = \sum_{dy, dx, k} \mbox{data}[b, k, \mbox{strides}[0] * y + dy, \mbox{strides}[1] * x + dx] * \mbox{weight}[c, k, dy, dx]\]在计算之前,填充和空洞分别应用于数据和权重。 此运算符接受数据布局规范。 从语义上讲,该运算符会将布局转换为规范布局(数据为 NCHW,权重为 OIHW),执行计算,然后转换为 out_layout。
- 参数:
data (relax.Expr) – 运算符的输入数据。
weight (relax.Expr) – 权重表达式。
padding (Union[int, Tuple[int, ...]]) – 卷积在卷积之前在输入两侧的填充。 长度必须为 1、2 或 4。
dilation (Union[int, Tuple[int, int]]) – 指定用于空洞卷积的空洞率。 长度必须为 1 或 2。
groups (int) – 将输入拆分为组以进行分组卷积的组数。输入和输出通道的数量应可被组数整除。
data_layout (str) – 输入的布局。
kernel_layout (str) – 权重的布局。
out_layout (Optional[str]) – 输出的布局(Layout)。如果未指定,则与 data_layout 相同
out_dtype (Optional[Union[str, DataType]]) – 指定混合精度 conv2d 的输出数据类型。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.conv2d_transpose(data: RelaxExpr, weight: RelaxExpr, strides: int | Tuple[int, int] = (1, 1), padding: int | Tuple[int, ...] = (0, 0), output_padding: int | Tuple[int, int] = (0, 0), dilation: int | Tuple[int, int] = (1, 1), groups: int = 1, data_layout: str = 'NCHW', kernel_layout: str = 'IOHW', out_layout: str | None = None, out_dtype: str | DataType | None = None) RelaxExpr
二维转置卷积运算符。
此运算符旨在作为 conv2d 的梯度运算符。 也就是说,如果
out = conv2d(data, weight, strides, padding, dilation),
则 w.r.t. 数据的梯度可以按如下方式计算
data_grad = conv2d_transpose(out_grad, weight, strides, padding, output_padding, dilation),
其中 output_padding 是用于确定输出形状的参数。
当 data_layout == “NCHW” 和 kernel_layout == “IOHW” 时,可以在简单情况下解释输出形状。 假设 data 的形状为 (N, in_channel, in_h, in_w),weight 的形状为 (in_channel, out_channel, weight_h, weight_w),我们需要确保 in_channel % groups == 0。 输出的形状将为 (N, out_channel * groups, out_h, out_w),其中
out_h = ((in_h - 1) * strides[0] + weight_h - 2 * padding[0] + output_padding[0])
out_w = ((in_w - 1) * strides[1] + weight_w - 2 * padding[1] + output_padding[1])
- 参数:
data (relax.Expr) – 运算符的输入数据。
weight (relax.Expr) – 权重表达式。
padding (Union[int, Tuple[int, ...]]) – 卷积在卷积之前在输入两侧的填充。 长度必须为 1、2 或 4。
output_padding (Union[int, Tuple[int, ...]], 可选) – 用于消除输出形状的歧义。
dilation (Union[int, Tuple[int, int]]) – 指定用于空洞卷积的空洞率。 长度必须为 1 或 2。
groups (int) – 将输入拆分为组以进行分组卷积的组数。输入和输出通道的数量应可被组数整除。
data_layout (str) – 输入的布局。
kernel_layout (str) – 权重的布局。
out_layout (Optional[str]) – 输出的布局(Layout)。如果未指定,则与 data_layout 相同
out_dtype (Optional[Union[str, DataType]]) – 指定混合精度 conv2d 的输出数据类型。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.conv3d(data: RelaxExpr, weight: RelaxExpr, strides: int | Tuple[int, int] = (1, 1, 1), padding: int | Tuple[int, ...] = (0, 0, 0), dilation: int | Tuple[int, int] = (1, 1, 1), groups: int = 1, data_layout: str = 'NCDHW', kernel_layout: str = 'OIDHW', out_layout: str | None = None, out_dtype: str | DataType | None = None) RelaxExpr
三维卷积。
此运算符将权重作为卷积核,并将其与数据进行卷积以产生输出。
在默认情况下,当 data_layout 为 NCDHW 且 kernel_layout 为 OIDHW 时,conv3d 接受形状为 (batch_size, in_channels, depth, height, width) 的数据张量和形状为 (channels, in_channels, kernel_d, kernel_h, kernel_w) 的权重张量,其中 kernel_d、kernel_h 和 kernel_w 是 D、H 和 W 核维度的长度,以生成具有以下规则的输出张量
\[\mbox{out}[b, c, z, y, x] = \sum_{dz, dy, dx, k} \mbox{data}[b, k, \mbox{strides}[0] * z + dz, \mbox{strides}[1] * y + dy, \mbox{strides}[2] * x + dx] * \mbox{weight}[c, k, dz, dy, dx]\]在计算之前,填充和空洞分别应用于数据和权重。 此运算符接受数据布局规范。 从语义上讲,该运算符会将布局转换为规范布局(数据为 NCDHW,权重为 OIDHW),执行计算,然后转换为 out_layout。
- 参数:
data (relax.Expr) – 运算符的输入数据。
weight (relax.Expr) – 权重表达式。
strides (Union[int, Tuple[int, int, int]]) – 卷积的步幅。 长度必须为 1 或 3。
padding (Union[int, Tuple[int, ...]]) – 卷积在卷积之前在输入两侧的填充。 长度必须为 1、3 或 6。
dilation (Union[int, Tuple[int, int, int]]) – 指定用于空洞卷积的空洞率。 长度必须为 1 或 3。
groups (int) – 将输入拆分为组以进行分组卷积的组数。输入和输出通道的数量应可被组数整除。
data_layout (str) – 输入的布局。
kernel_layout (str) – 权重的布局。
out_layout (Optional[str]) – 输出的布局(Layout)。如果未指定,则与 data_layout 相同
out_dtype (Optional[Union[str, DataType]]) – 指定混合精度 conv2d 的输出数据类型。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.cross_entropy_with_logits(predictions: RelaxExpr, labels: RelaxExpr) RelaxExpr
预测和标签之间使用 logits 的 CrossEntropy。
预测和标签的形状必须相同。 当 ndim >= 2 时,第一维被视为 batch_size N。 在这种情况下,计算结果将除以 N 以执行均值缩减。
\[\text{cross\_entropy\_with\_logits}(x_i, y_i) = \frac{\sum_i -x_i \cdot y_i}{N}\]- 参数:
predictions (relax.Expr) – 预测值。
labels (relax.Expr) – 标签(ground truth 值)。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.dropout(data: RelaxExpr, rate: float = 0.5) RelaxExpr
将 dropout 操作应用于输入张量。
在训练期间,输入的每个元素都以概率
p
设置为零。 整个数组按1/(1-p)
缩放,以保持输入的期望总和不变。- 参数:
data (relax.Expr) – 运算符的输入数据。
rate (float) – 元素重置为 0 的概率。
- 返回:
result – dropout 的结果,它是两个张量的元组。 第一个是原始张量,第二个是掩码张量(未 dropout 的元素为 1.0,dropout 的元素为 0.0)
- 返回类型:
relax.Expr
- tvm.relax.op.nn.gelu(data: RelaxExpr) RelaxExpr
高斯误差线性单元函数
\[\text{GeLU}(x) = 0.5 * x * (1 + \text{erf}(x * 0.5**0.5))\]其中 \(erf\) 是高斯误差函数。
- 参数:
data (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.nn.gelu_tanh(data: RelaxExpr) RelaxExpr
使用 tanh 近似的高斯误差线性单元函数
\[\text{GELU}(x) = 0.5 * x * (1 + \text{Tanh}(\sqrt(2 / \pi) * (x + 0.044715 * x^3)))\]- 参数:
data (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
Note
输入张量需要具有浮点 dtype
- tvm.relax.op.nn.group_norm(data: RelaxExpr, gamma: RelaxExpr, beta: RelaxExpr, num_groups: int, channel_axis: int, axes: int | List[int], epsilon: float = 1e-05, center: bool = True, scale: bool = True) RelaxExpr
Group normalization (Yuxin Wu et al., 2016)。将分组归一化应用于 n 维输入数组。此运算符接受 n 维输入数组。首先沿通道轴将输入数组分成组。然后将层归一化应用于每个组。
- 参数:
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.layer_norm(data: RelaxExpr, gamma: RelaxExpr, beta: RelaxExpr, axes: int | List[int], epsilon: float = 1e-05, center: bool = True, scale: bool = True) RelaxExpr
Layer normalization (Lei Ba et al., 2016)。将层归一化应用于 n 维输入数组。此运算符接受 n 维输入数组,并使用给定的轴对输入进行归一化
\[out = \frac{data - mean(data, axis)}{\sqrt{var(data, axis)+\epsilon}} * gamma + beta\]与批量归一化不同,均值和方差是沿通道维度计算的。
假设轴 1 上的输入大小为 k,则 gamma 和 beta 的形状均为 (k,)。
Note
此运算符可以在推理时被优化掉。
- tvm.relax.op.nn.leakyrelu(data: RelaxExpr, alpha: float = 0.01) RelaxExpr
线性整流单元。
\[text{LeakyReLU, negative_slope}(x) = max(x, 0) + negative_slope * min(x, 0)\]- 参数:
data (relax.Expr) – 输入数据
alpha (float) – 控制负斜率的角度,用于负输入。默认值为 0.01
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.log_softmax(data: RelaxExpr, axis: int = -1) RelaxExpr
计算 log softmax。
\[\text{log\_softmax}(x_i) = \log\left( \frac{\exp(x_i)}{\sum_j \exp(x_j)}\right)\]Note
此运算符可以在推理时被优化掉。
- 参数:
data (relax.Expr) – 运算符的输入数据。
axis (int) – 在计算 log softmax 时要进行求和的轴。如果未指定,则默认为输入张量的最后一个轴。支持负索引。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.max_pool1d(data: RelaxExpr, pool_size: int | Tuple[int, int] = (1,), strides: int | Tuple[int, int] = (1,), padding: int | Tuple[int, ...] = (0, 0), dilation: int | Tuple[int, int] = (1,), ceil_mode: bool = False, count_include_pad: bool = False, layout: str = 'NCW', out_layout: str | None = None) RelaxExpr
一维最大池化运算符。
此运算符将数据作为输入,并在 pool_size 大小的窗口中进行 1D 最大值计算,步幅由 stride 定义。
在默认情况下,当 data_layout 为 NCW 时,数据张量的形状为 (batch_size, channels, width),以生成输出张量。
ceil_mode 用于在计算输出形状时选择向上取整或向下取整。count_include_pad 指示在计算中是否包括或排除填充的输入值。此算子接受数据布局规范。
- tvm.relax.op.nn.max_pool2d(data: RelaxExpr, pool_size: int | Tuple[int, int] = (1, 1), strides: int | Tuple[int, int] = (1, 1), padding: int | Tuple[int, ...] = (0, 0), dilation: int | Tuple[int, int] = (1, 1), ceil_mode: bool = False, count_include_pad: bool = False, layout: str = 'NCHW', out_layout: str | None = None) RelaxExpr
二维最大池化运算符。
此运算符将数据作为输入,并在 pool_size 大小的窗口中进行 2D 最大值计算,步幅由 stride 定义。
在默认情况下,当 data_layout 为 NCHW 时,输入数据张量的形状为 (batch_size, in_channels, height, width),以生成符合以下规则的输出张量
对于形状为 (b, c, h, w) 的数据和 pool_size (kh, kw)
\[\mbox{out}(b, c, y, x) = \max_{m=0, \ldots, kh-1} \max_{n=0, \ldots, kw-1} \mbox{data}(b, c, \mbox{stride}[0] * y + m, \mbox{stride}[1] * x + n)\]填充在计算之前应用于数据。ceil_mode 用于在计算输出形状时选择向上取整或向下取整。此算子接受数据布局规范。
- 参数:
data (relax.Expr) – 运算符的输入数据。
pool_size (Union[int, Tuple[int, int]]) – 池化窗口的大小。长度必须为 1 或 2。
padding (Union[int, Tuple[int, ...]]) – 池化的填充(padding)。长度必须为 1、2 或 4。
空洞率(dilation) (Union[int, Tuple[int, int]]) – 池化的空洞率。长度必须为 1 或 2。
ceil_mode (bool) – 一个布尔值,指示是使用向上取整还是向下取整来计算输出形状。通过使用向上取整,输入张量中的每个元素都将被滑动窗口覆盖。
count_include_pad (bool, optional) – 是否包含填充以计算平均值。
layout (str) – 输入的布局(Layout)。
out_layout (Optional[str]) – 输出的布局(Layout)。如果未指定,则与 data_layout 相同
- 返回:
result – 计算结果。
- 返回类型:
Expr
- tvm.relax.op.nn.max_pool3d(data: RelaxExpr, pool_size: int | Tuple[int, int] = (1, 1, 1), strides: int | Tuple[int, int] = (1, 1, 1), padding: int | Tuple[int, ...] = (0, 0, 0), dilation: int | Tuple[int, int] = (1, 1, 1), ceil_mode: bool = False, count_include_pad: bool = False, layout: str = 'NCDHW', out_layout: str | None = None) RelaxExpr
三维最大池化运算符。
此运算符将数据作为输入,并在 pool_size 大小的窗口中进行 3D 最大值计算,步幅由 stride 定义。
在默认情况下,当 data_layout 为 NCDHW 时,输入数据张量的形状为 (batch_size, channels, depth, height, width),以生成输出张量。
ceil_mode 用于在计算输出形状时选择向上取整或向下取整。count_include_pad 指示在计算中是否包括或排除填充的输入值。此算子接受数据布局规范。
- 参数:
data (relax.Expr) – 运算符的输入数据。
pool_size (Union[int, Tuple[int, int]]) – 池化窗口的大小。 长度必须为 1 或 3。
padding (Union[int, Tuple[int, ...]]) – 池化的填充。长度必须为 1、3 或 6。
dilation (Union[int, Tuple[int, int]]) – 池化的扩张。 长度必须为 1 或 3。
ceil_mode (bool) – 一个布尔值,指示是使用向上取整还是向下取整来计算输出形状。通过使用向上取整,输入张量中的每个元素都将被滑动窗口覆盖。
count_include_pad (bool, optional) – 是否包含填充以计算平均值。
layout (str) – 输入的布局(Layout)。
out_layout (Optional[str]) – 输出的布局(Layout)。如果未指定,则与 data_layout 相同
- 返回:
result – 计算结果。
- 返回类型:
Expr
- tvm.relax.op.nn.nll_loss(predictions: RelaxExpr, targets: RelaxExpr, weights: RelaxExpr | None = None, reduction: str = 'mean', ignore_index: int = -100) RelaxExpr
负对数似然损失。
output[n, i_1, i_2, …, i_k] = -p * w, 其中 - p = predictions[n, t, i_1, i_2, i_k], - t = targets[n, i_1, i_2, …, i_k], - w = weights[t] if t != ignore_index else 0
result = reduction(output)
- 参数:
predictions (relax.Expr) – 预测值。应为 (k+2)-D 张量,形状为 (N, C, d_1, d_2, …, d_k),其中 C 是目标类别的数量。
targets (relax.Expr) – 每个预测的目标值。应为 (k+1)-D 张量,形状为 (N, d_1, d_2, …, d_k)。必须为 int 数据类型。
weights (Optional[relax.Expr]) – 每个目标值的权重。应为 1-D 张量,形状为 (C,)。如果未指定,则视为所有权重均为 1。
reduction (str) – 应用于输出的缩减方法。可能的值为 “mean”、“sum” 和 “none”。
ignore_index (int) – 要忽略的目标值。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.pad(data: RelaxExpr, pad_width: Tuple[Tuple[int, int], ...], pad_mode: str | None = 'constant', pad_value: float | RelaxExpr | None = 0.0)
填充。
此运算符接受一个张量,并使用指定的值按指定的宽度填充每个轴。
- 参数:
data (relax.Expr) – 运算符的输入数据
pad_width (Tuple[Tuple[int, int], ...], required) – 填充到每个轴边缘的值的数量,格式为 ((before_1, after_1), …, (before_N, after_N))
pad_mode (Optional[str]) – ‘constant’、‘edge’ 或 ‘reflect’。‘constant’ 使用 constant_value pad_value 填充。‘edge’ 使用输入数组的边缘值填充。‘reflect’ 通过相对于边缘反射值来填充。默认为 ‘constant’。
pad_value (Optional[Union[float, Expr]]) – 用于填充的值。默认为 0。
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.relu(data: RelaxExpr) RelaxExpr
线性整流单元。
\[\text{ReLU}(x) = \max(x, 0)\]- 参数:
data (relax.Expr) – 输入数据
- 返回:
result – 计算结果。
- 返回类型:
relax.Expr
- tvm.relax.op.nn.rms_norm(data: RelaxExpr, weight: RelaxExpr, axes: int | List[int] = -1, epsilon: float = 1e-05) RelaxExpr
均方根归一化(Biao Zhang 等人,2019)。将均方根归一化应用于 n 维输入数组。此运算符接受 n 维输入数组,并使用给定的轴对输入进行归一化。
\[out = \frac{data}{\sqrt{mean(data, axis)+\epsilon}} * weight + bias\]
tvm.relax.op.builtin
Relax 内置运算符。
tvm.relax.op.ccl
CCL 相关运算符。
- tvm.relax.op.ccl.broadcast_from_worker0(x: RelaxExpr) RelaxExpr
将数据从 worker-0 广播到所有其他工作节点。
- 参数:
x (relax.Expr) – 要广播的张量。
- 返回:
result – 相同的张量,已广播到所有其他工作节点。
- 返回类型:
relax.Expr
tvm.relax.op.distributed
用于分布式 Relax 的运算符。
- tvm.relax.op.distributed.annotate_sharding(input: RelaxExpr, device_mesh: DeviceMesh, placement: Placement) RelaxExpr
为张量注释分片计划
- 参数:
input (relax.Expr) – 输入张量。
device_mesh (DeviceMesh) – 分片计划的设备网格
placement (Placement) – 分片计划的放置
- 返回:
result – 未修改的张量。
- 返回类型:
relax.Expr
- tvm.relax.op.distributed.redistribute(input: RelaxExpr, device_mesh: DeviceMesh, placement: Placement) RelaxExpr
重分布张量
- 参数:
input (relax.Expr) – 输入张量。
device_mesh (DeviceMesh) – 重分布后的设备网格
placement (Placement) – 重分布后的放置
- 返回:
result – 重分布后的张量。
- 返回类型:
relax.Expr
- tvm.relax.op.distributed.call_tir_local_view(gvar: GlobalVar, args: RelaxExpr, out_sinfo: DTensorStructInfo | List[DTensorStructInfo], tir_vars: ShapeExpr | Tuple[PrimExpr] | List[PrimExpr] | None = None) Call
relax.Call 一个 tir.prim_func 并返回输出。prim_func 应该是一个 worker-local 函数,它实际上在每个 worker 上执行,而不是未分区的函数。此运算符的输出是 DTensor 或 DTensor 元组。
- 参数:
gvar (GlobalVar) – 指向 tir PrimFunc 的 GlobalVar。
args (Expr) – 输入参数。
out_sinfo (Union[DTensorStructInfo, List[DTensorStructInfo]]) – call_tir 输出的结构信息。它应该是一个或一个 DTensorStructInfo 列表。每一个都表示返回张量的结构信息。
tir_vars (Optional[Union[ShapeExpr, Tuple[PrimExpr], List[PrimExpr]]]) – ShapeExpr,表示调用 func 时要解包的整数元组。如果不使用,则为空
- 返回:
ret – call_tir_local_view 运算符的调用节点。
- 返回类型:
tvm.relax.op.grad
用于查找 relax 运算符梯度的运算符。
- tvm.relax.op.grad.avg_pool2d_backward(output_grad: RelaxExpr, data: RelaxExpr, pool_size: Tuple[int, int] = (1, 1), strides: Tuple[int, int] = (1, 1), padding: Tuple[int, int, int, int] = (0, 0, 0, 0), dilation: Tuple[int, int] = (1, 1), ceil_mode: bool = False, count_include_pad: bool = False, layout: str = 'NCHW', out_layout: str | None = None) RelaxExpr
relax.nn.avg_pool2d 的反向运算符。除 output_grad 外的所有参数均与 relax.nn.avg_pool2d 相同。返回关于 data 的梯度。
- 参数:
output_grad (relax.Expr) – 关于 avg_pool2d 结果的梯度。
- 返回:
result – 关于 data 的梯度。
- 返回类型:
relax.Expr
- tvm.relax.op.grad.end_checkpoint(input: RelaxExpr) RelaxExpr
标记检查点阶段的结束。 请参阅 tvm.relax.op.grad.start_checkpoint。
- 参数:
input (relax.Expr) – 检查点阶段的输出。
- 返回:
result – 与输入相同的张量。
- 返回类型:
relax.Expr
- tvm.relax.op.grad.max_pool2d_backward(output_grad: RelaxExpr, data: RelaxExpr, pool_size: Tuple[int, int] = (1, 1), strides: Tuple[int, int] = (1, 1), padding: Tuple[int, int, int, int] = (0, 0, 0, 0), dilation: Tuple[int, int] = (1, 1), ceil_mode: bool = False, count_include_pad: bool = False, layout: str = 'NCHW', out_layout: str | None = None) RelaxExpr
relax.nn.max_pool2d 的反向运算符。除 output_grad 外的所有参数均与 relax.nn.max_pool2d 相同。返回关于 data 的梯度。
- 参数:
output_grad (relax.Expr) – 关于 max_pool2d 结果的梯度。
- 返回:
result – 关于 data 的梯度。
- 返回类型:
relax.Expr
- tvm.relax.op.grad.nll_loss_backward(output_grad: RelaxExpr, predictions: RelaxExpr, targets: RelaxExpr, weights: RelaxExpr | None = None, reduction: str = 'mean', ignore_index: int = -100) RelaxExpr
relax.nn.nll_loss 的反向运算符。除 output_grad 外的所有参数均与 relax.nn.nll_loss 相同。返回关于 predictions 的梯度。
- 参数:
output_grad (relax.Expr) – 关于 nll_loss 结果的梯度。
- 返回:
result – 关于 predictions 的梯度。
- 返回类型:
relax.Expr
- tvm.relax.op.grad.no_grad(input: RelaxExpr) RelaxExpr
关于输入的无梯度虚拟运算符。
- 参数:
input (relax.Expr) – 对应的输入张量。
- 返回:
result – 关于输入的无梯度表示。
- 返回类型:
relax.Expr
- tvm.relax.op.grad.start_checkpoint(input: RelaxExpr) RelaxExpr
标记检查点阶段的开始。start_checkpoint 和 end_checkpoint 之间的计算将被标记为检查点阶段。
检查点阶段不保存所有中间激活,而是在反向传播过程中重新计算它们,而不是存储整个计算图的所有中间激活以用于计算反向传播。
例如,
` a = relax.Var("a", relax.TensorStructInfo((2, 2), "float32")) b = relax.Var("b", relax.TensorStructInfo((2, 2), "float32")) c = a * 2 d = b * 2 c_cp = start_checkpoint(c) d_cp = start_checkpoint(d) e = c_cp + d_cp e_out = end_checkpoint(e) `
然后将在反向传播阶段重新计算 e。有关更多信息,请参阅 tvm.relax.transform.Gradient、tvm.relax.testing.nn.checkpoint、tvm.relax.op.grad.end_checkpoint。
- 参数:
input (relax.Expr) – 标记检查点阶段输入的张量。
- 返回:
result – 与输入相同的张量。
- 返回类型:
relax.Expr
tvm.relax.op.image
图像运算符。
- tvm.relax.op.image.resize2d(data: RelaxExpr, size: RelaxExpr | int | PrimExpr | Tuple[int | PrimExpr], roi: float | Tuple[float] | None = None, layout: str = 'NCHW', method: str = 'linear', coordinate_transformation_mode: str = 'half_pixel', rounding_method: str = 'round', cubic_alpha: float = -0.5, cubic_exclude: int = 0, extrapolation_value: float = 0.0, out_dtype: str | DataType | None = None) RelaxExpr
图像 resize2d 运算符。
此运算符将数据作为输入,并对给定的缩放因子进行 2D 缩放。在默认情况下,当 data_layout 为 NCHW 且数据形状为 (n, c, h, w) 时,输出的形状将为 (n, c, size[0], size[1])
method 指示计算输出值时要使用的算法,method 可以是 (“linear”, “nearest_neighbor”, “cubic”) 之一
- 参数:
data (relax.Expr) – 运算符的输入数据。
size (Union[Expr, PrimExprLike, Tuple[PrimExprLike]]) – 图像将被调整为的输出大小。如果指定为列表,则其长度必须为 1 或 2。如果指定为 Expr,则其 ndim 必须为 2。
roi (Optional[Union[float, Tuple[float]]]) – 用于裁剪输入图像的感兴趣区域。 预期大小为 4,格式为 [start_h, start_w, end_h, end_w]。仅当 coordinate_transformation_mode 为 tf_crop_and_resize 时使用。
layout (str) – 输入的布局(Layout)。
method (str) – 要使用的缩放方法 [nearest_neighbor, linear, cubic]。
coordinate_transformation_mode (str) – 描述如何将调整大小的张量中的坐标转换为原始张量中的坐标。定义可以在 topi/image/resize.py 中找到。[half_pixel, align_corners, asymmetric, pytorch_half_pixel, tf_half_pixel_for_nn, 和 tf_crop_and_resize]。
rounding_method (str) – 指示如何在 nearest_neighbor 方法中查找“最近”像素 [round, floor, ceil]
cubic_alpha (float) – 双三次插值的样条系数
cubic_exclude (int) – 在双三次插值期间排除图像外部的标志
extrapolation_value (float) – 当 roi 在图像外部时使用的填充值
out_dtype (Optional[Union[str, DataType]]) – 输出张量的数据类型。如果未指定,则如果未指定,则输出将具有与输入相同的数据类型。
- 返回:
result – 调整大小后的结果。
- 返回类型:
relax.Expr
tvm.relax.op.memory
Relax 内存原语。
- tvm.relax.op.memory.alloc_storage(size: RelaxExpr, virtual_device_index: int | RelaxExpr, storage_scope: str | RelaxExpr, dtype: str | RelaxExpr) Call
构造一个 relax.Call,以分配具有特定大小、virtual_device_index、storage_scope 和 dtype 的存储。
- 参数:
- 返回:
result – 一个 relax relax.Call,它获取分配的存储。
- 返回类型:
- tvm.relax.op.memory.alloc_tensor(storage: RelaxExpr, offset: int | RelaxExpr, shape: RelaxExpr, dtype: str | RelaxExpr) Call
构造一个 relax.Call,以在从给定偏移量开始的特定存储上分配张量。
- 参数:
- 返回:
result – 一个 relax relax.Call,它获取已分配的张量。
- 返回类型:
- tvm.relax.op.memory.kill_storage(storage: RelaxExpr) Call
构造一个 relax.Call 以销毁存储。
- 参数:
storage (Expr) – 要销毁的存储。
- 返回:
result – 一个 relax relax.Call,用于销毁存储。
- 返回类型:
- tvm.relax.op.memory.kill_tensor(tensor: RelaxExpr) Call
构造一个 relax.Call 以销毁张量。
- 参数:
tensor (Expr) – 要销毁的张量。
- 返回:
result – 一个 relax relax.Call,用于销毁张量。
- 返回类型:
- tvm.relax.op.memory.view(data: RelaxExpr, shape: Sequence[int | PrimExpr] | RelaxExpr | None = None, dtype: RelaxExpr | None = None, relative_byte_offset: RelaxExpr | None = None) RelaxExpr
提供现有张量的视图
视图可能具有不同的形状、不同的数据类型,并且可能相对于源数组以偏移量开始。
无论使用这些选项的哪种组合,视图都绝不能访问输入 data 数组无法访问的内存。即使 data 数组本身是共享后备数组的视图,此限制也适用。
- 参数:
data (relax.Expr) – 运算符的输入数据。
shape (Optional[Union[Sequence[PrimExprLike], Expr]]) – 目标形状。应为 relax.ShapeExpr,或可转换为 relax.ShapeExpr 的集合。
dtype (Optional[Expr]) – 目标数据类型。应为 relax.ShapeExpr,或可转换为 relax.ShapeExpr 的集合。
relative_byte_offset (Optional[Expr]) – 输出 NDArray 的偏移量,相对于 data 的字节偏移量。如果为 None,则视图的偏移量与 data 的偏移量相同。
- 返回:
result – 张量视图
- 返回类型:
relax.Expr
tvm.relax.op.op_attrs
用于 Relax 运算符的属性节点
- class tvm.relax.op.op_attrs.CallTIRWithGradAttrs
call_tir_with_grad 运算符中使用的属性
- class tvm.relax.op.op_attrs.InitAttrs
full/full_like、ones/ones_like 和 zeros/zeros_like 运算符中使用的属性
- class tvm.relax.op.op_attrs.TriluAttrs
tril 和 triu 运算符中使用的属性
- class tvm.relax.op.op_attrs.AstypeAttrs
astype 运算符中使用的属性
- class tvm.relax.op.op_attrs.TakeAttrs
take 运算符中使用的属性
- class tvm.relax.op.op_attrs.StridedSliceAttrs
strided_slice 运算符中使用的属性
- class tvm.relax.op.op_attrs.MatmulAttrs
matmul 运算符的属性
- class tvm.relax.op.op_attrs.Conv2DAttrs
nn.conv2d 的属性
- class tvm.relax.op.op_attrs.Conv3DAttrs
nn.conv3d 的属性
- class tvm.relax.op.op_attrs.Conv2DTransposeAttrs
nn.conv2d_transpose 的属性
- class tvm.relax.op.op_attrs.Pool2DAttrs
nn.max_pool2d 的属性
- class tvm.relax.op.op_attrs.AdaptivePool2DAttrs
2d 自适应池化运算符的属性
- class tvm.relax.op.op_attrs.SoftmaxAttrs
nn.softmax 的属性
- class tvm.relax.op.op_attrs.BatchNormAttrs
batch_norm 运算符中使用的属性
- class tvm.relax.op.op_attrs.LayerNormAttrs
layer_norm 运算符中使用的属性
- class tvm.relax.op.op_attrs.DropoutAttrs
dropout 运算符的属性
- class tvm.relax.op.op_attrs.StatisticalAttrs
statistical 运算符中使用的属性
- class tvm.relax.op.op_attrs.ConcatAttrs
concat 运算符的属性
- class tvm.relax.op.op_attrs.ExpandDimsAttrs
expand_dims 运算符的属性
- class tvm.relax.op.op_attrs.PermuteDimsAttrs
permute_dims 运算符的属性
- class tvm.relax.op.op_attrs.SortAttrs
sort 运算符的属性
- class tvm.relax.op.op_attrs.ArgsortAttrs
argsort 运算符的属性
- class tvm.relax.op.op_attrs.SplitAttrs
split 运算符中使用的属性
- class tvm.relax.op.op_attrs.SqueezeAttrs
squeeze 运算符的属性
- class tvm.relax.op.op_attrs.LayoutTransformAttrs
layout_transform 运算符中使用的属性
- class tvm.relax.op.op_attrs.Resize2DAttrs
image resize2d 运算符中使用的属性
- class tvm.relax.op.op_attrs.ArgmaxArgminAttrs
argmax/argmin 运算符的属性
- class tvm.relax.op.op_attrs.RepeatAttrs
repeat 运算符的属性
- class tvm.relax.op.op_attrs.TileAttrs
tile 运算符的属性
- class tvm.relax.op.op_attrs.ScanopAttrs
scan 运算符的属性
- class tvm.relax.op.op_attrs.TopKAttrs
topk 运算符的属性
- class tvm.relax.op.op_attrs.EinsumAttrs
einsum 运算符的属性
- class tvm.relax.op.op_attrs.FlipAttrs
flip 运算符的属性