aclnnNormRopeConcat
产品支持情况
产品 | 是否支持 |
---|---|
[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object] | √ |
[object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object] | √ |
[object Object]Atlas 200I/500 A2 推理产品[object Object] | × |
[object Object]Atlas 推理系列产品[object Object] | × |
[object Object]Atlas 训练系列产品[object Object] | × |
功能说明
算子功能:(多模态)transfomer注意力机制中,针对query、key和Value实现归一化(Norm)、旋转位置编码(Rope)、特征拼接(Concat):
- 归一化(Norm)当前支持层归一化(LayerNorm)和带仿射变换参数层归一化(AFFINE LayerNorm)类型。
- 旋转位置编码(Rope)支持Interleave和Half类型。
- 特征拼接(Concat)支持在sequence维度上进行拼接,拼接有顺序区别。
计算公式(以Query(视频)和EncoderQuery(文本)为例):
说明:
- 输入输出布局如下:输入
query
的shape为(B, S, N, D)
,输出hiddenState
的shape为(B, N, S, D)
,其中 B为batch,S为sequenceLen,N为headNum,D为headDim。 - LayerNorm有三种模式(
normType
):NONE(0), LAYER_NORM(1), LAYER_NORM_AFFINE(2)
,其中:当normType = NONE
时:当normType = LAYER_NORM
时$$queryMean_{b,s,n} = \frac{1}{D}\sum_{i=0}^{D}query_{b,s,n} \ queryVar_{b,s,n} = \frac{1}{D}\sum_{i=0}^{D}(query-queryMean_{b,s,n})^2 \ queryRstd_{b,s,n}= \frac{1}{\sqrt{queryVar_{b,s,n}+\epsilon}} \ hiddenState_q = (query-queryMean_)queryRstd$$当normType =LAYER_NORM_AFFINE
时,在上面的基础上$$hiddenState_q = normQueryWeighthiddenState_q + normQueryBias$$ - Concat指在sequence维度上进行拼接,拼接有顺序区别(
concatOrder
),当concatOrder=0
时,在前,当concatOrder=1
时,在后。 - RoPE有三种模式(
ropeType
):NONE(0), INTERLEAVE(1), HALF(2)
,其中当ropeType=NONE
时直接输出不做变换,其余情况参考如下:[object Object] - RoPE的输入
ropeSin
的shape为(seqRope, D)
,其中 - 当场景为训练时,会输出
queryMean,queryRstd,encoderQueryMean,encoderQueryRstd
供后续反向使用。
- 输入输出布局如下:输入
函数原型
每个算子分为,必须先调用“aclnnNormRopeConcatGetWorkspaceSize”接口获取入参并根据计算流程计算所需workspace大小,再调用“aclnnNormRopeConcat”接口执行计算。
aclnnStatus aclnnNormRopeConcatGetWorkspaceSize(const aclTensor *query, const aclTensor *key, const aclTensor *value, const aclTensor *encoderQuery, const aclTensor *encoderKey, const aclTensor *encoderValue, const aclTensor *normQueryWeight, const aclTensor *normQueryBias, const aclTensor *normKeyWeight, const aclTensor *normKeyBias, const aclTensor *normAddedQueryWeight, const aclTensor *normAddedQueryBias, const aclTensor *normAddedKeyWeight, const aclTensor *normAddedKeyBias, const aclTensor *ropeSin, const aclTensor *ropeCos, int64_t normType, int64_t normAddedType, int64_t ropeType, int64_t concatOrder, double eps, bool isTraining, const aclTensor *queryOutput, const aclTensor *keyOutput, const aclTensor *valueOutput, const aclTensor *normQueryMean, const aclTensor *normQueryRstd, const aclTensor *normKeyMean, const aclTensor *normKeyRstd, const aclTensor *normAddedQueryMean, const aclTensor *normAddedQueryRstd, const aclTensor *normAddedKeyMean, const aclTensor *normAddedKeyRstd, uint64_t *workspaceSize, aclOpExecutor **executor)
aclnnStatus aclnnNormRopeConcat(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)
aclnnNormRopeConcatGetWorkspaceSize
参数说明:
- query(aclTensor*,计算输入):Device侧的aclTensor,注意力机制前的Query,支持ND([batch, seqQuery, headNum, headDim]),headDim需为偶数。数据类型支持FLOAT16、BFLOAT16、FLOAT32。
- key(aclTensor*,计算输入):Device侧的aclTensor,注意力机制前的Key,支持ND([batch, seqKey, headNum, headDim])。数据类型支持FLOAT16、BFLOAT16、FLOAT32。
- value(aclTensor*,计算输入):Device侧的aclTensor,注意力机制前的Value,支持ND([batch, seqValue, headNum, headDim]),
seqValue=seqKey
。数据类型支持FLOAT16、BFLOAT16、FLOAT32。 - encoderQuery(aclTensor*,计算输入):可选参数,Device侧的aclTensor,注意力机制前的Query,支持ND([batch, seqEncoderQuery, headNum, headDim])。数据类型支持FLOAT16、BFLOAT16、FLOAT32。用户不特意指定时建议传入为
nullptr
。 - encoderKey(aclTensor*,计算输入):可选参数,Device侧的aclTensor,注意力机制前的Key,支持ND([batch, seqEncoderKey, headNum, headDim])。数据类型支持FLOAT16、BFLOAT16、FLOAT32。用户不特意指定时建议传入为
nullptr
。 - encoderValue(aclTensor*,计算输入):可选参数,Device侧的aclTensor,注意力机制前的Value,支持ND([batch, seqEncoderValue, headNum, headDim])。数据类型支持FLOAT16、BFLOAT16、FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normQueryWeight(aclTensor*,计算输入):可选参数,Device侧的aclTensor,公式中正向输入Query进行归一化操作的权重值,支持ND([headDim])。数据类型支持FLOAT16、BFLOAT16、FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normQueryBias(aclTensor*,计算输入):可选参数,Device侧的aclTensor,公式中正向输入query进行归一化操作的偏差,支持ND([headDim])。数据类型支持FLOAT16、BFLOAT16、FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normKeyWeight(aclTensor*,计算输入):可选参数,Device侧的aclTensor,公式中正向输入key进行归一化操作的权重值,支持ND([headDim])。数据类型支持FLOAT16、BFLOAT16、FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normKeyBias(aclTensor*,计算输入):可选参数,Device侧的aclTensor,公式中正向输入key进行归一化操作的偏差,支持ND([headDim])。数据类型支持FLOAT16、BFLOAT16、FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normEncoderQueryWeight(aclTensor*,计算输入):可选参数,Device侧的aclTensor,公式中正向输入encoderQuery进行归一化操作的权重值,支持ND([headDim])。数据类型支持FLOAT16、BFLOAT16、FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normEncoderQueryBias(aclTensor*,计算输入):可选参数,Device侧的aclTensor,公式中正向输入encoderQuery进行归一化操作的偏差,支持ND([headDim])。数据类型支持FLOAT16、BFLOAT16、FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normEncoderKeyWeight(aclTensor*,计算输入):可选参数,Device侧的aclTensor,公式中正向输入encoderKey进行归一化操作的权重值,支持ND([headDim])。数据类型支持FLOAT16、BFLOAT16、FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normEncoderKeyBias(aclTensor*,计算输入):可选参数,Device侧的aclTensor,公式中正向输入encoderKey进行归一化操作的偏差,支持ND([headDim])。数据类型支持FLOAT16、BFLOAT16、FLOAT32。用户不特意指定时建议传入为
nullptr
。 - ropeSin(aclTensor*,计算输入):可选参数,Device侧的aclTensor,公式中正向输入进行旋转位置编码操作的sin值,支持ND([seqRope, headDim]),
seqRope
长度大小需在[1~min(seqQuery+seqEncoderQuery, seqKey+seqEncoderKey)]之间。数据类型支持FLOAT16、BFLOAT16、FLOAT32。用户不特意指定时建议传入为nullptr
。 - ropeCos(aclTensor*,计算输入):可选参数,Device侧的aclTensor,公式中正向输入进行旋转位置编码操作的cos值,支持ND([seqRope, headDim])。数据类型支持FLOAT16、BFLOAT16、FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normType(int64_t,计算输入):Host侧的int64,指定query、key归一化操作类型,0:不进行归一化操作,1:层归一化操作,2:带仿射变换参数层归一化操作,用户不特意指定时建议传入为0。
- normAddedType(int64_t,计算输入):Host侧的int64,指定encoderQuery、encoderKey归一化操作类型,0:不进行归一化操作,1:层归一化操作,2:带仿射变换参数层归一化操作,用户不特意指定时建议传入为0。
- ropeType(int64_t,计算输入):Host侧的int64,指定query与encoderQuery、key与encoderKey进行Concat后的旋转位置编码操作类型,0:不进行旋转位置编码操作,1:Interleave类型旋转位置编码,2:Half类型旋转位置编码,用户不特意指定时建议传入为0。
- concatOrder(int64_t,计算输入):Host侧的int64,指定query与encoderQuery、key与encoderKey、value与encoderValue的Concat操作叠加顺序,以query为例,0:[query, encoderQuery],1:[encoderQuery, query],用户不特意指定时建议传入为0。
- eps(double,计算输入):Host侧的eps,norm的eps,用户不特意指定时建议传入为1e-5。
- isTraining(bool,计算输入):Host侧的bool,是否训练场景,用户不特意指定时建议传入false(推理场景)。当传入true时,会输出normQueryMean,normQueryRstd,normKeyMean,normKeyRstd,normEncoderQueryMean,normEncoderQueryRstd,normEncoderKeyMean,normEncoderKeyRstd。
- queryOutput(aclTensor*,计算输出):Device侧的aclTensor,公式中正向输入query和encoderQuery处理后的最终输出,支持ND([batch,headNum, seqQuery+seqEncoderQuery, headDim])。 数据类型支持FLOAT16、BFLOAT16、FLOAT32。
- keyOutput(aclTensor*,计算输出):Device侧的aclTensor,公式中正向输入key和encoderKey处理后的最终输出,支持ND([batch,headNum, seqKey+seqEncoderKey, headDim])。 数据类型支持FLOAT16、BFLOAT16、FLOAT32。
- valueOutput(aclTensor*,计算输出):Device侧的aclTensor,公式中正向输入value和encoderValue处理后的最终输出,支持ND([batch,headNum, seqValue+seqEncoderValue, headDim])。 数据类型支持FLOAT16、BFLOAT16、FLOAT32。
- normQueryMean(aclTensor*,计算输出):可选参数,Device侧的aclTensor,公式中正向输入query进行归一化操作的均值μ,非训练场景(isTraining=false)时可不传入,支持ND([batch, seqQuery, headNum, 1])。数据类型支持FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normQueryRstd(aclTensor*,计算输出):可选参数,Device侧的aclTensor,公式中正向输入query进行归一化操作的方差相关项rstd,非训练场景(isTraining=false)时可不传入,支持ND([batch, seqQuery, headNum, 1])。数据类型支持FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normKeyMean(aclTensor*,计算输出):可选参数,Device侧的aclTensor,公式中正向输入key进行归一化操作的均值μ,非训练场景(isTraining=false)时可不传入,支持ND([batch, seqKey, headNum, 1])。数据类型支持FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normKeyRstd(aclTensor*,计算输出):可选参数,Device侧的aclTensor,公式中正向输入key进行归一化操作的方差相关项rstd,非训练场景(isTraining=false)时可不传入,支持ND([batch, seqKey, headNum, 1])。数据类型支持FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normAddedQueryMean(aclTensor*,计算输出):可选参数,Device侧的aclTensor,公式中正向输入encoderQuery进行归一化操作的均值μ,非训练场景(isTraining=false)时可不传入,支持ND([batch, seqEncoderQuery, headNum, 1])。数据类型支持FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normAddedQueryRstd(aclTensor*,计算输出):可选参数,Device侧的aclTensor,公式中正向输入encoderQuery进行归一化操作的方差相关项rstd,非训练场景(isTraining=false)时可不传入,支持ND([batch, seqEncoderQuery, headNum, 1])。数据类型支持FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normAddedKeyMean(aclTensor*,计算输出):可选参数,Device侧的aclTensor,公式中正向输入encoderKey进行归一化操作的均值μ,非训练场景(isTraining=false)时可不传入,支持ND([batch, seqEncoderKey, headNum, 1])。数据类型支持FLOAT32。用户不特意指定时建议传入为
nullptr
。 - normAddedKeyRstd(aclTensor*,计算输出):可选参数,Device侧的aclTensor,公式中正向输入encoderKey进行归一化操作的方差相关项rstd,非训练场景(isTraining=false)时可不传入,支持ND([batch, seqEncoderKey, headNum, 1])。数据类型支持FLOAT32。用户不特意指定时建议传入为
nullptr
。 - workspaceSize(uint64_t*,出参):返回需要在Device侧申请的workspace大小。
- executor(aclOpExecutor**,出参):返回op执行器,包含了算子计算流程。
返回值:
[object Object]
aclnnNormRopeConcat
参数说明:
- workspace(void*,入参):在Device侧申请的workspace内存地址。
- workspaceSize(uint64_t,入参):在Device侧申请的workspace大小,由第一段接口aclnnNormRopeConcatGetWorkspaceSize获取。
- executor(aclOpExecutor*,入参):op执行器,包含了算子计算流程。
- stream(aclrtStream,入参):指定执行任务的AscendCL stream流。
返回值:
约束说明
- headDim长度在[1~1024]间,或者headDim为偶数。
- seqRope长度大小在[1~Min(seqQuery+seqEncoderQuery, seqKey+seqEncoderKey)]之间。
调用示例
[object Object]