---
title: DynamicNTKOperation
description: "| 硬件型号 | 是否支持 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/ascendtb/ascendtb_01_0140.html
sourcePath: /source/zh/canncommercial/900/API/ascendtb/ascendtb_01_0140.html
indexId: 8b69a31447929c8a88cdadb8a72c18534acdd82f00913561cef7927f9d9cd4c964
---
# DynamicNTKOperation

#### 产品支持情况

| 硬件型号 | 是否支持 |
| --- | --- |
| Atlas 350 加速卡 | x |
| Atlas A3 推理系列产品 / Atlas A3 训练系列产品 | √ |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | √ |
| Atlas 训练系列产品 | x |
| Atlas 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | x |


#### 功能说明

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

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

将输入的token序列的位置信息positionIds和invFreq进行外积，再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算子实现不同模型下公共的处理逻辑，差异化处理逻辑由模型实现。

- 算子计算公式
  将输入的token序列的位置信息positionIds和invFreq进行外积，再cos/sin运算得到最终的Rotary Embedding的结果。

- 具体计算过程：
  先通过每个batch的seqLen取出每个batch的positionIds，invFreq

  对每一个batch：

```
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;
    uint8_t rsv[12] = {0};
};
```


#### 参数列表

| 成员名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| outDataType | aclDataType | ACL\_DT\_UNDEFINED | 选择输出数据类型的参数。 ACL\_DT\_UNDEFINED：默认值，此默认类型不可用，用户需选择其他两项输出数据类型。 ACL\_FLOAT16：设置输出的dtype为float16。 ACL\_BF16：设置输出的dtype为bf16。 |
| rsv[12] | uint8\_t | {0} | 预留参数。 |


#### 输入

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| positionIds | [ntokens] | int32 | ND | 多个batch的token位置序列，格式如下：[0,1,2,…,batch1Len\-1,0,1,2…batch2Len\-1,0,1,2…]。 |
| InvFreqs | [batch, headSize/2] | float | ND | 每个batch的位置逆频。 |
| seqLens | [batch] | int32 | ND | 每个batch的序列长度。 |


参数InvFreqs的计算公式为：


#### 输出

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| sin | [ntokens, headSize] | float16/bf16 | ND | 输出的Rotary Embedding的sin矩阵。 |
| cos | [ntokens, headSize] | float16/bf16 | ND | 输出的cos矩阵，数据类型及shape与输出sin保持一致。 |


#### 约束说明

- headSize（即输出tensor的最后一维）小于等于2048，并且是32的倍数。
- batch小于等于16。
- nTokens（即输入positionIds的维度）小于等于256000。
- InvFreqIn数组数据范围：[0,1)，seqLens数组中数据大于0，且数组和为nTokens。
