接口功能:在Indexer注意力机制的Epilog阶段,对KV Cache进行原地压缩更新。将
[object Object]/[object Object]的激活值按逐块动态量化(Per-Block Dynamic Quantization)压缩为FP8(E4M3/E5M2)、INT8([object Object])或MX-FP4格式,并按[object Object]将量化结果与对应[object Object]散写到cache,值为 -1的token跳过不处理。支持MX-FP8、Normal、HiFloat8、MX-FP4四种量化模式。计算公式:
对
[object Object]的最后一维(d轴)按量化粒度计算每组的amax,并量化为目标dtype,记第g组为(MX-FP8/MX-FP4模式每32个元素一组;Normal/HiFloat8模式整行一组):- 场景1(quantMode=0,MX-FP8):scale存储为
[object Object],[object Object]时对scale进行舍入。 - 场景2(quantMode=1,Normal):动态逐块量化,scale存储为
[object Object]。 - 场景3(quantMode=2,HiFloat8):输出为后的hifloat8。
- 场景4(quantMode=3,MX-FP4):按标准MX块(每32元素)量化为FP4(
[object Object]每字节打包2个fp4值),scale存储为[object Object]。
- 场景1(quantMode=0,MX-FP8):scale存储为
示例:
[object Object]
每个算子分为,必须先调用“aclnnIndexerQuantCacheGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnIndexerQuantCache”接口执行计算。
[object Object]
[object Object]
参数说明
[object Object]- 数据类型组合需匹配量化模式:quantMode=0,cache为FP8且scale为FLOAT8_E8M0;quantMode=1/2时,cache为FP8/UINT8且scale为FLOAT;quantMode=3,cache为FP4且scale为FLOAT8_E8M0。
返回值
第一段接口完成入参校验,出现以下场景时报错:
[object Object]
- 确定性计算:aclnnIndexerQuantCache默认确定性实现。
- 数据类型组合需与quantMode匹配:Normal/HiFloat8模式cacheScale为FLOAT;MX-FP8/MX-FP4模式cacheScale为FLOAT8_E8M0;MX-FP4模式cache为FP4(uint8打包)。
- cache 与 cacheScale均仅支持四维shape
[object Object],倒数第二维固定为1(每token一个量化向量),不支持其他维数;num_slots = blockNum × blockSize。 - cache/cacheScale仅在blockNum维支持非连续(分页):各block可不紧密排布,但block内(blockSize、headDim维)须连续。
- headDim长度约束:
- cache.headDim ≥ d(MX-FP4模式以fp4元素计,d个fp4值占 ⌈d/2⌉ 字节)。
- cacheScale.headDim ≥ scaleCol,scaleCol:MX-FP8/MX-FP4(quantMode=0/3)为 ⌈d/32⌉;Normal/HiFloat8(quantMode=1/2)为 1。
- 示例:d=128、quantMode=0 → scaleCol=4 → cache.headDim ≥ 128 且 cacheScale.headDim ≥ 4。
- x的最后一维(d轴)须能被32整除且 d ≤ 8192。
- slotMapping的维度应等于x的维度减1,即slotMapping为x除最后一维外的所有维度展平。
- slotMapping中值为 -1的token会被跳过不处理;其余有效元素取值范围为[0, num_slots - 1],且元素值应保证不重复,重复时不保证结果正确性。
[object Object]