MoeInitRoutingQuantV2
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | √ |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | × |
| Atlas 推理系列产品 | × |
| Atlas 训练系列产品 | × |
功能说明
-
算子功能:MoE的routing计算,根据aclnnMoeGatingTopKSoftmaxV2的计算结果做routing处理。
本接口针对aclnnMoeInitRoutingQuant做了如下功能变更,请根据实际情况选择合适的接口:
- 新增drop模式,在该模式下输出内容会根据每个专家的expertCapacity处理,超过expertCapacity不做处理,不足的会补0。
- 新增dropless模式下expertTokensCountOrCumsumOutOptional可选输出,drop场景下expertTokensBeforeCapacityOutOptional可选输出。
- 删除rowIdx输入。
- 增加动态quant计算模式。
-
计算公式:
1.对输入expertIdx做排序,得出排序后的结果sortedExpertIdx和对应的序号sortedRowIdx:
sortedExpertIdx,sortedRowIdx=keyValueSort(expertIdx)sortedExpertIdx, sortedRowIdx=keyValueSort(expertIdx)
2.以sortedRowIdx做位置映射得出expandedRowIdxOut:
expandedRowIdxOut[sortedRowIdx[i]]=iexpandedRowIdxOut[sortedRowIdx[i]]=i
3.在dropless模式下,对sortedExpertIdx的每个专家统计直方图结果,再进行Cumsum,得出expertTokensCountOrCumsumOutOptional:
expertTokensCountOrCumsumOutOptional[i]=Cumsum(Histogram(sortedExpertIdx))expertTokensCountOrCumsumOutOptional[i]=Cumsum(Histogram(sortedExpertIdx))
4.在drop模式下,对sortedExpertIdx的每个专家统计直方图结果,得出expertTokensBeforeCapacityOutOptional:
expertTokensBeforeCapacityOutOptional[i]=Histogram(sortedExpertIdx)expertTokensBeforeCapacityOutOptional[i]=Histogram(sortedExpertIdx)
5.计算quant结果:
-
静态quant:
quantResult=round((x∗scaleOptional)+offsetOptional)quantResult = round((x * scaleOptional) + offsetOptional)
-
动态quant:
-
若不输入scale:
dynamicQuantScaleOutOptional=row_max(abs(x))/127dynamicQuantScaleOutOptional = row\_max(abs(x)) / 127
quantResult=round(x/dynamicQuantScaleOutOptional)quantResult = round(x / dynamicQuantScaleOutOptional)
-
若输入scale:
dynamicQuantScaleOutOptional=row_max(abs(x∗scaleOptional))/127dynamicQuantScaleOutOptional = row\_max(abs(x * scaleOptional)) / 127
quantResult=round(x/dynamicQuantScaleOutOptional)quantResult = round(x / dynamicQuantScaleOutOptional)
-
6.对quantResult取前NUM_ROWS个sortedRowIdx的对应位置的值,得出expandedXOut:
expandedXOut[i]=quantResult[sortedRowIdx[i]%NUM_ROWS]expandedXOut[i]=quantResult[sortedRowIdx[i]\%NUM\_ROWS]
-
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x | 输入 | MOE的输入即token特征输入,对应公式中的`x`。 | FLOAT16、BFLOAT16、FLOAT32 | ND |
| expertIdx | 输入 | aclnnMoeGatingTopKSoftmaxV2的输出每一行特征对应的K个处理专家,对应公式中的`expertIdx`。 | INT32 | ND |
| scaleOptional | 可选输入 | 表示用于计算quant结果的参数,要求静态quant场景下必须输入,对应公式中的`scaleOptional`。 | FLOAT32 | ND |
| offsetOptional | 可选输入 | 表示用于计算quant结果的偏移值,要求在静态quant场景下必须输入,对应公式中的`offsetOptional`。 | FLOAT32 | ND |
| activeNum | 属性 | 表示是否为Active场景,该属性在dropPadMode为0时生效,值范围大于等于0。 | INT64 | - |
| expertCapacity | 属性 | 表示每个专家能够处理的tokens数,值范围大于等于0。 | INT64 | - |
| expertNum | 属性 | 表示专家数,值范围大于等于0。 | INT64 | - |
| dropPadMode | 属性 | 表示是否为Drop/Pad场景,取值为0和1。0:表示非Drop/Pad场景,该场景下不校验expertCapacity。 1:表示Drop/Pad场景,需要校验expertNum和expertCapacity,对于每个专家处理的超过和不足expertCapacity的值会做相应的处理。 | INT64 | - |
| expertTokensCountOrCumsumFlag | 属性 | 0:表示不输出expertTokensCountOrCumsumOutOptional。1:表示输出的值为各个专家处理的token数量的累计值。2:表示输出的值为各个专家处理的token数量。 | INT64 | - |
| expertTokensBeforeCapacityFlag | 属性 | 取值为false和true。false:表示不输出expertTokensBeforeCapacityOutOptional。 true:表示输出的值为在drop之前各个专家处理的token数量。 | BOOL | - |
| quantMode | 属性 | 取值为0和1。0:表示静态quant场景;1:表示动态quant场景。 | INT64 | - |
| expandedXOut | 输出 | 根据expertIdx进行扩展过的特征,对应公式中的`expandedXOut`。 | INT8 | ND |
| expandedRowIdxOut | 输出 | expandedX和x的映射关系,对应公式中的`expandedRowIdxOut`。 | INT32 | ND |
| expertTokensCountOrCumsumOutOptional | 可选输出 | 输出每个专家处理的token数量的统计结果及累加值,通过expertTokensCountOrCumsumFlag参数控制是否输出,该值仅在非Drop/Pad场景下输出,对应公式中的`expertTokensCountOrCumsumOutOptional`。 | INT32 | ND |
| expertTokensBeforeCapacityOutOptional | 可选输出 | 输出drop之前每个专家处理的token数量的统计结果,通过expertTokensBeforeCapacityFlag参数控制是否输出,该值仅在Drop/Pad场景下输出,对应公式中的`expertTokensBeforeCapacityOutOptional`。 | INT32 | ND |
| dynamicQuantScaleOutOptional | 可选输出 | 输出动态quant计算过程中的中间值,该值仅在动态quant场景下输出,对应公式中的`dynamicQuantScaleOutOptional`。 | FLOAT32 | ND |
约束说明
无。
调用说明
| 调用方式 | 样例代码 | 说明 |
|---|---|---|
| aclnn接口 | test_aclnn_moe_init_routing_quant_v2 | 通过aclnnMoeInitRoutingQuantV2接口方式调用MoeInitRoutingQuantV2算子。 |