KVCache处理。当前仅支持
在selfattention算子内部使用,用于将k,v储存到kcache,vcache中。
对每一个batch:
计算逻辑:
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]
用于transformer推理阶段。
举个例子,用户输入“世界最高峰”,模型续写得到的输出为“是珠穆朗玛峰”,KV Cache每一步的计算过程如下。
struct KVCacheParam {};
参数 |
维度 |
数据类型 |
格式 |
描述 |
---|---|---|---|---|
newKv |
[ntokens, hiddenSize] |
float16/int8 |
ND |
待被cache的key或value。 |
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保持一致。 |