已合并
图融合pass资料开源 #9725
zhangquanxin创建于 25 天前
图融合pass资料开源 #9725
已合并
共 42 个文件变更+139-0
| @@ -0,0 +1,3 @@ | |||
| 1 | +version https://git-lfs.github.com/spec/v1 | ||
| 2 | +oid sha256:8ddcee37426128c87096ddd8a1aab877ed858b720d17e1a74baff5dacad7f073 | ||
| 3 | +size 32906 | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | +version https://git-lfs.github.com/spec/v1 | ||
| 2 | +oid sha256:9db18efc347a7b7f4c6170a6026be771d22c4a550837ba1acbcb423a00c98790 | ||
| 3 | +size 32610 | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | +version https://git-lfs.github.com/spec/v1 | ||
| 2 | +oid sha256:064acd496424162f8e00e27d60e4ac18f3c2d715462e36165ac35297798ddc1b | ||
| 3 | +size 32369 | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | +version https://git-lfs.github.com/spec/v1 | ||
| 2 | +oid sha256:ed344d5bfb5f46329ec2c6ac147ebbc64efb938be1cf5c86831f370363a0cbe2 | ||
| 3 | +size 25023 | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | +version https://git-lfs.github.com/spec/v1 | ||
| 2 | +oid sha256:5b0a03092187eed958d795678049ca6476957256f08c365b765be1a71ebe3bac | ||
| 3 | +size 24505 | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | +version https://git-lfs.github.com/spec/v1 | ||
| 2 | +oid sha256:b381c74e9a3ff1520ecf091e672330aba917a402f4d0ea5061b5c1ec71cf99c7 | ||
| 3 | +size 33183 | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | +version https://git-lfs.github.com/spec/v1 | ||
| 2 | +oid sha256:44028810eaaa14434c962af6b92675842b64083f3f36b7099af527f56d45d33f | ||
| 3 | +size 41404 | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | +version https://git-lfs.github.com/spec/v1 | ||
| 2 | +oid sha256:ce04ee6c78f81bf1157bacf388aa3a411638e44f07aa8aa861227ed5043a2ed8 | ||
| 3 | +size 35795 | ||
| @@ -0,0 +1,28 @@ | |||
| 1 | +# QuantBatchMatmulV4TransposeFusionPass | ||
| 2 | + | ||
| 3 | +## 融合模式 | ||
| 4 | + | ||
| 5 | +<!-- npu="950" id1 --> | ||
| 6 | +融合模式一:将QuantBatchMatmulV4算子x2和x2_scale输入前的Transpose/TransposeD节点从图中删除,并将转置信息打在QuantBatchMatmulV4算子的transpose_x2属性上。如下图所示。 | ||
| 7 | + | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +融合模式二:将QuantBatchMatmulV4算子x2输入前的Transpose/TransposeD节点和x2_scale输入前的Reshape节点从图中删除,并将转置信息打在QuantBatchMatmulV4算子的transpose_x2属性上。如下图所示。 | ||
| 11 | + | ||
| 12 | + | ||
| 13 | + | ||
| 14 | +融合模式三:将QuantBatchMatmulV4算子x2输入前的Transpose/TransposeD节点和x2_scale输入前的Reshape节点(含Shape→Gather→Pack动态shape链)从图中删除,并将转置信息打在QuantBatchMatmulV4算子的transpose_x2属性上。如下图所示。 | ||
| 15 | + | ||
| 16 | + | ||
| 17 | + | ||
| 18 | +>[!NOTE]说明 | ||
| 19 | +>该图融合仅支持Ascend 950PR/Ascend 950DT,不支持其他芯片型号。 | ||
| 20 | +<!-- end id1 --> | ||
| 21 | + | ||
| 22 | +## 使用约束 | ||
| 23 | + | ||
| 24 | +- 该融合规则不可关闭。 | ||
| 25 | +- x2输入必须连接Transpose或TransposeD节点,否则不触发融合。 | ||
| 26 | +- x1和x2的输入shape必须为2D。 | ||
| 27 | +- x1数据类型仅支持FLOAT8_E4M3FN,x2数据类型仅支持FLOAT4_E2M1、FLOAT,输出数据类型仅支持BF16、FLOAT16。 | ||
| 28 | +- x2_scale输入前的Reshape节点需为简单Reshape(输入shape某一维度为1)或含Shape→Gather→Pack链的动态Reshape。 | ||
| @@ -0,0 +1,50 @@ | |||
| 1 | +# AntiQuantMatMulFusionPass | ||
| 2 | + | ||
| 3 | +## 融合模式 | ||
| 4 | + | ||
| 5 | +<!-- npu="950,910b" id1 --> | ||
| 6 | +该融合将AscendAntiQuant(及可选的Add、Mul)与MatMul/BatchMatMul融合为WeightQuantBatchMatmulV2算子。通过常量折叠,在编译期预计算fp16的antiquant_scale和antiquant_offset,消除运行期的AntiQuant+Add+Mul计算。支持以下三种融合模式。 | ||
| 7 | + | ||
| 8 | +融合模式一:AscendAntiQuant + Add + Mul + MatMul场景。AscendAntiQuant的输出经过Add(加常量offset)和Mul(乘常量scale)后进入MatMul。融合后Add的常量offset和Mul的常量scale与AscendAntiQuant的scale/offset属性折叠为antiquant_scale和antiquant_offset。如下图所示。 | ||
| 9 | + | ||
| 10 | + | ||
| 11 | + | ||
| 12 | +融合模式二:AscendAntiQuant + Mul + MatMul场景。AscendAntiQuant的输出经过Mul(乘以常量scale)后进入MatMul,不存在Add节点。融合后Mul的常量scale与AscendAntiQuant的scale属性折叠为antiquant_scale,antiquant_offset默认为0。如下图所示。 | ||
| 13 | + | ||
| 14 | + | ||
| 15 | + | ||
| 16 | +融合模式三:AscendAntiQuant + MatMul场景。AscendAntiQuant的输出直接进入MatMul,不存在Add和Mul节点。融合后antiquant_scale默认为1,antiquant_offset默认为0。如下图所示。 | ||
| 17 | + | ||
| 18 | + | ||
| 19 | + | ||
| 20 | +>[!NOTE]说明 | ||
| 21 | +>常量折叠公式:antiquant_scale = scale_data * anti_scale,antiquant_offset = offset_data / anti_scale + anti_offset。其中anti_scale和anti_offset为AscendAntiQuant的属性,scale_data和offset_data分别为Mul和Add的常量输入。当不存在Add节点时, antiquant_offset默认为0。当不存在Mul节点时,antiquant_scale默认为1。 | ||
| 22 | + | ||
| 23 | +该融合模式支持的产品如下。 | ||
| 24 | + | ||
| 25 | +<!-- npu="910b" id2 --> | ||
| 26 | +Atlas A2 训练系列产品/Atlas A2 推理系列产品 | ||
| 27 | +<!-- end id2 --> | ||
| 28 | + | ||
| 29 | +<!-- npu="950" id3 --> | ||
| 30 | +Ascend 950PR/Ascend 950DT | ||
| 31 | +<!-- end id3 --> | ||
| 32 | +<!-- end id1 --> | ||
| 33 | + | ||
| 34 | +## 使用约束 | ||
| 35 | + | ||
| 36 | +- 支持的MatMul算子类型:MatMul、MatMulV2、BatchMatMul、BatchMatMulV2。 | ||
| 37 | +- AscendAntiQuant、Add、Mul节点的输出只能连接到一个下游节点,否则不触发融合。 | ||
| 38 | +- Add节点的常量输入和Mul节点的常量输入必须为Const节点。 | ||
| 39 | +- MatMul输入x和weight的数据类型必须为FLOAT16,输出数据类型必须为FLOAT16。 | ||
| 40 | +- AscendAntiQuant输入数据类型必须为INT8,输出数据类型必须为FLOAT16。 | ||
| 41 | +- 输入shape必须为2D,不支持动态shape。 | ||
| 42 | +- Mul的常量scale元素数仅支持1或N(weight的N维度),Add的常量offset元素数仅支持1或N。 | ||
| 43 | +<!-- npu="910b" --> | ||
| 44 | +- 在Atlas A2 训练系列产品/Atlas A2 推理系列产品场景下,需满足shape准入条件:M<=64、K>=5120、N>=5120,且(K,N)不能为(5120,10240)或(10240,5120)。 | ||
| 45 | +<!-- end --> | ||
| 46 | +<!-- npu="950" --> | ||
| 47 | +- 在Ascend 950PR/Ascend 950DT场景下,无shape准入限制。 | ||
| 48 | +<!-- end --> | ||
| 49 | +- MatMul的transpose_x1/transpose_x2(或BatchMatMul的adj_x1/adj_x2)属性会传递到融合后的WeightQuantBatchMatmulV2的transpose_x/transpose_weight属性。 | ||
| 50 | +- 支持可选的bias输入。 | ||
| @@ -0,0 +1,36 @@ | |||
| 1 | +# WeightQuantBatchMatmulV2TransposeFusionPass | ||
| 2 | + | ||
| 3 | +## 融合模式 | ||
| 4 | + | ||
| 5 | +<!-- npu="950,A3,910b" id1 --> | ||
| 6 | +融合模式一:将WeightQuantBatchMatmulV2算子x和/或weight输入前的Transpose/TransposeD节点从图中删除,并将转置信息打在算子的transpose_x和transpose_weight属性上。当weight输入连接Transpose节点时,同时将antiquant_scale和antiquant_offset输入前的Transpose/TransposeD节点从图中删除。如下图所示。 | ||
| 7 | + | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +融合模式二:将WeightQuantBatchMatmulV2算子weight输入前的Transpose/TransposeD节点从图中删除,并将转置信息打在算子的transpose_weight属性上。同时将antiquant_scale和antiquant_offset输入前的简单Reshape节点从图中删除。如下图所示。 | ||
| 11 | + | ||
| 12 | + | ||
| 13 | + | ||
| 14 | +该融合模式支持的产品如下。 | ||
| 15 | + | ||
| 16 | +<!-- npu="910b" id2 --> | ||
| 17 | +Atlas A2 训练系列产品/Atlas A2 推理系列产品 | ||
| 18 | +<!-- end id2 --> | ||
| 19 | + | ||
| 20 | +<!-- npu="A3" id3 --> | ||
| 21 | +Atlas A3 训练系列产品/Atlas A3 推理系列产品 | ||
| 22 | +<!-- end id3 --> | ||
| 23 | + | ||
| 24 | +<!-- npu="950" id4 --> | ||
| 25 | +Ascend 950PR/Ascend 950DT | ||
| 26 | +<!-- end id4 --> | ||
| 27 | +<!-- end id1 --> | ||
| 28 | + | ||
| 29 | +## 使用约束 | ||
| 30 | + | ||
| 31 | +- x和weight输入至少有一个连接Transpose/TransposeD节点,否则不触发融合。 | ||
| 32 | +- 当weight节点连接Transpose节点时,才处理antiquant_scale和antiquant_offset所连接的Transpose/TransposeD或Reshape节点(融合模式一处理Transpose/TransposeD,融合模式二处理简单Reshape)。 | ||
| 33 | +- 融合模式二中,antiquant_scale和antiquant_offset的Reshape节点需为简单Reshape(输入shape某一维度为1)。 | ||
| 34 | +- 该融合规则不可关闭,关闭后会触发功能问题。 | ||
| 35 | +- x输入数据类型仅支持FLOAT16、BF16,weight输入数据类型支持INT4、INT8、INT32、FLOAT、FLOAT4_E2M1、FLOAT8_E4M3FN、HIFLOAT8,输出数据类型仅支持FLOAT16、BF16、INT8。 | ||
| 36 | +- x和weight的输入shape必须为2D。 | ||