已合并
docs: 新增BatchMatMulV3/MatMulV3算子Ascend IR接口文档 #10433
林泽辉创建于 9月15日
docs: 新增BatchMatMulV3/MatMulV3算子Ascend IR接口文档 #10433
已合并
共 2 个文件变更+187-0
| @@ -0,0 +1,92 @@ | |||
| 1 | +# BatchMatMulV3 | ||
| 2 | + | ||
| 3 | +## 产品支持情况 | ||
| 4 | + | ||
| 5 | +<!-- npu="950" id1 --> | ||
| 6 | +- <term>Ascend 950PR/Ascend 950DT</term>:支持 | ||
| 7 | +<!-- end id1 --> | ||
| 8 | +<!-- npu="A3" id2 --> | ||
| 9 | +- <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>:支持 | ||
| 10 | +<!-- end id2 --> | ||
| 11 | +<!-- npu="910b" id3 --> | ||
| 12 | +- <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>:支持 | ||
| 13 | +<!-- end id3 --> | ||
| 14 | +<!-- npu="310b" id4 --> | ||
| 15 | +- <term>Atlas 200I/500 A2 推理产品</term>:不支持 | ||
| 16 | +<!-- end id4 --> | ||
| 17 | +<!-- npu="310p" id5 --> | ||
| 18 | +- <term>Atlas 推理系列产品</term>:支持 | ||
| 19 | +<!-- end id5 --> | ||
| 20 | +<!-- npu="910" id6 --> | ||
| 21 | +- <term>Atlas 训练系列产品</term>:支持 | ||
| 22 | +<!-- end id6 --> | ||
| 23 | + | ||
| 24 | +## 功能说明 | ||
| 25 | + | ||
| 26 | +- 算子功能:完成带batch维度的矩阵乘计算,输入支持2~6维,前若干维为batch维度(支持batch维广播),最后两维做矩阵乘计算,并支持在乘法结果上累加偏置向量(bias)。 | ||
| 27 | +- 计算公式: | ||
| 28 | + | ||
| 29 | + $$ | ||
| 30 | + y = x1 @ x2 + bias | ||
| 31 | + $$ | ||
| 32 | + | ||
| 33 | + 其中: | ||
| 34 | + - $x1$:左矩阵,最后两维为$(M, K)$;当adj_x1=true时,$x1$传入的最后两维为$(K, M)$,计算时逻辑转置为$(M, K)$。 | ||
| 35 | + - $x2$:右矩阵,最后两维为$(K, N)$;当adj_x2=true时,$x2$传入的最后两维为$(N, K)$,计算时逻辑转置为$(K, N)$。 | ||
| 36 | + - $bias$:维度为$(N)$、$(1, N)$或$(B, 1, N)$的偏置向量,逐元素累加到乘法结果对应列上。 | ||
| 37 | + - $y$:输出矩阵,最后两维为$(M, N)$,batch维度为$x1$与$x2$广播后的结果。例如$x1$、$x2$输入维度分别为$(B, M, K)$、$(B, K, N)$时,$y$维度为$(B, M, N)$。B为矩阵乘法的batch数,M为$x1$的行数和$y$的行数,N为$x2$的列数和$y$的列数,K为$x1$的列数和$x2$的行数。 | ||
| 38 | + | ||
| 39 | +## Ascend IR定义 | ||
| 40 | + | ||
| 41 | +Ascend IR定义所在头文件路径:[batch_mat_mul_v3_proto.h](../op_graph/batch_mat_mul_v3_proto.h) | ||
| 42 | + | ||
| 43 | +```cpp | ||
| 44 | +REG_OP(BatchMatMulV3) | ||
| 45 | + .INPUT(x1, TensorType({DT_FLOAT16, DT_BF16, DT_FLOAT})) | ||
| 46 | + .INPUT(x2, TensorType({DT_FLOAT16, DT_BF16, DT_FLOAT})) | ||
| 47 | + .OPTIONAL_INPUT(bias, TensorType({DT_FLOAT16, DT_FLOAT, DT_BF16})) | ||
| 48 | + .OUTPUT(y, TensorType({DT_FLOAT16, DT_BF16, DT_FLOAT})) | ||
| 49 | + .OPTIONAL_INPUT(offset_w, TensorType({DT_INT8, DT_INT4})) | ||
| 50 | + .ATTR(adj_x1, Bool, false) | ||
| 51 | + .ATTR(adj_x2, Bool, false) | ||
| 52 | + .ATTR(offset_x, Int, 0) | ||
| 53 | + .ATTR(enable_hf32, Bool, false) | ||
| 54 | + .OP_END_FACTORY_REG(BatchMatMulV3) | ||
| 55 | +``` | ||
| 56 | + | ||
| 57 | +## 参数说明 | ||
| 58 | + | ||
| 59 | +| 参数名 | 输入/属性/输出 | 描述 | 使用说明 | 数据类型 | 数据格式 | 维度(shape) | | ||
| 60 | +| ------ | -------------- | ---- | -------- | -------- | -------- | ------------- | | ||
| 61 | +| x1 | 必选输入 | 矩阵乘运算的左矩阵,公式中的$x1$。 | adj_x1=false时,最后两维为(M, K);adj_x1=true时,最后两维为(K, M),计算时逻辑转置为(M, K)参与计算。 | FLOAT16、BFLOAT16、FLOAT32 | ND、FRACTAL_NZ | 2~6 | | ||
| 62 | +| x2 | 必选输入 | 矩阵乘运算的右矩阵,公式中的$x2$。 | adj_x2=false时,最后两维为(K, N);adj_x2=true时,最后两维为(N, K),计算时逻辑转置为(K, N)参与计算。Reduce维度K需与x1一致。 | FLOAT16、BFLOAT16、FLOAT32 | ND、FRACTAL_NZ | 2~6 | | ||
| 63 | +| bias | 可选输入 | 矩阵乘运算结果上累加的偏置向量,公式中的$bias$。 | N需与x2的N维一致。 | FLOAT16、BFLOAT16、FLOAT32 | ND | 1~3 | | ||
| 64 | +| offset_w | 可选输入 | 权重量化偏移矩阵。 | 预留参数,当前暂不支持。 | INT8、INT4 | ND | 2 | | ||
| 65 | +| y | 必选输出 | 矩阵乘运算的计算结果,公式中的$y$。 | batch维度为x1与x2广播后的结果。 | FLOAT16、BFLOAT16、FLOAT32 | ND、FRACTAL_NZ | 2~6 | | ||
| 66 | +| adj_x1 | 必选属性 | 指示左矩阵x1参与矩阵乘前是否转置。 | 默认值false;取值true时x1最后两维逻辑转置后参与计算。 | Bool | - | - | | ||
| 67 | +| adj_x2 | 必选属性 | 指示右矩阵x2参与矩阵乘前是否转置。 | 默认值false;取值true时x2最后两维逻辑转置后参与计算。 | Bool | - | - | | ||
| 68 | +| offset_x | 必选属性 | 左矩阵x1的量化偏移。 | 预留参数,当前暂不支持。默认值0。 | Int | - | - | | ||
| 69 | +| enable_hf32 | 必选属性 | 指示是否以HFLOAT32(高精度浮点32位)模式执行计算。 | 默认值false。 | Bool | - | - | | ||
| 70 | + | ||
| 71 | +<!-- npu="950" id7 --> | ||
| 72 | +- <term>Ascend 950PR/Ascend 950DT</term>:仅x2支持FRACTAL_NZ格式。 | ||
| 73 | +<!-- end id7 --> | ||
| 74 | +<!-- npu="A3,910b" id8 --> | ||
| 75 | +- <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>、<term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>:bias不支持BFLOAT16数据类型。 | ||
| 76 | +<!-- end id8 --> | ||
| 77 | +<!-- npu="310p" id9 --> | ||
| 78 | +- <term>Atlas 推理系列产品</term>:仅支持FLOAT16数据类型,且x2仅支持FRACTAL_NZ格式。 | ||
| 79 | +<!-- end id9 --> | ||
| 80 | + | ||
| 81 | +## 约束说明 | ||
| 82 | + | ||
| 83 | +- 确定性计算:默认确定性实现。 | ||
| 84 | +- 支持空tensor,空tensor场景下不支持bias。 | ||
| 85 | +- 支持连续tensor,[非连续tensor](../../../docs/zh/context/non_contiguous_tensor.md)仅支持转置场景。 | ||
| 86 | +- x1与x2的batch维度需满足[broadcast关系](../../../docs/zh/context/broadcast_relationship.md),Reduce维度K需大小相等。 | ||
| 87 | + | ||
| 88 | +## 调用示例 | ||
| 89 | + | ||
| 90 | +| 调用方式 | 样例代码 | 说明 | | ||
| 91 | +| ---------------- | --------------------------- | --------------------------------------------------- | | ||
| 92 | +| aclnn接口 | [test_aclnn_batchmatmul](../examples/test_aclnn_batchmatmul.cpp) | 通过<br>[aclnnAddbmm&aclnnInplaceAddbmm](aclnnAddbmm&aclnnInplaceAddbmm.md)<br>[aclnnBaddbmm&aclnnInplaceBaddbmm](aclnnBaddbmm&aclnnInplaceBaddbmm.md)<br>[aclnnBatchMatMul](aclnnBatchMatMul.md)<br>[aclnnBatchMatMulWeightNz](aclnnBatchMatMulWeightNz.md)<br>等方式调用BatchMatMulV3算子。 | | ||
| @@ -0,0 +1,95 @@ | |||
| 1 | +# MatMulV3 | ||
| 2 | + | ||
| 3 | +## 产品支持情况 | ||
| 4 | + | ||
| 5 | +<!-- npu="950" id1 --> | ||
| 6 | +- <term>Ascend 950PR/Ascend 950DT</term>:支持 | ||
| 7 | +<!-- end id1 --> | ||
| 8 | +<!-- npu="A3" id2 --> | ||
| 9 | +- <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>:支持 | ||
| 10 | +<!-- end id2 --> | ||
| 11 | +<!-- npu="910b" id3 --> | ||
| 12 | +- <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>:支持 | ||
| 13 | +<!-- end id3 --> | ||
| 14 | +<!-- npu="310b" id4 --> | ||
| 15 | +- <term>Atlas 200I/500 A2 推理产品</term>:不支持 | ||
| 16 | +<!-- end id4 --> | ||
| 17 | +<!-- npu="310p" id5 --> | ||
| 18 | +- <term>Atlas 推理系列产品</term>:支持 | ||
| 19 | +<!-- end id5 --> | ||
| 20 | +<!-- npu="910" id6 --> | ||
| 21 | +- <term>Atlas 训练系列产品</term>:不支持 | ||
| 22 | +<!-- end id6 --> | ||
| 23 | + | ||
| 24 | +## 功能说明 | ||
| 25 | + | ||
| 26 | +- 算子功能:完成两个二维矩阵的通用矩阵乘(GEMM)计算,支持通过属性分别控制左矩阵、右矩阵在参与计算前是否转置,并支持在乘法结果上按列累加偏置向量(bias),即"乘、加"一步完成。 | ||
| 27 | +- 计算公式: | ||
| 28 | + | ||
| 29 | + $$ | ||
| 30 | + y = op(x1) @ op(x2) + bias | ||
| 31 | + $$ | ||
| 32 | + | ||
| 33 | + 其中: | ||
| 34 | + - $op(x1)$:参与矩阵乘的左矩阵,维度为$(M, K)$。当transpose_x1=false时,$op(x1)=x1$;当transpose_x1=true时,$op(x1)=x1^T$(x1传入为$(K, M)$,计算时逻辑转置为$(M, K)$)。 | ||
| 35 | + - $op(x2)$:参与矩阵乘的右矩阵,维度为$(K, N)$。当transpose_x2=false时,$op(x2)=x2$;当transpose_x2=true时,$op(x2)=x2^T$(x2传入为$(N, K)$,计算时逻辑转置为$(K, N)$)。 | ||
| 36 | + - $bias$:维度为$(N)$或$(1, N)$的偏置向量,逐元素累加到乘法结果对应列上。 | ||
| 37 | + - $y$:输出矩阵,维度为$(M, N)$。 | ||
| 38 | + | ||
| 39 | +## Ascend IR定义 | ||
| 40 | + | ||
| 41 | +Ascend IR定义所在头文件路径:[mat_mul_v3_proto.h](../op_graph/mat_mul_v3_proto.h) | ||
| 42 | + | ||
| 43 | +```cpp | ||
| 44 | +REG_OP(MatMulV3) | ||
| 45 | + .INPUT(x1, TensorType({DT_FLOAT16, DT_BF16, DT_FLOAT})) | ||
| 46 | + .INPUT(x2, TensorType({DT_FLOAT16, DT_BF16, DT_FLOAT})) | ||
| 47 | + .OPTIONAL_INPUT(bias, TensorType({DT_FLOAT, DT_FLOAT16, DT_BF16})) | ||
| 48 | + .OUTPUT(y, TensorType({DT_FLOAT16, DT_BF16, DT_FLOAT})) | ||
| 49 | + .OPTIONAL_INPUT(offset_w, TensorType({DT_INT8, DT_INT4})) | ||
| 50 | + .ATTR(transpose_x1, Bool, false) | ||
| 51 | + .ATTR(transpose_x2, Bool, false) | ||
| 52 | + .ATTR(offset_x, Int, 0) | ||
| 53 | + .ATTR(opImplMode, Int, 0x1) | ||
| 54 | + .OP_END_FACTORY_REG(MatMulV3) | ||
| 55 | +``` | ||
| 56 | + | ||
| 57 | +## 参数说明 | ||
| 58 | + | ||
| 59 | +| 参数名 | 输入/属性/输出 | 描述 | 使用说明 | 数据类型 | 数据格式 | 维度(shape) | | ||
| 60 | +| ------ | -------------- | ---- | -------- | -------- | -------- | ------------- | | ||
| 61 | +| x1 | 必选输入 | 矩阵乘运算的左矩阵,公式中的$op(x1)$。 | transpose_x1=false时,shape为(M, K);transpose_x1=true时,shape为(K, M),计算时逻辑转置为(M, K)参与计算。 | FLOAT16、BFLOAT16、FLOAT32 | ND、FRACTAL_NZ | 2 | | ||
| 62 | +| x2 | 必选输入 | 矩阵乘运算的右矩阵,公式中的$op(x2)$。 | transpose_x2=false时,shape为(K, N);transpose_x2=true时,shape为(N, K),计算时逻辑转置为(K, N)参与计算。FRACTAL_NZ格式下为4维:不转置时排布为(n1, k1, k0, n0),转置时排布为(k1, n1, n0, k0),其中k0=16、n0=16。 | FLOAT16、BFLOAT16、FLOAT32 | ND、FRACTAL_NZ | 2(ND)或4(NZ) | | ||
| 63 | +| bias | 可选输入 | 矩阵乘运算结果上累加的偏置向量,公式中的$bias$。 | 长度需与x2的N维一致。 | FLOAT16、BFLOAT16、FLOAT32 | ND | 1~2 | | ||
| 64 | +| offset_w | 可选输入 | 权重量化偏移矩阵。 | 预留参数,当前暂不支持。 | INT8、INT4 | ND | 2 | | ||
| 65 | +| y | 必选输出 | 矩阵乘运算的计算结果,公式中的$y$。 | - | FLOAT16、BFLOAT16、FLOAT32 | ND、FRACTAL_NZ | 2 | | ||
| 66 | +| transpose_x1 | 必选属性 | 指示左矩阵x1参与矩阵乘前是否转置。 | 默认值false;取值true时x1逻辑转置后参与计算。 | Bool | - | - | | ||
| 67 | +| transpose_x2 | 必选属性 | 指示右矩阵x2参与矩阵乘前是否转置。 | 默认值false;取值true时x2逻辑转置后参与计算。 | Bool | - | - | | ||
| 68 | +| offset_x | 必选属性 | 左矩阵x1的量化偏移。 | 预留参数,当前暂不支持。默认值0。 | Int | - | - | | ||
| 69 | +| opImplMode | 必选属性 | 算子实现模式。 | 默认值0x1(default)。支持的取值:0x1(default,默认模式)、0x2(high_performance,高性能模式)、0x4(high_precision,高精度模式)、0x8(super_performance,超高性能模式)、0x10(support_of_bound_index)、0x20(enable_float_32_execution,FLOAT32执行)、0x40(enable_hi_float_32_execution,HF32执行)。 | Int | - | - | | ||
| 70 | + | ||
| 71 | +<!-- npu="950" id7 --> | ||
| 72 | +- <term>Ascend 950PR/Ascend 950DT</term>:仅x2支持FRACTAL_NZ格式。 | ||
| 73 | +<!-- end id7 --> | ||
| 74 | +<!-- npu="A3,910b" id8 --> | ||
| 75 | +- <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>、<term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>:不支持FRACTAL_NZ格式,bias不支持BFLOAT16数据类型。 | ||
| 76 | +<!-- end id8 --> | ||
| 77 | +<!-- npu="310p" id9 --> | ||
| 78 | +- <term>Atlas 推理系列产品</term>:仅支持FLOAT16数据类型,且x2仅支持FRACTAL_NZ格式。 | ||
| 79 | +<!-- end id9 --> | ||
| 80 | + | ||
| 81 | +## 约束说明 | ||
| 82 | + | ||
| 83 | +- 确定性计算:默认确定性实现。 | ||
| 84 | +- 支持空tensor,空tensor场景下不支持bias。 | ||
| 85 | +- 支持连续tensor,[非连续tensor](../../../docs/zh/context/non_contiguous_tensor.md)仅支持转置场景。 | ||
| 86 | +- x1与x2需满足数据类型[互推导关系](../../../docs/zh/context/deduction_relationship.md)。 | ||
| 87 | +<!-- npu="A3,910b" id10 --> | ||
| 88 | +- <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>、<term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>:不支持两个输入分别为BFLOAT16和FLOAT16、BFLOAT16和FLOAT32的类型推导。 | ||
| 89 | +<!-- end id10 --> | ||
| 90 | + | ||
| 91 | +## 调用示例 | ||
| 92 | + | ||
| 93 | +| 调用方式 | 样例代码 | 说明 | | ||
| 94 | +| ---------------- | --------------------------- | --------------------------------------------------- | | ||
| 95 | +| aclnn接口 | [test_aclnn_addmm](../examples/test_aclnn_addmm_aclnninplace_addmm.cpp) | 通过<br> - [aclnnAddmm&aclnnInplaceAddmm](aclnnAddmm&aclnnInplaceAddmm.md)<br> - [aclnnMatmul](aclnnMatmul.md)<br> - [aclnnMatmulWeightNz](aclnnMatmulWeightNz.md)<br> - [aclnnMm](aclnnMm.md)<br>- [aclnnAddmmWeightNz](aclnnAddmmWeightNz.md)<br>等方式调用MatMulV3算子。 | | ||