aclnnKvRmsNormRopeCache
产品支持情况
产品 | 是否支持 |
---|---|
[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object] | × |
[object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object] | × |
[object Object]Atlas 200I/500 A2 推理产品[object Object] | × |
[object Object]Atlas 推理系列产品 [object Object] | × |
[object Object]Atlas 训练系列产品[object Object] | × |
功能说明
算子功能:对输入张量(kv)的尾轴,拆分出左半边用于rms_norm计算,右半边用于rope计算,再将计算结果分别scatter到两块cache中。
计算公式:
(1) interleaveRope:
(2) rmsNorm:
函数原型
每个算子分为undefined,必须先调用“aclnnKvRmsNormRopeCacheGetWorkspaceSize”接口获得入参并根据流程计算所需workspace大小,再调用“aclnnKvRmsNormRopeCache”接口执行计算。
aclnnStatus aclnnKvRmsNormRopeCacheGetWorkspaceSize(const aclTensor* kv, const aclTensor* gamma, const aclTensor* cos, const aclTensor* sin, const aclTensor* index, aclTensor* kCacheRef, aclTensor* ckvCacheRef, const aclTensor* kRopeScaleOptional, const aclTensor* ckvScaleOptional, const aclTensor* kRopeOffsetOptional, const aclTensor* cKvOffsetOptional, double epsilon, char* cacheModeOptional, bool isOutputKv, aclTensor* kRopeOut, aclTensor* cKvOut,uint64_t workspaceSize, aclOpExecutor* executor)
aclnnStatus aclnnKvRmsNormRopeCache(void* workspace, uint64_t workspaceSize, aclOpExecutor* executor, aclrtStream stream)
aclnnKvRmsNormRopeCacheGetWorkspaceSize
参数说明:
- kv(aclTensor*,计算输入):必选参数,公式中用于切分出rms_norm计算所需数据Dv和rope计算所需数据Dk的输入数据。Device侧的aclTensor,支持undefined。shape仅支持4维[Bkv,N,Skv,D]。undefined支持ND,数据类型支持FLOAT6、BFLOAT16。
- gamma(aclTensor*,计算输入):必选参数,公式中用于rms_norm计算的输入数据。Device侧的aclTensor,支持undefined。shape为1维[Dv,]。undefined支持ND。数据类型与输入kv一致。
- cos(aclTensor*,计算输入):必选参数,公式中用于rope计算的输入数据,对输入张量Dk进行余弦变换,Device侧的aclTensor,支持undefined。shape为4维[Bkv,1,Skv,Dk]或[Bkv,1,1,Dk],undefined支持ND。数据类型与输入kv一致。
- sin(aclTensor*,计算输入):必选参数,公式中用于rope计算的输入数据,对输入张量Dk进行正弦变换。Device侧的aclTensor,支持undefined。shape为4维[Bkv,1,Skv,Dk]或[Bkv,1,1,Dk],与cos的shape保持一致。undefined支持ND。数据类型与输入kv一致。
- index(aclTensor*,计算输入):必选参数,用于指定写入cache的具体索引位置,当index的value数值为-1时,代表跳过更新。Device侧的aclTensor,支持undefined。当cacheModeOptional为Norm时,shape为2维[Bkv,Skv];当cacheModeOptional为PA_BNSD、PA_NZ时,shape为1维[Bkv * Skv];当cacheModeOptional为PA_BLK_BSND、PA_BLK_NZ时,shape为1维[Bkv*ceil_div(Skv,BlockSize)]。undefined支持ND。数据类型支持INT64。
- kCacheRef(aclTensor*,计算输入/输出):必选参数,提前申请的cache,输入输出同地址复用。Device侧的aclTensor,支持undefined。当cacheModeOptional为PA场景(cacheModeOptional为PA、PA_BNSD、PA_NZ、PA_BLK_BNSD、PA_BLK_NZ)时,shape为4维[BlockNum,BlockSize,N,Dk];当cacheModeOptional为Norm场景时,shape为4维[Bcache,N,Scache,Dk]。undefined支持ND。数据类型与输入kv一致或者INT8。
- ckvCacheRef(aclTensor*,计算输入/输出):必选参数,提前申请的cache,输入输出同地址复用。Device侧的aclTensor,支持undefined。当cacheModeOptional为PA场景(cacheModeOptional为PA、PA_BNSD、PA_NZ、PA_BLK_BNSD、PA_BLK_NZ)时,shape为4维[BlockNum,BlockSize,N,Dv];当cacheModeOptional为Norm场景时,shape为4维[Bcache,N,Scache,Dv]。undefined支持ND。数据类型与输入kv一致或者INT8。
- kRopeScaleOptional(aclTensor*,计算输入):可选参数,当kCacheRef数据类型为INT8时需要此输入参数。Device侧的aclTensor,支持undefined。shape为2维[N,Dk];或者shape为1维[Dk,];或者shape为1维[1,]。undefined支持ND。数据类型支持FLOAT32。
- ckvScaleOptional(aclTensor*,计算输入):可选参数,当ckvCacheRef数据类型为INT8时需要此输入参数。Device侧的aclTensor,支持undefined。shape为2维[N,Dv];或者shape为1维[Dv,];或者shape为1维[1,]。undefined支持ND。数据类型支持FLOAT32。
- kRopeOffsetOptional(aclTensor*,计算输入):可选参数。当kCacheRef数据类型为INT8且对应的kRopeScaleOptional输入存在并量化场景为非对称量化时,需要此参数输入。Device侧的aclTensor,支持undefined。shape为2维[N,Dk];或者shape为1维[Dk,];或者shape为1维[1,]。undefined支持ND。数据类型支持FLOAT32。
- cKvOffsetOptional(aclTensor*,计算输入):可选参数,当ckvCacheRef数据类型为INT8且对应的ckvScaleOptional输入存在并量化场景为非对称量化时,需要此参数输入。Device侧的aclTensor,支持undefined。shape为2维[N,Dv];或者shape为1维[Dv,];或者shape为1维[1,]。undefined支持ND。数据类型支持FLOAT32。
- epsilon(double,输入):必选参数,rms_norm计算防止除0。float类型浮点数。建议设为1e-5。
- cacheModeOptional(char*,输入):必选参数,cache格式的选择标记。char*类型。类型有Norm、PA、PA_BNSD、PA_NZ、PA_BLK_BNSD、PA_BLK_NZ,建议设为Norm。
- isOutputKv(bool,输入):必选参数,kRopeOut和cKvOut输出控制标记。bool类型。当isOutputKv为true时,表示需输出kRopeOut和cKvOut。建议设为false。
- kRopeOut(aclTensor*,计算输出):由isOutputKv控制,当isOutputKv为true时,需输出。shape为4维[Bkv,N,Skv,Dk]。undefined支持ND。数据类型与输入kv一致。
- cKvOut(aclTensor*,计算输出):由isOutputKv控制,当isOutputKv为true时,需输出。shape为4维[Bkv,N,Skv,Dv]。undefined支持ND。数据类型与输入kv一致。
- workspaceSize(uint64_t*,出参):返回需要在Device侧申请的workspace大小。
- executor(aclOpExecutor**,出参):返回op执行器,包含了算子计算流程。
返回值: aclnnStatus:返回状态码,具体参见undefined。
[object Object]
aclnnKvRmsNormRopeCache
参数说明:
- workspace(void*,入参):在Device侧申请workspace内存地址。
- workspaceSize(uint64_t,入参):在Device侧申请的workspace大小,由第一段接口clnnKvRmsNormRopeCacheGetWorkspaceSize获取。
- executor(aclOpExecutor*,入参):op执行器,包含了算子计算流程。
- stream(aclrtStream,入参):指定执行任务的Stream。
返回值:
aclnnStatus:返回状态码,具体参见undefined。
约束说明
- 参数说明里shape格式说明:
- Bkv为输入kv的batch size,Skv为输入kv的sequence length,大小由用户输入场景决定,无明确限制。
- N为输入kv的head number。此算子与DeepSeekV3网络结构强相关,仅支持N=1的场景,不存在N非1的场景。
- D为输入kv的head dim。rms_norm计算所需数据Dv和rope计算所需数据Dk由输入kv的D切分而来。故Dk、Dv大小需满足Dk+Dv=D。同时,Dk需满足rope规则。根据rope规则,Dk为偶数。若cacheModeOptional为NZ场景(cacheModeOptional为PA_NZ、PA_BLK_NZ),Dk、Dv需32B对齐。
- 若cacheModeOptional为PA场景(cacheModeOptional为PA、PA_BNSD、PA_NZ、PA_BLK_BNSD、PA_BLK_NZ),BlockSize需32B对齐。
- 关于上述32B对齐的情形,对齐值由cache的数据类型决定。以BlockSize为例,若cache的数据类型为int8,则需BlockSize%32=0;若cache的数据类型为float16,则需BlockSize%16=0;若kCacheRef与ckvCacheRef参数的dtype不一致,BlockSize需同时满足BlockSize%32=0和BlockSize%16=0。
- Bcache为输入cache的batch size,Scache为输入cache的sequence length,大小由用户输入场景决定,无明确限制。
- BlockNum为写入cache的内存块数,大小由用户输入场景决定,无明确限制。
- index相关约束:
- 当cacheModeOptional为Norm时,shape为2维[Bkv,Skv],要求index的value值范围为[-1,Scache)。不同的Bkv下,value数值可以重复。
- 当cacheModeOptional为PA_BNSD、PA_NZ时,shape为1维[Bkv * Skv],要求index的value值范围为[-1,BlockNum * BlockSize)。value数值不能重复。
- 当cacheModeOptional为PA_BLK_BSND、PA_BLK_NZ时,shape为1维[Bkv * ceil_div(Skv,BlockSize)],要求index的value的数值范围为[-1,BlockNum * BlockSize)。value/BlockSize的值不能重复。
调用示例
示例代码如下,仅供参考,具体编译和执行过程请参考undefined。
[object Object]