接口功能:在KV Cache的Epilog阶段,对KV Cache进行原地压缩更新。将
[object Object]激活值量化压缩后,按[object Object]散写到cache,值为 -1的token跳过不处理。[object Object]尾轴[object Object]的后64列为rope段、前[object Object]列为nope段。支持三种量化模式:group(bf16 scale)、group(e8m0 scale)、rope hifloat8静态 + nope FLOAT4_E2M1动态。计算公式:
对
[object Object]的最后一维(d轴)按组计算每组的amax,并量化为目标dtype,记第g组为:场景1(quantMode=0):group(64)量化为FP8,
[object Object]存储为[object Object];rope段保留[object Object]。场景2(quantMode=1):同场景1,但
[object Object]存储为[object Object],[object Object]时[object Object]向上取到2的幂。场景3(quantMode=2):rope段(后64列)做hifloat8静态量化,nope段(前d-64列)做per-group FLOAT4_E2M1 动态量化(
[object Object]),[object Object]以[object Object]写出,[object Object]不生效:
示例:
[object Object]
每个算子分为,必须先调用“aclnnKvCompressEpilogGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnKvCompressEpilog”接口执行计算。
- 确定性计算:aclnnKvCompressEpilog默认确定性实现。
- cache仅支持四维shape
[object Object](num_slots = blockNum × blockSize),倒数第二维固定为1,不支持其他维数;仅在blockNum维支持非连续。 - headDim约束:cache末维headDim须 ≥ 每行写出字节数kvCacheCol = 对齐(concatCol)。concatCol:quantMode=0/1为(d-64)+128+⌈(d-64)/64⌉×scaleBytes(mode0=2、mode1=1);quantMode=2为64+(d-64)/2+((d-64)/quantGroupSize)×2。对齐:quantMode=1不补齐,quantMode=0/2按32B对齐。示例:d=256、quantMode=1 → kvCacheCol=323 → headDim ≥ 323。
- slotMapping的维度应等于x的维度减1,即slotMapping为x除最后一维外的所有维度展平。
- x的最后一维(d轴)需满足d % 64 == 0且64 < d ≤ 8192,按每64个元素一组进行逐组量化。
- quantMode=2时,quantGroupSize仅支持16/32/64,且nope段长度(d-64)需能被quantGroupSize整除;x需为bfloat16。
- slotMapping中值为 -1的token会被跳过不处理;其余有效元素取值范围为[0, num_slots - 1],且元素值应保证不重复,重复时不保证结果正确性。