news 2026/5/9 20:41:00

CANN/catlass分组矩阵乘反量化示例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/catlass分组矩阵乘反量化示例

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。

  1. per_tensor:对整个Tensor进行量化/反量化,Tensor具有唯一的缩放因子。这种方法可以降低模型的存储和计算成本,但会降低模型的精度。
  2. per_channel:对Tensor的每个通道单独进行量化/反量化,同一通道内共享同一缩放因子,通道间缩放因子则各不相同。这种方法可以更好地保留模型的精度,但会增加模型的存储和计算成本。

使用示例

  • 获取代码之后编译相应的算子可执行文件,可参考quickstart,本用例为Ascend 950算子,编译时需加-DCATLASS_ARCH=3510
  • 执行算子
# 编译指定用例 bash scripts/build.sh 48_ascend950_grouped_matmul_slice_m_per_tensor_per_channel_dequant -DCATLASS_ARCH=3510 cd output/bin # 可执行文件名|group数量|矩阵m轴|n轴|k轴|量化模式|Device ID # group数量及矩阵m轴、n轴、k轴维度必须大于0 # 量化模式可选0或1,0表示per_tensor,1表示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多缓冲时必须设置为false
useHF32false是否开启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 k1,M方向的分块数量mTiles = CeilDiv(M, m1),N方向的分块数量nTiles = CeilDiv(N, n1),总任务数为taskBlocks = mTiles * nTiles,在以下两种情况下可以选择开启enableL1Resident:

1.mTiles = 1,且nTiles > CoreNum,且K < 2 * k1。此时还可以设置l0CStages=2(需要关闭enableUnitFlag),如果空间不足无法设置l0CStages=2,则将n1设置为原来的一半。

2.nTiles = 1,且mTiles > CoreNum, 且K < 2 * k1。此时还可以设置l0CStages=2(需要关闭enableUnitFlag),如果空间不足无法设置l0CStages=2,则将m1设置为原来的一半。

【免费下载链接】catlass本项目是CANN的算子模板库,提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 20:35:34

AI驱动材料发现:从机器学习力场到量子计算的闭环实践

1. 项目概述&#xff1a;当AI遇见晶体材料科学材料科学&#xff0c;尤其是晶体材料的发现与设计&#xff0c;正站在一个前所未有的十字路口。传统的“试错法”研发模式&#xff0c;从理论计算到实验合成&#xff0c;周期漫长、成本高昂&#xff0c;已经难以满足新能源、半导体、…

作者头像 李华
网站建设 2026/5/9 20:33:25

大众认为花钱进修一定能升职加薪,编程统计进修投入,职业晋升数据,无用进修只会增加个人经济负担。

一、实际应用场景描述在职场发展与人力资源管理中&#xff0c;普遍存在一种社会共识&#xff1a;“花钱进修&#xff08;考证、读研、培训班&#xff09;就一定能升职加薪。”这导致许多职场人&#xff1a;- 盲目报考各种证书与课程- 忽视进修内容与实际岗位需求的匹配度- 在未…

作者头像 李华
网站建设 2026/5/9 20:29:32

管程与线程:从操作系统到编程语言

在操作系统的并发控制教学中,管程(Monitor)与线程是两个核心概念。管程提供了一种高级的同步机制,而线程则是调度的基本单位。然而,许多学习者会发现:Linux 系统中似乎“没有管程”,而 Windows 等其他操作系统也很少直接以“管程”命名一个内核组件。那么,管程到底存在…

作者头像 李华
网站建设 2026/5/9 20:28:30

不自生,故长生,SAP BTP 开发里的长久之道

在 SAP BTP 项目里,最容易把系统做短命的,不是代码写得不够多,而是平台意识太强,什么都想接管,什么都想重写,什么都想变成自己的中心。老子说「天地所以能长且久者,以其不自生,故能长生」,放到 SAP BTP 开发里,最贴近工程现场的一层意思是,真正长久的扩展,不是把自…

作者头像 李华
网站建设 2026/5/9 20:27:46

CVAT工具的详细使用教程(视频标注)

CVAT工具的使用教程—视频标注一、项目&#xff08;Project&#xff09;创建与设置二、任务&#xff08;Task&#xff09;创建与配置三、视频标注详解&#xff08;基础&#xff09;1. 进入标注界面2. 选择标注模式和形状3. 开始标注&#xff08;创建轨道与关键帧&#xff09;4.…

作者头像 李华