已合并
图融合pass资料开源 #9725
zhangquanxin创建于 25 天前
图融合pass资料开源 #9725
已合并
zhangquanxin创建于 25 天前
共 42 个文件变更+139-0
@@ -0,0 +1 @@
1+*.png filter=lfs diff=lfs merge=lfs -text
@@ -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+![](../../../docs/zh/figures/QuantBatchMatmulV4TransposeFusionPass_1.png)
9+ 
10+融合模式二:将QuantBatchMatmulV4算子x2输入前的Transpose/TransposeD节点和x2_scale输入前的Reshape节点从图中删除,并将转置信息打在QuantBatchMatmulV4算子的transpose_x2属性上。如下图所示。
11+ 
12+![](../../../docs/zh/figures/QuantBatchMatmulV4TransposeFusionPass_2.png)
13+ 
14+融合模式三:将QuantBatchMatmulV4算子x2输入前的Transpose/TransposeD节点和x2_scale输入前的Reshape节点(含Shape→Gather→Pack动态shape链)从图中删除,并将转置信息打在QuantBatchMatmulV4算子的transpose_x2属性上。如下图所示。
15+ 
16+![](../../../docs/zh/figures/QuantBatchMatmulV4TransposeFusionPass_3.png)
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+![](../../../docs/zh/figures/AntiQuantMatMulFusionPass_1.png)
11+ 
12+融合模式二:AscendAntiQuant + Mul + MatMul场景。AscendAntiQuant的输出经过Mul(乘以常量scale)后进入MatMul,不存在Add节点。融合后Mul的常量scale与AscendAntiQuant的scale属性折叠为antiquant_scale,antiquant_offset默认为0。如下图所示。
13+ 
14+![](../../../docs/zh/figures/AntiQuantMatMulFusionPass_2.png)
15+ 
16+融合模式三:AscendAntiQuant + MatMul场景。AscendAntiQuant的输出直接进入MatMul,不存在Add和Mul节点。融合后antiquant_scale默认为1,antiquant_offset默认为0。如下图所示。
17+ 
18+![](../../../docs/zh/figures/AntiQuantMatMulFusionPass_3.png)
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+![](../../../docs/zh/figures/WeightQuantBatchMatmulV2TransposeFusionPass_1.png)
9+ 
10+融合模式二:将WeightQuantBatchMatmulV2算子weight输入前的Transpose/TransposeD节点从图中删除,并将转置信息打在算子的transpose_weight属性上。同时将antiquant_scale和antiquant_offset输入前的简单Reshape节点从图中删除。如下图所示。
11+ 
12+![](../../../docs/zh/figures/WeightQuantBatchMatmulV2TransposeFusionPass_2.png)
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。