GroupedMatmulWithRoutingOperation
产品支持情况
硬件型号 |
是否支持 |
---|---|
|
√ |
|
√ |
|
x |
|
x |
|
x |
功能说明
在MOE中,实现topK个专家权重与token激活值的乘法。该算子不支持确定性计算。
使用场景
UP:根据各个专家的权值,将token值分配给topK个专家。
DOWN:根据各个专家的权值,将topK个专家计算的结果重新整合。
计算过程
- UP
UP过程的计算公式如下:
其中,AcTensor为激活token值,Expertindex为专家-token索引,ExpertWeight为专家权重,计算过程如下:
- 根据当前专家的索引
,从AcTensor中获取当前专家的激活token值。
- 获取当前专家的权重,并与当前专家的激活token值做BatchMatmul。
- 根据当前专家的索引
- DOWN
DOWN过程的计算公式如下:
其中,AcTensor为激活token值,Expertindex为专家-token索引,ExpertWeight为专家权重,计算过程如下:
- 根据当前专家的索引
,从AcTensor中获取当前专家的激活token值。
- 获取当前专家的权重,并与当前专家的激活token值做BatchMatmul。
- 将当前token在所有专家上的结果相加。
- 根据当前专家的索引
定义
1 2 3 4 5 6 7 8 9 10 11 |
struct GroupedMatmulWithRoutingParam { enum GroupedMatmulType : int { GROUPED_MATMUL_UP = 0, GROUPED_MATMUL_DOWN }; bool transposeB = true; int32_t topK = 0; GroupedMatmulType groupedMatmulType = GROUPED_MATMUL_UP; aclDataType outDataType = ACL_DT_UNDEFINED; uint8_t rsv[16] = {0}; }; |
参数列表
成员名称 |
类型 |
默认值 |
取值范围 |
是否必选 |
描述 |
---|---|---|---|---|---|
groupedMatmulType |
GroupedMatmulType |
GROUP_MATMUL_UP |
|
必选 |
GroupedMatmulType类型参数:
|
transposeB |
bool |
true |
false/true |
非必选 |
是否转置 B 矩阵。 |
topK |
int32_t |
0 |
大于0 |
必选 |
选取 topK 个专家数量。 |
outDataType |
aclDataType |
ACL_DT_UNDEFINED |
|
反量化场景必选 |
|
rsv[16] |
uint8_t |
{0} |
[0] |
- |
预留参数。 |
输入输出
- UP
非量化场景
- 输入
参数
维度
数据类型
格式
描述
AcTensor
[num_tokens, hidden_size_in]
float16/bf16
ND
激活值。
ExpertWeight
[num_experts, hidden_size_in, hidden_size_out]
float16/bf16
ND
专家权重。如果设置“transposeB”为true,则hidden_size_in和hidden_size_out位置调换。
ExpertCount
[num_experts]
int32
ND
专家 Token 数量。
Expertindex
[num_tokens*topK]
int32
ND
专家 Token 索引。
- 输出
参数
维度
数据类型
格式
描述
Result
[num_tokens*Topk, hidden_size_out]
float16/bf16
ND
输出。
量化场景
- 输入
参数
维度
数据类型
格式
描述
AcTensor
[num_tokens, hidden_size_in]
int8
ND
激活值。
ExpertWeight
[num_experts, hidden_size_in, hidden_size_out]
int8
ND/NZ
专家权重。如果设置“transposeB”为true,则hidden_size_in和hidden_size_out位置调换。
ExpertCount
[num_experts]
int32
ND
专家 Token 数量。
Expertindex
[num_tokens*topK]
int32
ND
专家 Token 索引。
nscale
[num_experts, hidden_size_out]
float
ND
ExpertWeight方向反量化系数。
mscale
[num_tokens]
float
ND
AcTensor方向反量化系数。
- 输出
参数
维度
数据类型
格式
描述
Result
[num_tokens*Topk, hidden_size_out]
float16/bf16
ND
输出。
- 输入
- DOWN
非量化场景
- 输入
参数
维度
数据类型
格式
描述
AcTensor
[num_tokens*topK, hidden_size_in]
float16/bf16
ND
激活值。
ExpertWeight
[num_experts, hidden_size_in,hidden_size_out]
float16/bf16
ND
专家权重。如果设置“transposeB”为true,则hidden_size_in和hidden_size_out位置调换。
ExpertCount
[num_experts]
int32
ND
专家 Token 数量。
Expertindex
[num_tokens*topK]
int32
ND
专家 Token 索引。
- 输出
参数
维度
数据类型
格式
描述
Result
[num_tokens, hidden_size_out]
float16/bf16
ND
输出。
量化场景
- 输入
参数
维度
数据类型
格式
描述
AcTensor
[num_tokens*topK, hidden_size_in]
int8
ND
激活值。
ExpertWeight
[num_experts, hidden_size_in,hidden_size_out]
int8
ND/NZ
专家权重。如果设置“transposeB”为true,则hidden_size_in和hidden_size_out位置调换。
ExpertCount
[num_experts]
int32
ND
专家 Token 数量。
Expertindex
[num_tokens*topK]
int32
ND
专家 Token 索引。
nscale
[num_experts, hidden_size_out]
float
ND
ExpertWeight方向反量化系数。
mscale
[num_tokens*topK]
float
ND
AcTensor方向反量化系数。
- 输出
参数
维度
数据类型
格式
描述
Result
[num_tokens, hidden_size_out]
float16/bf16
ND
输出。
- 输入
约束说明
- 当选择输出类型量化 ,则输入必须为int8类型;当选择输出类型不量化 ,则输入必须为bf16或float16。
- topK的数量不能超过专家数量。
- nTokens取值范围[128, 512]。
- nExperts取值范围[128, 256]。
- topK取值范围[2, 10]。
- hiddenSizeIn在UP模式下的取值范围[32, 5120]且为32的整数倍,在DOWN模式下取值范围[32, 256]且为32的整数倍。
- hiddenSizeOut在UP模式下的取值范围[32, 256]且为32的整数倍,在DOWN模式下取值范围[32, 5120]且为32的整数倍。