DynamicNTKOperation

功能

推理的长度大于训练序列长度时,生成ROPE算子使用的旋转矩阵(即下面公式中的sin/cos矩阵)。

推理长度小于等于训练序列长度时,不进行插值;推理长度大于训练长度时,放大base动态插值。

将输入的token序列的位置信息positionIds和inv_freq进行外积,再cos/sin运算得到最终的Rotary embedding的结果。

算子上下文

图1 DynamicNTK算子在模型中的位置

dynamicNTK算子输出sin,cos。

q,k,sin,cos一起输入到Rope算子中输出旋转后的q,k:

算子功能分析

DynamicNTK用于推理长度大于训练长度时,对embedding做特殊处理,根据seqlen长度,对base参数进行缩放,最终生成新的cos、sin。由于Llama、Qwen、Yarn等模型对于cos、sin的生成方案存在一部分差异,DynamicNTK算子实现不同模型下公共的处理逻辑,差异化处理逻辑由模型实现。

定义

struct DynamicNTKParam {
    aclDataType outDataType = ACL_DT_UNDEFINED;
};

参数列表

成员名称

类型

默认值

描述

outDataType

aclDataType

ACL_DT_UNDEFINED

选择输出数据类型的参数。

  • ACL_DT_UNDEFINED:默认值。
  • ACL_FLOAT16:设置输出的dtype为float16。
  • ACL_BF16:设置输出的dtype为bf16。

输入

参数

维度

数据类型

格式

描述

positionIds

[ntokens]

int32

ND

多个batch的token位置序列,格式如下:[0,1,2,…,batch1_len-1,0,1,2…batch2_len-1,0,1,2…]。

InvFreqs

[batch, head_size / 2]

float

ND

每个batch的位置逆频。

seqLens

[batch]

int32

ND

每个batch的序列长度。

参数InvFreqs的计算公式为:

输出

参数

维度

数据类型

格式

描述

sin

[ntokens, head_size]

float16/bf16

ND

输出的Rotary embedding的sin矩阵。

cos

[ntokens, head_size]

float16/bf16

ND

输出的cos矩阵,数据类型及shape与输出sin保持一致。

约束