接口功能:该FFN算子提供MoeFFN和FFN的计算功能。在没有专家分组(expertTokens为空)时是FFN,有专家分组时是MoeFFN,统称为FFN,属于Moe结构。MoE(Mixture-of-Experts,混合专家系统)是一种用于训练万亿参数量级模型的技术。MoE将预测建模任务分解为若干子任务,在每个子任务上训练一个专家模型(Expert Model),开发一个门控模型(Gating Model),该模型会根据输入数据分配一个或多个专家,最终综合多个专家计算结果作为预测结果。Mixture-of-Experts结构的模型是将输入数据分配给最相关的一个或者多个专家,综合涉及的所有专家的计算结果来确定最终结果。
相较于接口,此接口中expertTokens由数组改为Tensor输入。
相较于接口,此接口新增支持expertTokens索引输入,用tokensIndexFlag区分。expertTokens由数组改为Tensor输入。
计算公式:
非量化场景:
量化场景:
伪量化场景:
说明:
FFN在无专家或单个专家场景是否有性能收益需要根据实际测试情况判断,当整网中FFN结构对应的小算子vector耗时超过30us,且在FFN结构中占比10%以上时,可以尝试使用该融合算子,若实际测试性能劣化则不使用。
每个算子分为,必须先调用“aclnnFFNV3GetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnFFNV3”接口执行计算。
说明: 下述参数说明中涉及到的变量说明
M表示token个数,对应transform中的BS(B:Batch,表示输入样本批量大小。
S:Seq-Length,表示输入样本序列长度)。
K1表示第一个matmul的输入通道数,对应transform中的H(Head-Size,表示隐藏层的大小)。
N1表示第一个matmul的输出通道数。
K2表示第二个matmul的输入通道数。
N2表示第二个matmul的输出通道数,对应transform中的H。
[object Object]Atlas A2 训练系列产品/Atlas A2 推理系列产品[object Object]:E表示有专家场景的专家数;G表示伪量化per-group场景下,antiquantOffset、antiquantScale的组数。
确定性计算:
- aclnnFFNV3默认非确定性实现,支持通过aclrtCtxSetSysParamOpt开启确定性。
所有场景下需满足K1=N2, K1<65536, K2<65536, M轴在32Byte对齐后小于INT32的最大值。
[object Object]Atlas A2 训练系列产品/Atlas A2 推理系列产品[object Object]:
- 含BFLOAT16数据类型的场景仅支持Atlas 800I A2推理产品。
- 有专家时,专家数据的总数需要与x的M保持一致。
- 激活层为geglu/swiglu/reglu时,仅支持无专家分组时的FLOAT16高性能场景(FLOAT16场景指类型为aclTensor的必选参数数据类型都为FLOAT16的场景),且N1=2*K2。
- 激活层为gelu/fastgelu/relu/silu时,支持有专家或无专家分组的FLOAT16高精度及高性能场景、BFLOAT16场景、量化场景及伪量化场景,且N1=K2。
- 非量化场景不能输入量化参数和伪量化参数,量化场景不能输入伪量化参数,伪量化场景不能输入量化参数。
- 量化场景参数类型:x为INT8、weight为INT8、biasOptional为INT32、scaleOptional为FLOAT32、offsetOptional为FLOAT32,其余参数类型根据y不同分两种情况:
- y为FLOAT16,deqScaleOptional支持数据类型:UINT64、INT64、FLOAT32;
- y为BFLOAT16,deqScaleOptional支持数据类型:BFLOAT16;
- 要求deqScale1Optional与deqScale2Optional的数据类型保持一致。
- 量化场景支持scale的per-channel模式参数类型:x为INT8、weight为INT8、biasOptional为INT32、scaleOptional为FLOAT32、offsetOptional为FLOAT32,其余参数类型根据y不同分两种情况:
- y为FLOAT16,deqScaleOptional支持数据类型:UINT64、INT64;
- y为BFLOAT16,deqScaleOptional支持数据类型:BFLOAT16;
- 要求deqScale1Optional与deqScale2Optional的数据类型保持一致。
- 伪量化场景支持两种不同参数类型:
- y为FLOAT16、x为FLOAT16、biasOptional为FLOAT16,antiquantScaleOptional为FLOAT16、antiquantOffsetOptional为FLOAT16,weight支持数据类型INT8和INT4。
- y为BFLOAT16、x为BFLOAT16、biasOptional为FLOAT32,antiquantScaleOptional为BFLOAT16、antiquantOffsetOptional为BFLOAT16,weight支持数据类型INT8和INT4。
- 当weight1/weight2的数据类型为INT4时,其shape最后一维必须为偶数。
- 伪量化场景,per-group下,antiquantScale1Optional和antiquantOffset1Optional中的组数G要能被K1整除,antiquantScale2Optional和antiquantOffset2Optional中的组数G要能被K2整除。
- innerPrecise参数在BFLOAT16非量化场景,只能配置为0;FLOAT16非量化场景,可以配置为0或者1;量化或者伪量化场景,0和1都可配置,但是配置后不生效。
- tokensIndexFlag为true且有专家(expertTokens不为空)时,expertTokens中的数值必须满足:如果i和j都是expertTokens中有效的数组索引,且j大于i,那么expertTokens中第j个元素的数值大于或者等于expertTokens中第i个元素的数值。
[object Object]Atlas 推理系列加速卡产品[object Object]:
- 只支持无专家场景。
- 需满足N1=K2。
该融合算子接口只支持aclnn单算子调用方式,调用示例代码如下,仅供参考,具体编译和执行过程请参考。