昇腾社区首页
中文
注册

aclnnFFN

Atlas 训练系列产品不支持该算子。

Atlas A2训练系列产品支持该算子。

接口原型

每个算子分为两段式接口,必须先调用“aclnnFFNGetWorkspaceSize”接口获取入参并根据计算流程计算所需workspace大小,再调用“aclnnFFN”接口执行计算。

  • aclnnStatus aclnnFFNGetWorkspaceSize(const aclTensor *x, const aclTensor *weight1, const aclTensor *weight2, const aclIntArray *expertTokens, const aclTensor *bias1, const aclTensor *bias2, const aclTensor *scale, const aclTensor *offset, const aclTensor *deqScale1, const aclTensor *deqScale2, char *activation, int64_t innerPrecise, const aclTensor *y, uint64_t *workspaceSize, aclOpExecutor **executor)
  • aclnnStatus aclnnFFN(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)

功能描述

  • 算子功能:该FFN算子兼容MoeFFN和FFN。该算子在没有专家分组(expert_tokens为空)时是FFN,有专家分组时是MoeFFN,统称为FFN,属于Moe结构。MoE(Mixture-of-Experts,混合专家系统)是一种用于训练万亿参数量级模型的技术。MoE将预测建模任务分解为若干子任务,在每个子任务上训练一个专家模型(Expert Model),开发一个门控模型(Gating Model),该模型根据要预测的输入来学习信任哪个专家,最终综合多个专家计算结果作为预测结果。
  • 使用约束:当前仅支持expert_tokens不为空的场景,即仅支持有专家分组的MoeFFN。
  • 计算公式:FFN类计算公式为

aclnnFFNGetWorkspaceSize

  • 参数说明:
    • x(aclTensor*,计算输入):必选,Device侧的aclTensor,公式中的输入x,数据类型支持FLOAT16、INT8,数据格式支持ND,支持输入为2维~8维。
    • weight1(aclTensor*,计算输入):必选,Device侧的aclTensor,专家的评估数据,公式中的W1,数据类型支持FLOAT16、INT8,数据格式支持ND,输入在有/无专家时分别为3维/2维。
    • weight2(aclTensor*,计算输入):必选,Device侧的aclTensor,专家的评估数据,公式中的W2,数据类型支持FLOAT16、INT8,数据格式支持ND,输入在有/无专家时分别为3维/2维。
    • expertTokens(aclIntArray*,计算输入):可选,Host侧的aclIntArray类型,代表各专家的评估权重,数据类型支持INT64,数据格式支持ND,若不为空时可支持的最大长度为256个。
    • bias1(aclTensor*,计算输入):可选,Device侧的aclTensor,评估数据修正值,公式中的b1,数据类型支持FLOAT16、INT32,数据格式支持ND,输入在有/无专家时分别为2维/1维。
    • bias2(aclTensor*,计算输入):可选,Device侧的aclTensor,评估数据修正值,公式中的b2,数据类型支持FLOAT16、INT32,数据格式支持ND,输入在有/无专家时分别为2维/1维。
    • scale(aclTensor*,计算输入):可选,Device侧的aclTensor,量化参数,可选参数,数据类型支持FLOAT,数据格式支持ND,一维向量,输入元素个数在有/无专家时分别为expertTokens长度/1个。
    • offset(aclTensor*,计算输入):可选,Device侧的aclTensor,量化参数,可选参数,数据类型支持FLOAT,数据格式支持ND,一维向量,输入元素个数在有/无专家时分别为expertTokens长度/1个。
    • deqScale1(aclTensor*,计算输入):可选,Device侧的aclTensor,第一个分组matmul的反量化参数,数据类型支持UINT64,数据格式支持ND,输入在有/无专家时分别为2维/1维。
    • deqScale2(aclTensor*,计算输入):可选,Device侧的aclTensor,第二个分组matmul的反量化参数,数据类型支持UINT64,数据格式支持ND,输入在有/无专家时分别为2维/1维。
    • activation(char*,计算输入):必选,Host侧的属性值,代表使用的激活函数,公式中的activation,数据类型支持string,当前支持fastgelu/gelu/relu/silu。
    • innerPrecise(int64_t,计算输入):可选,Host侧的属性值,代表内部精度模式,数据类型支持int,0和1分别代表高精度和高性能,默认值为高精度,当前仅支持高性能。
    • y(aclTensor*,计算输出):Device侧的aclTensor,公式中的输出y,数据类型支持FLOAT16,数据格式支持ND。
    • workspaceSize(uint64_t*,出参):返回用户需要在Device侧申请的workspace大小。
    • executor(aclOpExecutor**,出参):返回op执行器,包含了算子计算流程。
  • 返回值:

    返回aclnnStatus状态码,具体参见aclnn返回码

    第一段接口完成入参校验,若出现以下错误码,则对应原因为:

    • 返回161001(ACLNN_ERR_PARAM_NULLPTR):如果传入参数是必选输入、输出或者必选属性,且是空指针,则返回161001。
    • 返回161002(ACLNN_ERR_PARAM_INVALID):x、weight1、weight2、expertTokens、bias1、bias2、y的数据类型和数据格式不在支持的范围内。

aclnnFFN

  • 参数说明:
    • workspace(void*,入参):在Device侧申请的workspace内存起址。
    • workspaceSize(uint64_t,入参):在Device侧申请的workspace大小,由aclnnFFNGetWorkspaceSize获取。
    • executor(aclOpExecutor*,入参):op执行器,包含了算子计算流程。
    • stream(aclrtStream,入参):指定执行任务的AscendCL stream流。
  • 返回值:

    返回aclnnStatus状态码,具体参见aclnn返回码

约束与限制

  • 有专家时,专家数据的总数需要与BS(其中B表示输入样本批量大小、S表示输入样本序列长度)长度保持一致。
  • 专家个数不超过256个。