PagedCacheLoadOperation(代码开放)
产品支持情况
硬件型号  | 
是否支持  | 
|---|---|
√  | 
|
√  | 
|
x  | 
|
x  | 
|
x  | 
功能
根据blockTable上存储的blockId和kv请求长度在kvCache上将对应位置的token搬运拼接成1条连续的key/value序列。
定义
1 2 3 4 5 6 7 8 9 10  | struct PagedCacheLoadParam { enum KvCacheCfg : int8_t { K_CACHE_V_CACHE_NZ = 0, K_CACHE_V_CACHE_ND, }; KvCacheCfg kvCacheCfg = K_CACHE_V_CACHE_NZ; bool cuSeqLens = false; bool hasSeqStarts = false; uint8_t rsv[61] = {0}; };  | 
参数列表
成员名称  | 
类型  | 
默认值  | 
取值范围  | 
是否必选  | 
描述  | 
|---|---|---|---|---|---|
kvCacheCfg  | 
KvCacheCfg  | 
0  | 
0,1  | 
否  | 
KvCache配置。 
  | 
isSeqLensCumsumMode  | 
bool  | 
false  | 
true,false  | 
否  | 
支持输入SeqLens为累加和模式,即第n个batch中所需提取的元素数量为前n个batch的所需提取的元素数量的累加和。该功能不支持NZ格式。  | 
hasSeqStarts  | 
bool  | 
false  | 
true,false  | 
否  | 
提供SeqStart用于为每个batch提供在blockTable中的初始位置(类似于offset)。该功能不支持NZ格式。  | 
rsv[61]  | 
uint8_t  | 
{0}  | 
[0]  | 
否  | 
预留参数。  | 
输入输出列表
- “KvCacheCfg”为“K_CACHE_V_CACHE_NZ”时输入:
参数
维度
数据类型
格式
描述
keyCache
[num_blocks, num_heads * head_size_k // elenum_aligned, block_size, elenum_aligned]
float16/bf16/int8
NZ
int8时 :elenum_aligned=32,其他情况为16。
valueCache
[num_blocks, num_heads * head_size_v// elenum_aligned, block_size, elenum_aligned]
float16/bf16/int8
NZ
int8时 :elenum_aligned=32,其他情况为16。
blocktable
[len(contextLens), ((max(contextLens)-1)//block_size +1]
int32
ND
len(contextLens)为输入contextlens的长度。
contextlens
[len(contextLens)]
int32
ND
len(contextLens)为输入contextlens的长度。
key
[sum(contextLens), num_heads * head_size_k]
float16/bf16/int8
ND
sum(contextLens)为输入contextlens的各元素求和。
value
[sum(contextLens), num_heads * head_size_v]
float16/bf16/int8
ND
sum(contextLens)为输入contextlens的各元素求和。
 - “KvCacheCfg”为“K_CACHE_V_CACHE_NZ”时输出:
参数
维度
数据类型
格式
描述
key
[sum(contextLens), num_heads * head_size_k]
float16/bf16/int8
ND
和输入key同地址。
value
[sum(contextLens), num_heads * head_size_v]
float16/bf16/int8
ND
和输入value同地址。
 - “KvCacheCfg”为“K_CACHE_V_CACHE_ND”时输入:
参数
维度
数据类型
格式
描述
keyCache
[num_blocks, block_size, num_heads, head_size_k]
float16/bf16/int8
ND
num_heads*head_size_k 需要是32B对齐。
valueCache
[num_blocks, block_size, num_heads, head_size_v]
float16/bf16/int8
ND
num_heads*head_size_v 需要是32B对齐。
blocktable
[len(contextLens), ((max(contextLens)-1)//block_size +1]
int32
ND
len(contextLens)为输入contextlens的长度。
contextlens
- isSeqLensCumsumMode为false:[len(contextLens)]
 - isSeqLensCumsumMode为true:[len(contextLens)+1]
 
int32
ND
- isSeqLensCumsumMode为false:len(contextLens)为输入contextlens的长度。
 - isSeqLensCumsumMode为true:每个len(contextLens)序列长度的累加和。
 
key
[num_tokens, num_heads, head_size_k]
float16/bf16/int8
ND
sum(contextLens)为输入contextlens的各元素求和。
value
[num_tokens, num_heads, head_size_v]
float16/bf16/int8
ND
sum(contextLens)为输入contextlens的各元素求和。
seq_starts
[len(contextLens)]
int32
ND
每个batch在blocktable中对应的起始位置。该tensor仅在hasSeqStarts为true时使用。
 - “KvCacheCfg”为“K_CACHE_V_CACHE_ND”时输出:
参数
维度
数据类型
格式
描述
key
[num_tokens, num_heads, head_size_k]
float16/bf16/int8
ND
和输入key同地址。
value
[num_tokens, num_heads, head_size_v]
float16/bf16/int8
ND
和输入value同地址。
 
规格约束
- NZ:num_heads * head_size_v控制在128*576以内,例如:对于float16类型,将每个token大小控制在144kB以内。
 - block_size为16的倍数。