GroupedMatmul MXFP8FP4权重量化矩阵乘算子性能优化指南【免费下载链接】cann-samples算子领域高性能实战演进样例与体系化调优知识库项目地址: https://gitcode.com/cann/cann-samples概述本文档面向m轴分组的weight_quant_grouped_matmul_mxfp8fp4示例说明其算子语义、实现路径、性能建模与优化方法帮助开发者掌握GroupedMatmul MXFP8FP4权重量化矩阵乘算子在昇腾芯片上的开发与性能优化方法。算子实现原理算子功能说明算子功能实现M轴分组的MXFP8FP4混合精度量化矩阵乘计算左矩阵类型为float8_e4m3fn右矩阵类型为float4_e2m1量化方式均为MX(Microscaling)即scaleA和scaleB为float8_e8m0类型、groupsize32的分组量化。应用场景混合精度乘的优势在于性能和精度的折中相比于MXFP8量化B矩阵内存占用节省50%具有更高的搬运效率相比于MXFP4量化具有更好的精度表现。对比项MXFP8MXFP8FP4MXFP4A/B数据类型float8_e4m3fnfloat8_e4m3fn/float4_e2m1float4_e2m1量化方式groupsize32的per-group量化同左同左scaleA/Bfloat8_e8m0同左同左分组M轴分组A NDB ND/DNK轴分组A DNB NDM轴分组A NDB Weight4BitLayoutM轴分组A NDB ND/DN主要内存收益相比FP16/BF16内存占用减少约50%B矩阵/weight相比MXFP8内存占用节省50%相比FP16/BF16内存占用减少约75%典型用途模型训推兼顾速度与精度的平衡模型推理兼顾速度与精度的平衡模型推理侧重极致显存效率与推理速度注B矩阵采用代码中的Weight4BitLayout自定义格式。计算公式设专家数为EExpert Number第e个专家需要处理的行数为 $m_e$$m_e$ 允许为0表示该专家未被选中第e组、第i行、第j列的计算公式如下$$ C_{e, i, j} \sum_{g0}^{K/G-1}\left(scaleA_{e, i, g} \cdot scaleB_{e, g, j} \cdot \sum_{k0}^{G-1} (a_{e, i, gGk} \cdot b_{e, j, gGk}) \right),\ i\in[0,m_e),\ j\in[0,N). $$算子整体输出可表示为$$ C \operatorname{Concat}M\left(C_0, C_1, ..., C{E-1}\right) $$注上述公式按逻辑矩阵维度描述scaleB_{e, g, j}表示第e个专家、第j列、第g个量化组的逻辑缩放因子实际实现中为满足硬件访存和对齐约束B、scaleA和scaleB会按参数表中的实现Shape存放。当前样例约束K按64对齐因此每个量化组均包含G个元素且每2个量化组可在实现Shape中打包。参数说明类别名称ShapeDtypeLayout说明输入A整体为(M, K)第e组逻辑切片为(m_e, K)float8_e4m3fnND激活输入矩阵按M轴拼接输入B逻辑Shape为(E, N, K)实现Shape为(E, K/_k0, N/_n0, _n0, _k0)float4_e2m1打包存储Weight4BitLayout按专家存储的权重矩阵第e组逻辑Shape为(N, K)输入scaleA整体为(M, K/G/2, 2)第e组逻辑切片为(m_e, K/G/2, 2)float8_e8m0ScaleAND与A对应的per-group scale按M轴拼接输入scaleB(E, N, K/G/2, 2)float8_e8m0ScaleBDN与B对应的per-group scale第e组为(N, K/G/2, 2)输入group_m_list(E)int64ND每个专家的 $m_e$输出C整体为(M, N)第e组逻辑切片为(m_e, N)bfloat16ND按组拼接后的输出矩阵注当前样例约束K按64对齐N按32对齐且 $M \geq \sum_{e0}^{E-1}m_e$。当 $M \sum_{e0}^{E-1}m_e$ 时有效输出为前 $\sum_{e0}^{E-1}m_e$ 行其余行属于预留空间不参与逻辑结果。表格中的_m016、_n016、_k032分别对应M、N、K方向的基础块大小K/G/2表示每2个量化组在最后一维打包。ScaleAND和ScaleBDN为代码中的Layout名称。算子实现说明Grouped Matmul由E个单组Matmul组成按分组更新A、B、scaleA、scaleB、C的GM基址偏移示意如下本文中的MIX算子指同时使用Vector核和Cube核协同完成计算的算子而不是只使用单一核的算子。分组内的MXFP8FP4矩阵乘实现与单组MXFP8FP4矩阵乘一致差异主要在于每个专家的GM基址偏移、m_e动态大小以及组间调度。整体数据路径可先按计算单元划分为四类|数据对象|主要路径|所属计算单元|说明| |-|-|-|-| | Tensor B |GM - UB - L1| Vector核 | 每个专家的B矩阵先在Vector侧完成float4_e2m1到float8_e4m3fn的预处理 | | Tensor A / scaleA |GM - L1 - L0A / L0A_MX| Cube核 | 当前专家的A矩阵及其缩放因子直接进入Cube侧缓存参与MMAD_MX计算 | | Tensor B / scaleB |L1 - L0B / L0B_MX| Cube核 | 预处理后的B矩阵及其缩放因子进入Cube侧缓存参与MMAD_MX计算 | | Tensor C |L0C - GM| Cube核 |MMAD_MX结果写入L0C后通过FIXPIPE按当前专家的输出偏移搬出到GM |分组内更详细的Layout和搬运路径详见weight_quant_matmul_mxfp8fp4_performance.md — 算子实现说明。算子实现约束K维度需按64对齐当前样例不支持K维度补零能力。N维度需按32对齐当前样例不支持N维度非对齐输入。算子性能建模性能瓶颈分析单组 Weight Quant Matmul 的瓶颈MXFP8FP4混合精度矩阵乘算子的性能瓶颈主要分为以下三类同单组Weight Quant MatmulCube Bound算子耗时主要由Cube核MMAD计算决定且未被数据搬运或VF预处理阻塞VF Bound算子性能受限于Vector核算力VF计算耗时占据主导地位Memory Bound算子性能受限于硬件带宽数据搬运耗时占据主导地位。根据流水的不同可包括MTE1 Bound、MTE2 Bound、MTE3 Bound以及FIXPIPE Bound为了能够充分利用硬件算力希望算子达到Cube Bound此时MMAD流水连续算力得以充分发挥。尽管VF Bound也是算力Bound但Cube核的算力远高于Vector核因此更希望达到Cube Bound。本文后续沿用单组MXFP8FP4矩阵乘的建模口径重点关注MTE1、MTE2、VF和FIXPIPE。单核MTE3带宽为256BPC而单Vector核VF输出带宽需求约50BPC2个Vector核合计约100BPC低于MTE3带宽因此通常不会阻塞在MTE3上。多组 Weight Quant Matmul 的瓶颈在单组 Bound 判定之上grouped 场景还会新增两类问题组间切换开销不同expert的数据通常无法在组间复用不均衡的动态负载group_m_list在运行时获取不同分组的Bound类型不同整体性能需要在运行时平衡。单组 Weight Quant Matmul 性能建模公式单组Weight Quant Matmul的基本原理、各流水理论耗时及Bound对比化简等公式详见weight_quant_matmul_mxfp8fp4_performance.md — 性能建模公式。优化目标组内尽量让MMAD、MTE2、VF、MTE1、FIXPIPE匹配减少某一条流水过长组间尽量减少group间尾轮失衡使不同核心的结束时间接近。算子优化实践指令并行度优化与单组MXFP8FP4 Matmul相同的优化实践4-bufferweight_quant_matmul_mxfp8fp4_performance.md — 4-buffer优化UnitFlagweight_quant_matmul_mxfp8fp4_performance.md — UnitFlag单元标志搬运效率优化与单组MXFP8FP4 Matmul相同的优化实践L1 Bank冲突优化weight_quant_matmul_mxfp8fp4_performance.md — L1 Bank冲突优化只读一次的场景不经过L2 Cache同一expert内GM侧数据只读取一次的情况下可不经过L2 Cache减少经过L2的开销不占用L2空间降低L2中高频复用数据被替换的概率。原理介绍收益点降低L2污染提升其他高复用数据的L2命中稳定性。适用场景单组m一次性全部搬入时同一expert内没有BTensor重复载入的场景。scale缓存优化当前实现中scale并不是逐个kL1小块即时重载而是按更大的MX_SCALE_K_L1_SIZE 4096K窗口组织。原理介绍这类设计的目的不是改变scale数学语义而是让scale搬运在更接近cacheline友好的粒度上进行从而提升有效带宽与复用率。收益点减少过小scale搬运导致的带宽利用率下降让多次kL1计算复用同一段scaleL1窗口。适用场景scaleA/scaleB相比主输入明显更小容易形成“搬得动但搬不快”的场景K较大、可通过更大scale窗口换取更高复用的场景。保证连续搬运数据量原理介绍虽然Ascend950支持128B的Sector-Cache但是为了用满核而将连续搬运字节数降低到128B以下会导致有效带宽浪费。N方向元素数过小时每核连续搬运字节数可能低于128B有效粒度从而影响带宽利用率。数据量过小会导致搬运开销无法掩盖调度开销。收益点避免任务切得过碎导致搬运/调度开销比例过高让小N场景下的单任务计算量保持在合理水平。适用场景N coreNum * 128的场景其中128表示N方向元素数。计算效率优化与单组MXFP8FP4 Matmul相同的优化实践VF优化weight_quant_matmul_mxfp8fp4_performance.md — VF优化N 方向 resplit 负载均衡原理介绍当N不能被coreNum * 256整除时host tiling 会输出firstTailBlock*和secondTailBlock*两段尾块参数使最后一轮块大小尽量接近减少长尾。其中256表示N方向分块粒度的元素数。效果示意适用场景大N且不能整齐分块的场景最后一轮存在明显慢核的场景。group间核负载均衡原理介绍设备侧调度器不会让每个group都从0号核重新开始而是通过startBasicBlockId (startBasicBlockId prevTileNum) % coreNum轮转group的起始核。这样可以避免若干大group总压在同一批核心上降低跨group的负载偏斜。收益点让不同group的basic block更均匀地落到各个核心缓解group规模不均带来的固定核热点问题。适用场景group_m_list分布不均存在连续多个大group的场景。模板归纳split-m n-resplit 模板已落地模板特点面向grouped weight quant MXFP8FP4场景host侧给出N方向自适应重切分参数设备侧调度器同时处理group间起始核轮转与group内M/N块枚举。涉及优化手段UB侧weight 4-bufferL1侧weight Double BufferUnitFlagN 方向 resplit小N场景taskNum控制group间起始核轮转与group内M块划分。适用场景A: float8_e4m3fnB: float4_e2m1packed经Vector核转换后进入Cube核计算按m轴分组、B转置路径输出为bfloat16。模板实现weight_quant_grouped_matmul_mxfp8fp4_split_m.asc优化策略选择指南根据 Bound 类型选择Bound 类型主要现象优先策略Cube Bound 但利用率不高尾轮不均衡、组间等待先看group间核负载均衡与N-resplitMTE2 BoundGM/L2搬运占比高先看B的FP4路径、scale窗口复用与重复搬运MTE1 BoundL1 - L0 装载跟不上 MMAD先看双缓冲与 L1/L0 切分匹配FIXPIPE Bound写回阶段压制吞吐先看UnitFlag与输出重叠根据输入特征选择输入特征建议大N、group相对均衡采用full-core主块 tail resplit中等 N、不可整除重点评估firstTail/secondTail比例小N优先检查taskNum选择是否过碎group_m_list极不均衡优先分析group间负载轮转和尾轮空转性能调优实践步骤性能分析使用Profiling工具结合性能建模分析当前算子的Bound类型瓶颈识别确定主要的性能瓶颈所在策略选择根据Bound类型选择合适的优化策略参数调优调整tiling参数优化缓冲区使用效果验证对比优化前后的性能数据迭代优化根据结果进一步调整优化策略总结GroupedMatmul MXFP8FP4权重量化矩阵乘算子的性能优化不仅要考虑单组MXFP8FP4矩阵乘的流水匹配还要考虑分组间的动态负载均衡。【免费下载链接】cann-samples算子领域高性能实战演进样例与体系化调优知识库项目地址: https://gitcode.com/cann/cann-samples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
CANN分组矩阵乘MXFP8FP4权重量化性能优化指南
GroupedMatmul MXFP8FP4权重量化矩阵乘算子性能优化指南【免费下载链接】cann-samples算子领域高性能实战演进样例与体系化调优知识库项目地址: https://gitcode.com/cann/cann-samples概述本文档面向m轴分组的weight_quant_grouped_matmul_mxfp8fp4示例说明其算子语义、实现路径、性能建模与优化方法帮助开发者掌握GroupedMatmul MXFP8FP4权重量化矩阵乘算子在昇腾芯片上的开发与性能优化方法。算子实现原理算子功能说明算子功能实现M轴分组的MXFP8FP4混合精度量化矩阵乘计算左矩阵类型为float8_e4m3fn右矩阵类型为float4_e2m1量化方式均为MX(Microscaling)即scaleA和scaleB为float8_e8m0类型、groupsize32的分组量化。应用场景混合精度乘的优势在于性能和精度的折中相比于MXFP8量化B矩阵内存占用节省50%具有更高的搬运效率相比于MXFP4量化具有更好的精度表现。对比项MXFP8MXFP8FP4MXFP4A/B数据类型float8_e4m3fnfloat8_e4m3fn/float4_e2m1float4_e2m1量化方式groupsize32的per-group量化同左同左scaleA/Bfloat8_e8m0同左同左分组M轴分组A NDB ND/DNK轴分组A DNB NDM轴分组A NDB Weight4BitLayoutM轴分组A NDB ND/DN主要内存收益相比FP16/BF16内存占用减少约50%B矩阵/weight相比MXFP8内存占用节省50%相比FP16/BF16内存占用减少约75%典型用途模型训推兼顾速度与精度的平衡模型推理兼顾速度与精度的平衡模型推理侧重极致显存效率与推理速度注B矩阵采用代码中的Weight4BitLayout自定义格式。计算公式设专家数为EExpert Number第e个专家需要处理的行数为 $m_e$$m_e$ 允许为0表示该专家未被选中第e组、第i行、第j列的计算公式如下$$ C_{e, i, j} \sum_{g0}^{K/G-1}\left(scaleA_{e, i, g} \cdot scaleB_{e, g, j} \cdot \sum_{k0}^{G-1} (a_{e, i, gGk} \cdot b_{e, j, gGk}) \right),\ i\in[0,m_e),\ j\in[0,N). $$算子整体输出可表示为$$ C \operatorname{Concat}M\left(C_0, C_1, ..., C{E-1}\right) $$注上述公式按逻辑矩阵维度描述scaleB_{e, g, j}表示第e个专家、第j列、第g个量化组的逻辑缩放因子实际实现中为满足硬件访存和对齐约束B、scaleA和scaleB会按参数表中的实现Shape存放。当前样例约束K按64对齐因此每个量化组均包含G个元素且每2个量化组可在实现Shape中打包。参数说明类别名称ShapeDtypeLayout说明输入A整体为(M, K)第e组逻辑切片为(m_e, K)float8_e4m3fnND激活输入矩阵按M轴拼接输入B逻辑Shape为(E, N, K)实现Shape为(E, K/_k0, N/_n0, _n0, _k0)float4_e2m1打包存储Weight4BitLayout按专家存储的权重矩阵第e组逻辑Shape为(N, K)输入scaleA整体为(M, K/G/2, 2)第e组逻辑切片为(m_e, K/G/2, 2)float8_e8m0ScaleAND与A对应的per-group scale按M轴拼接输入scaleB(E, N, K/G/2, 2)float8_e8m0ScaleBDN与B对应的per-group scale第e组为(N, K/G/2, 2)输入group_m_list(E)int64ND每个专家的 $m_e$输出C整体为(M, N)第e组逻辑切片为(m_e, N)bfloat16ND按组拼接后的输出矩阵注当前样例约束K按64对齐N按32对齐且 $M \geq \sum_{e0}^{E-1}m_e$。当 $M \sum_{e0}^{E-1}m_e$ 时有效输出为前 $\sum_{e0}^{E-1}m_e$ 行其余行属于预留空间不参与逻辑结果。表格中的_m016、_n016、_k032分别对应M、N、K方向的基础块大小K/G/2表示每2个量化组在最后一维打包。ScaleAND和ScaleBDN为代码中的Layout名称。算子实现说明Grouped Matmul由E个单组Matmul组成按分组更新A、B、scaleA、scaleB、C的GM基址偏移示意如下本文中的MIX算子指同时使用Vector核和Cube核协同完成计算的算子而不是只使用单一核的算子。分组内的MXFP8FP4矩阵乘实现与单组MXFP8FP4矩阵乘一致差异主要在于每个专家的GM基址偏移、m_e动态大小以及组间调度。整体数据路径可先按计算单元划分为四类|数据对象|主要路径|所属计算单元|说明| |-|-|-|-| | Tensor B |GM - UB - L1| Vector核 | 每个专家的B矩阵先在Vector侧完成float4_e2m1到float8_e4m3fn的预处理 | | Tensor A / scaleA |GM - L1 - L0A / L0A_MX| Cube核 | 当前专家的A矩阵及其缩放因子直接进入Cube侧缓存参与MMAD_MX计算 | | Tensor B / scaleB |L1 - L0B / L0B_MX| Cube核 | 预处理后的B矩阵及其缩放因子进入Cube侧缓存参与MMAD_MX计算 | | Tensor C |L0C - GM| Cube核 |MMAD_MX结果写入L0C后通过FIXPIPE按当前专家的输出偏移搬出到GM |分组内更详细的Layout和搬运路径详见weight_quant_matmul_mxfp8fp4_performance.md — 算子实现说明。算子实现约束K维度需按64对齐当前样例不支持K维度补零能力。N维度需按32对齐当前样例不支持N维度非对齐输入。算子性能建模性能瓶颈分析单组 Weight Quant Matmul 的瓶颈MXFP8FP4混合精度矩阵乘算子的性能瓶颈主要分为以下三类同单组Weight Quant MatmulCube Bound算子耗时主要由Cube核MMAD计算决定且未被数据搬运或VF预处理阻塞VF Bound算子性能受限于Vector核算力VF计算耗时占据主导地位Memory Bound算子性能受限于硬件带宽数据搬运耗时占据主导地位。根据流水的不同可包括MTE1 Bound、MTE2 Bound、MTE3 Bound以及FIXPIPE Bound为了能够充分利用硬件算力希望算子达到Cube Bound此时MMAD流水连续算力得以充分发挥。尽管VF Bound也是算力Bound但Cube核的算力远高于Vector核因此更希望达到Cube Bound。本文后续沿用单组MXFP8FP4矩阵乘的建模口径重点关注MTE1、MTE2、VF和FIXPIPE。单核MTE3带宽为256BPC而单Vector核VF输出带宽需求约50BPC2个Vector核合计约100BPC低于MTE3带宽因此通常不会阻塞在MTE3上。多组 Weight Quant Matmul 的瓶颈在单组 Bound 判定之上grouped 场景还会新增两类问题组间切换开销不同expert的数据通常无法在组间复用不均衡的动态负载group_m_list在运行时获取不同分组的Bound类型不同整体性能需要在运行时平衡。单组 Weight Quant Matmul 性能建模公式单组Weight Quant Matmul的基本原理、各流水理论耗时及Bound对比化简等公式详见weight_quant_matmul_mxfp8fp4_performance.md — 性能建模公式。优化目标组内尽量让MMAD、MTE2、VF、MTE1、FIXPIPE匹配减少某一条流水过长组间尽量减少group间尾轮失衡使不同核心的结束时间接近。算子优化实践指令并行度优化与单组MXFP8FP4 Matmul相同的优化实践4-bufferweight_quant_matmul_mxfp8fp4_performance.md — 4-buffer优化UnitFlagweight_quant_matmul_mxfp8fp4_performance.md — UnitFlag单元标志搬运效率优化与单组MXFP8FP4 Matmul相同的优化实践L1 Bank冲突优化weight_quant_matmul_mxfp8fp4_performance.md — L1 Bank冲突优化只读一次的场景不经过L2 Cache同一expert内GM侧数据只读取一次的情况下可不经过L2 Cache减少经过L2的开销不占用L2空间降低L2中高频复用数据被替换的概率。原理介绍收益点降低L2污染提升其他高复用数据的L2命中稳定性。适用场景单组m一次性全部搬入时同一expert内没有BTensor重复载入的场景。scale缓存优化当前实现中scale并不是逐个kL1小块即时重载而是按更大的MX_SCALE_K_L1_SIZE 4096K窗口组织。原理介绍这类设计的目的不是改变scale数学语义而是让scale搬运在更接近cacheline友好的粒度上进行从而提升有效带宽与复用率。收益点减少过小scale搬运导致的带宽利用率下降让多次kL1计算复用同一段scaleL1窗口。适用场景scaleA/scaleB相比主输入明显更小容易形成“搬得动但搬不快”的场景K较大、可通过更大scale窗口换取更高复用的场景。保证连续搬运数据量原理介绍虽然Ascend950支持128B的Sector-Cache但是为了用满核而将连续搬运字节数降低到128B以下会导致有效带宽浪费。N方向元素数过小时每核连续搬运字节数可能低于128B有效粒度从而影响带宽利用率。数据量过小会导致搬运开销无法掩盖调度开销。收益点避免任务切得过碎导致搬运/调度开销比例过高让小N场景下的单任务计算量保持在合理水平。适用场景N coreNum * 128的场景其中128表示N方向元素数。计算效率优化与单组MXFP8FP4 Matmul相同的优化实践VF优化weight_quant_matmul_mxfp8fp4_performance.md — VF优化N 方向 resplit 负载均衡原理介绍当N不能被coreNum * 256整除时host tiling 会输出firstTailBlock*和secondTailBlock*两段尾块参数使最后一轮块大小尽量接近减少长尾。其中256表示N方向分块粒度的元素数。效果示意适用场景大N且不能整齐分块的场景最后一轮存在明显慢核的场景。group间核负载均衡原理介绍设备侧调度器不会让每个group都从0号核重新开始而是通过startBasicBlockId (startBasicBlockId prevTileNum) % coreNum轮转group的起始核。这样可以避免若干大group总压在同一批核心上降低跨group的负载偏斜。收益点让不同group的basic block更均匀地落到各个核心缓解group规模不均带来的固定核热点问题。适用场景group_m_list分布不均存在连续多个大group的场景。模板归纳split-m n-resplit 模板已落地模板特点面向grouped weight quant MXFP8FP4场景host侧给出N方向自适应重切分参数设备侧调度器同时处理group间起始核轮转与group内M/N块枚举。涉及优化手段UB侧weight 4-bufferL1侧weight Double BufferUnitFlagN 方向 resplit小N场景taskNum控制group间起始核轮转与group内M块划分。适用场景A: float8_e4m3fnB: float4_e2m1packed经Vector核转换后进入Cube核计算按m轴分组、B转置路径输出为bfloat16。模板实现weight_quant_grouped_matmul_mxfp8fp4_split_m.asc优化策略选择指南根据 Bound 类型选择Bound 类型主要现象优先策略Cube Bound 但利用率不高尾轮不均衡、组间等待先看group间核负载均衡与N-resplitMTE2 BoundGM/L2搬运占比高先看B的FP4路径、scale窗口复用与重复搬运MTE1 BoundL1 - L0 装载跟不上 MMAD先看双缓冲与 L1/L0 切分匹配FIXPIPE Bound写回阶段压制吞吐先看UnitFlag与输出重叠根据输入特征选择输入特征建议大N、group相对均衡采用full-core主块 tail resplit中等 N、不可整除重点评估firstTail/secondTail比例小N优先检查taskNum选择是否过碎group_m_list极不均衡优先分析group间负载轮转和尾轮空转性能调优实践步骤性能分析使用Profiling工具结合性能建模分析当前算子的Bound类型瓶颈识别确定主要的性能瓶颈所在策略选择根据Bound类型选择合适的优化策略参数调优调整tiling参数优化缓冲区使用效果验证对比优化前后的性能数据迭代优化根据结果进一步调整优化策略总结GroupedMatmul MXFP8FP4权重量化矩阵乘算子的性能优化不仅要考虑单组MXFP8FP4矩阵乘的流水匹配还要考虑分组间的动态负载均衡。【免费下载链接】cann-samples算子领域高性能实战演进样例与体系化调优知识库项目地址: https://gitcode.com/cann/cann-samples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考