接口功能:更新KvCache中指定位置的key和value,同时更新key的scale值。
输入输出支持以下场景:
场景一:
[object Object]其中key和value的dtype为FLOAT8_E5M2或FLOAT8_E4M3FN,key_scale和key_scale_cache的dtype为FLOAT。
计算公式:
对于每个token(i ∈ [0, num_tokens))和每个头(j ∈ [0, num_head)):
[object Object]其中:
- num_tokens = batch * seq_len
- block_idx:slot_mapping映射到的block索引
- block_offset:block内的偏移量
[object Object]Ascend 950PR/Ascend 950DT[object Object]:仅支持场景一。
每个算子分为,必须先调用"aclnnScatterPaKvCacheWithKScaleGetWorkspaceSize"接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用"aclnnScatterPaKvCacheWithKScale"接口执行计算。
[object Object]
[object Object]
- 确定性计算:
- aclnnScatterPaKvCacheWithKScale默认确定性实现。
- key、value、keyCacheRef、valueCacheRef的数据类型必须一致;
- slotMapping的取值范围[0, num_blocks*block_size-1],且slotMapping内的元素值保证不重复,重复时不保证正确性;
- key和value的前两维shape必须相同;
- keyScale是两维tensor,shape为[batch * seq_len, num_head],尾轴可以不连续;
- keyScaleCacheRef是四维tensor,shape为[num_blocks, num_head, block_size, 1],最后一维必须为1,尾轴必须连续。
[object Object]Ascend 950PR/Ascend 950DT[object Object]:
[object Object]