GroupedMatmulSliceMPerTensorPerChannelDequant Example Readme【免费下载链接】catlass本项目是CANN的算子模板库提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass代码组织├── 48_ascend950_grouped_matmul_slice_m_per_tensor_per_channel_dequant │ ├── CMakeLists.txt # CMake编译文件 │ ├── README.md │ └── grouped_matmul_slice_m_per_tensor_per_channel_dequant.cpp # 主文件功能介绍该算子支持A矩阵在m轴切分然后和B矩阵按照group分组进行矩阵乘之后进行per_tensor或per_channel反量化操作。A/B矩阵为int8类型scale为float输出结果为half。Fixpipe随路量化/反量化对于特定输入输出数据类型Fixpipe支持将计算结果从CO1搬出到Global Memory时通过配置Fixpipe的量化/反量化模式和量化/反量化参数对输出C矩阵元素执行数据量化或反量化操作。Matmul量化场景Matmul计算时左矩阵A、右矩阵B为half数据类型输出C矩阵为int8_t数据类型。该场景下C矩阵的数据从CO1搬出到Global Memory时会执行量化操作将最终结果量化为int8_t类型如下图所示。Matmul反量化场景Matmul计算时左矩阵A、右矩阵B为int8_t数据类型输出C矩阵为half数据类型。该场景下C矩阵的数据从CO1搬出到Global Memory时会执行反量化操作将最终结果反量化为对应的half类型如下图所示。Fixpipe提供了两种不同粒度的随路量化/反量化模式即per_tensor和per_channel。per_tensor对整个Tensor进行量化/反量化Tensor具有唯一的缩放因子。这种方法可以降低模型的存储和计算成本但会降低模型的精度。per_channel对Tensor的每个通道单独进行量化/反量化同一通道内共享同一缩放因子通道间缩放因子则各不相同。这种方法可以更好地保留模型的精度但会增加模型的存储和计算成本。使用示例获取代码之后编译相应的算子可执行文件可参考quickstart本用例为Ascend 950算子编译时需加-DCATLASS_ARCH3510执行算子# 编译指定用例 bash scripts/build.sh 48_ascend950_grouped_matmul_slice_m_per_tensor_per_channel_dequant -DCATLASS_ARCH3510 cd output/bin # 可执行文件名|group数量|矩阵m轴|n轴|k轴|量化模式|Device ID # group数量及矩阵m轴、n轴、k轴维度必须大于0 # 量化模式可选0或10表示per_tensor1表示per_channel # Device ID可选默认为0 ./48_ascend950_grouped_matmul_slice_m_per_tensor_per_channel_dequant 128 512 1024 2048 0 0执行结果如下说明精度比对成功。Compare success.使用说明GroupedMatmulSliceMPerTensorPerChannelDequant默认使用的DispatchPolicy MmadDequant支持以下几个模板参数模板参数默认值参数说明ArchTag无指定架构型号enableUnitFlagfalse是否开启Unitflag开启L0C多缓冲时必须设置为falseuseHF32false是否开启HF32仅float类型支持l0CStages1指定L0C的缓冲区数量设置为2即可开启L0C双缓冲enableL1Residentfalse是否开启L1常驻l1AStages2L1上加载矩阵A的Buffer数量l1BStages2L1上加载矩阵B的Buffer数量l0AStages2L0上加载矩阵A的Buffer数量l0BStages2L0上加载矩阵B的Buffer数量设矩阵Shape为M N K, L1上的分块大小为m1 n1 k1M方向的分块数量mTiles CeilDiv(M, m1)N方向的分块数量nTiles CeilDiv(N, n1)总任务数为taskBlocks mTiles * nTiles在以下两种情况下可以选择开启enableL1Resident1.mTiles 1且nTiles CoreNum且K 2 * k1。此时还可以设置l0CStages2(需要关闭enableUnitFlag)如果空间不足无法设置l0CStages2则将n1设置为原来的一半。2.nTiles 1且mTiles CoreNum, 且K 2 * k1。此时还可以设置l0CStages2(需要关闭enableUnitFlag)如果空间不足无法设置l0CStages2则将m1设置为原来的一半。【免费下载链接】catlass本项目是CANN的算子模板库提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考