GroupedMatmulSwigluQuant
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
| Kirin X90 处理器系列产品 | √ |
| Kirin 9030 处理器系列产品 | √ |
功能说明
-
接口功能:融合GroupedMatmul 、dquant、swiglu和quant,详细解释见计算公式。
-
计算公式:
-
定义:
- ⋅ 表示矩阵乘法。
- ⊙ 表示逐元素乘法。
- ⌊x⌉\left \lfloor x\right \rceil 表示将x四舍五入到最近的整数。
- Z8={x∈Z∣−128≤x≤127}\mathbb{Z_8} = \{ x \in \mathbb{Z} | −128≤x≤127 \}
- Z32={x∈Z∣−2147483648≤x≤2147483647}\mathbb{Z_{32}} = \{ x \in \mathbb{Z} | -2147483648≤x≤2147483647 \}
-
输入:
- X∈Z8M×KX∈\mathbb{Z_8}^{M \times K}:输入矩阵(左矩阵),M是总token 数,K是特征维度。
- W∈Z8E×K×NW∈\mathbb{Z_8}^{E \times K \times N}:分组权重矩阵(右矩阵),E是专家个数,K是特征维度,N是输出维度。
- bias∈Z32E×Nbias∈\mathbb{Z_{32}}^{E \times N}:矩阵乘计算的偏移值,E是专家个数,N是输出维度。
- offset∈RE×Noffset∈\mathbb{R}^{E \times N}:per-channel非对称反量化的偏移,E是专家个数,N是输出维度。
- w_scale∈RE×Nw\_scale∈\mathbb{R}^{E \times N}:分组权重矩阵(右矩阵)的逐通道缩放因子,E是专家个数,N是输出维度。
- x_scale∈RMx\_scale∈\mathbb{R}^{M}:输入矩阵(左矩阵)的逐 token缩放因子,M是总token 数。
- groupList∈NEgroupList∈\mathbb{N}^{E}:前缀和的分组索引列表。
-
输出:
- Q∈Z8M×N/2Q∈\mathbb{Z_8}^{M \times N / 2}:量化后的输出矩阵。
- Q_scale∈RMQ\_scale∈\mathbb{R}^{M}:量化缩放因子。
- Q_offset∈RMQ\_offset∈\mathbb{R}^{M}:量化偏移因子。
-
计算过程
-
1.根据groupList[i]确定当前分组的 token ,i∈[0,Len(groupList)]i \in [0,Len(groupList)]。
例子:假设groupList=[3,4,4,6],从0开始计数。
第0个右矩阵
W[0,:,:],对应索引位置[0,3)的tokenx[0:3](共3-0=3个token),对应x_scale[0:3]、w_scale[0]、bias[0]、offset[0]、Q[0:3]、Q_scale[0:3]、Q_offset[0:3];第1个右矩阵
W[1,:,:],对应索引位置[3,4)的tokenx[3:4](共4-3=1个token),对应x_scale[3:4]、w_scale[1]、bias[1]、offset[1]、Q[3:4]、Q_scale[3:4]、Q_offset[3:4];第2个右矩阵
W[2,:,:],对应索引位置[4,4)的tokenx[4:4](共4-4=0个token),对应x_scale[4:4]、w_scale[2]、bias[2]、offset[2]、Q[4:4]、Q_scale[4:4]、Q_offset[4:4];第3个右矩阵
W[3,:,:],对应索引位置[4,6)的tokenx[4:6](共6-4=2个token),对应x_scale[4:6]、w_scale[3]、bias[3]、offset[3]、Q[4:6]、Q_scale[4:6]、Q_offset[4:6];请注意:groupList中未指定的部分将不会参与更新。 例如groupList=[12,14,18],X的shape为[30,:]。
则第一个输出Q的shape为[30,:],其中Q[18:,:]的部分不会进行更新和初始化,其中数据为显存空间申请时的原数据。
同理,第二个输出Q的shape为[30],其中Q_scale[18:]的部分不会进行更新或初始化,其中数据为显存空间申请时的原数据。
即输出的Q[:groupList[-1],:]和Q_scale[:groupList[-1]]为有效数据部分。
-
2.根据分组确定的入参进行如下计算:
Ci=(Xi⋅Wi)⊙x_scalei BroadCast⊙w_scalei BroadCastC_{i} = (X_{i}\cdot W_{i} )\odot x\_scale_{i\ BroadCast} \odot w\_scale_{i\ BroadCast}
Ci,act,gatei=split(Ci)C_{i,act}, gate_{i} = split(C_{i})
Si=Swish(Ci,act)⊙gateiS_{i}=Swish(C_{i,act})\odot gate_{i} 其中Swish(x)=x1+e−xSwish(x)=\frac{x}{1+e^{-x}}
注:当前版本不支持biasibias_{i}、offsetioffset_{i},未来版本将支持的计算公式如下: Ci=(Xi⋅Wi+biasi BroadCast)⊙x_scalei BroadCast⊙w_scalei BroadCast+offseti BroadCastC_{i} =(X_{i}\cdot W_{i} + bias_{i\ BroadCast})\odot x\_scale_{i\ BroadCast} \odot w\_scale_{i\ BroadCast}+offset_{i\ BroadCast}
-
3.确定量化方式
-
当量化方式为对称量化时:
Q_scalei=max(∣Si∣)127Q\_scale_{i} = \frac{max(|S_{i}|)}{127}
$Q_{i} = \left \lfloor \frac{S_{i}}{Q_scale_{i}}\right \rceil $
-
当量化方式为非对称量化时:(暂不支持)
Q_scalei=max(Si)−min(Si)255Q\_scale_{i} = \frac{max(S_{i})-min(S_{i})}{255}
Q_offseti=−128−⌊min(Si)Q_scalei⌉Q\_offset_{i} = -128 - \left \lfloor \frac{min(S_{i})}{Q\_scale_{i}}\right \rceil
$Q_{i} = \left \lfloor \frac{S_{i}}{ Q_scale_{i} } + Q_offset_{i}\right \rceil $
-
-
-
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x | 输入 | 左矩阵,公式中的X。 | INT8 | ND |
| weight | 输入 | 权重矩阵,公式中的W。 | INT8 | ND / NZ |
| bias | 输入 | 矩阵乘计算的偏移值,公式中的bias。 | INT32 | ND |
| offset | 输入 | per-channel非对称反量化的偏移,公式中的offset。 | FLOAT32 | ND |
| weightScale | 输入 | 右矩阵的量化因子,公式中的w_scale。 | FLOAT、FLOAT16、BFLOAT16 | ND |
| xScale | 输入 | 左矩阵的量化因子,公式中的x_scale。 | FLOAT32 | ND |
| groupList | 输入 | 指示每个分组参与计算的Token个数,公式中的groupList。 | INT64 | ND |
| output | 输出 | 输出的量化因子,公式中的Q。 | FLOAT | ND |
| outputScale | 输出 | 输出的量化因子,公式中的Q_scale。 | FLOAT | ND |
| outputOffset | 输出 | 输出的非对称量化的偏移,公式中的Q_offset。 | FLOAT | ND |
- Kirin X90/Kirin 9030 处理器系列产品: 不支持BFLOAT16。
约束说明
- N轴长度不能超过10240。
- K轴长度不能超过65536。
调用说明
| 调用方式 | 调用样例 | 说明 |
|---|---|---|
| aclnn调用 | test_aclnn_grouped_matmul_swiglu_quant | 通过接口方式调用GroupedMatmulSwigluQuant算子。 |