推理的长度大于训练序列长度时,生成ROPE算子使用的旋转矩阵(即下面公式中的sin/cos矩阵)。
推理长度小于等于训练序列长度时,不进行插值;推理长度大于训练长度时,放大base动态插值。
将输入的token序列的位置信息positionIds和inv_freq进行外积,再cos/sin运算得到最终的Rotary embedding的结果。
dynamicNTK算子输出sin,cos。
q,k,sin,cos一起输入到Rope算子中输出旋转后的q,k:
DynamicNTK用于推理长度大于训练长度时,对embedding做特殊处理,根据seqlen长度,对base参数进行缩放,最终生成新的cos、sin。由于Llama、Qwen、Yarn等模型对于cos、sin的生成方案存在一部分差异,DynamicNTK算子实现不同模型下公共的处理逻辑,差异化处理逻辑由模型实现。
将输入的token序列的位置信息positionIds和inv_freq进行外积,再cos/sin运算得到最终的Rotary embedding的结果。
先通过每个batch的seqlen取出每个batch的positionIds,invFreq
freq = torch.einsum(‘i,j->ij’, positionIds, invFreq) emb = torch.cat((freq, freq), dim=-1) sinOut = emb.sin() cosOut = emb.cos()
struct DynamicNTKParam { aclDataType outDataType = ACL_DT_UNDEFINED; };
成员名称 |
类型 |
默认值 |
描述 |
---|---|---|---|
outDataType |
aclDataType |
ACL_DT_UNDEFINED |
选择输出数据类型的参数。
|
参数 |
维度 |
数据类型 |
格式 |
描述 |
---|---|---|---|---|
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保持一致。 |