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

#### 产品支持情况

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


#### 功能说明

KVCache处理。

对每一个batch：

图1 kvCache算子功能示意图

计算逻辑：

```
prefix_ntokens = 0
for i in range(batch):
for j in range(seqlen[i]):
cache_out[layer_id[0]][i][token_offset[i] - seqlen[i] + j][:] = newkv[prefix_ntokens + j][:] # 只会修改layer_id表示的layer的cache内容
prefix_ntokens += seqlen[i]
```


#### 算子上下文

在selfattention算子内部使用，用于将k，v储存到kcache，vcache中。

图2 kvCache在SelfAttention中的位置


#### 使用场景

用于transformer推理阶段。

举个例子，用户输入“世界最高峰”，模型续写得到的输出为“是珠穆朗玛峰”，KV Cache每一步的计算过程如下。

- 第一步生成时，缓存K，V均为空，输入为“世界最高峰”，视为三个词语，模型将按照常规方式并行计算：

  1. 并行计算得到每个token对应的k，v，以及注意力表示。
  2. 使用预测下一个token，得到“是”。
  3. 更新缓存，令，。

- 第二步生成时，计算流程如下：

  1. 仅将“是”输入模型，对其词向量进行映射，得到，，。
  2. 更新缓存，令，。
  3. 计算，预测下一个token，得到“珠”。


#### 定义

```
struct KVCacheParam {
    uint8_t rsv[8] = {0};
};
```


#### 参数列表

| 成员名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| rsv[8] | uint8\_t | {0} | 预留参数。 |


#### 输入

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| newKv | [ntokens, hiddenSize] [batch, seqLen, headNum, headSize] | float16/int8 | ND | 待被cache的key或value。 维度为四维时headNum \* headSize应该等于hiddenSize。 |
| layerId | [1] | int32 | ND | 指定要cache的layer。 算子只会修改past中layer\_id表示的layer的cache内容。 |
| past | [layer, batch, maxSeqLen, hiddenSize] | float16/int8 与newKv保持一致 | ND | 已经被cache的历史key或value。 |
| tokenOffset | [batch] | int32 | ND | 每个batch上做完cache后的token偏移。 |
| seqLen | [batch] | int32 | ND | 每个batch上newKv的seqLen。 |


#### 输出

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| present | [layer, batch, maxSeqLen, hiddenSize] | float16/int8 | ND | cache后的key或value，作为输出。 输出present与输入past指向同一地址，即进行原地修改。 数据类型和格式应该与newkv保持一致。 |


#### 约束说明

- seqLen 数组元素大于0，数组和为nTokens。
- tokenOffset数组元素大于0，小于maxSeqLen。
- layerId要小于past的第一维。
- hiddenSize需要32Bytes对齐。
