aclnnNsaCompress
产品支持情况
产品 | 是否支持 |
---|---|
[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object] | × |
[object Object]Atlas A2 训练系列产品[object Object] | √ |
[object Object]Atlas 800I A2 推理产品[object Object] | × |
A200I A2 Box 异构组件 | × |
[object Object]Atlas 200I/500 A2 推理产品[object Object] | × |
[object Object]Atlas 推理系列产品[object Object] | × |
[object Object]Atlas 训练系列产品[object Object] | × |
功能说明
算子功能:训练场景下,使用NSA Compress算法减轻long-context的注意力计算,实现在KV序列维度进行压缩。
计算公式:
Nsa Compress正向计算公式如下:
函数原型
每个算子分为undefined,必须先调用“aclnnNsaCompressGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnNsaCompress”接口执行计算。
aclnnStatus aclnnNsaCompressGetWorkspaceSize(const aclTensor *input, const aclTensor *weight, const aclIntArray *actSeqLenOptional, char *layoutOptional, int64_t compressBlockSize, int64_t compressStride, int64_t actSeqLenType, aclTensor *output, uint64_t *workspaceSize aclOpExecutor **executor)
aclnnStatus aclnnNsaCompress(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)
aclnnNsaCompressGetWorkspaceSize
参数说明:
input(aclTensor *,计算输入):Device侧的aclTensor,表示待压缩张量。shape支持[T, N, D], 数据类型支持FLOAT16、BFLOAT16,数据类型与weight数据类型一致,undefined支持ND;支持undefined, 不支持空Tensor。综合约束请见undefined。
说明: input数据排布格式支持从多种维度解读,其中B(Batch)表示输入样本批量大小、S(Seq-Length)表示输入样本序列长度、H(Head-Size)表示隐藏层的大小、N(Head-Num)表示多头数、D(Head-Dim)表示隐藏层最小的单元尺寸,且满足D=H/N; 其中T是B和S合轴紧密排列的数据(每个batch的actSeqLen)、B(Batch)表示输入样本批量大小、S(Seq-Length)表示输入样本序列长度、H(Head-Size)表示隐藏层的大小、N(Head-Num)表示多头数、D(Head-Dim)表示隐藏层最小的单元尺寸,且满足D=H/N。
weight(aclTensor *,计算输入):Device侧的aclTensor,表示压缩权重。shape支持[compressBlockSize, N],weight与input的shape满足broadcast关系, 数据类型与input数据类型保持一致,undefined支持ND, 支持undefined, 不支持空Tensor。综合约束请见undefined。
actSeqLenOptional(aclIntArray *,计算输入):Host侧的aclIntArray,可选参数,数据类型支持INT64,undefined支持ND, 描述了每个Batch对应的S大小,当前不能为空;综合约束请见undefined。
layoutOptional(char *,计算输入):Host侧的string,可选参数,代表输入input的数据排布格式,支持BSH、SBH、BSND、BNSD、TND。当前仅支持TND。
compressBlockSize(int64_t,计算输入):Host侧的int64_t,压缩滑窗大小。
compressStride(int64_t,计算输入):Host侧的int64_t,两次压缩滑窗间隔大小。
actSeqLenType(int64_t,计算输入):Host侧的int64_t,可取值0或1,0代表actSeqLenOptional中数值为前继batch的系列大小的cumsum结果(累积和),1代表actSeqLenOptional中数值为每个batch中序列大小,当前仅支持0。
output(aclTensor*,计算输出): Device侧的aclTensor,压缩后的结果。shape支持[T, N, D],数据类型与input保持一致,数据格式支持ND。支持undefined,不支持空Tensor。
workspaceSize(uint64_t*,出参):返回需要在Device侧申请的workspace大小。
executor(aclOpExecutor**,出参):返回op执行器,包含了算子计算流程。
返回值:
返回aclnnStatus状态码,具体参见undefined。
[object Object]
aclnnNsaCompress
参数说明:
- workspace(void*,入参):在Device侧申请的workspace内存地址。
- workspaceSize(uint64_t,入参):在Device侧申请的workspace大小,由第一段接口aclnnNsaCompressGetWorkspaceSize获取。
- executor(aclOpExecutor*,入参):op执行器,包含了算子计算流程。
- stream(aclrtStream,入参):指定执行任务的Stream。
返回值:
aclnnStatus:返回状态码,具体参见undefined。
约束说明
- 该接口与PyTorch配合使用时,需要保证CANN相关包与PyTorch相关包的版本匹配。
- input和weight需要满足broadcast关系,input.shape[1]=weight.shape[1],不支持input、weight为空输入。
- actSeqLenType目前仅支持取值0,即actSeqLenOptional需要是前缀和模式。
- actSeqLenOptional目前不支持为空。
- layoutOptional目前仅支持TND,此时input.shape[0]必须等于actSeqLenOptional[-1]。
- input.shape[1]=weight.shape[1],需要小于等于128。
- input.shape[2]必须是16的倍数,上限256。
- weight.shape[0]=compressBlockSize,必须是16的倍数,上限128。
- compressStride必须是16的整数倍,并且compressBlockSize>=compressStride。
调用示例
示例代码如下,仅供参考,具体编译和执行过程请参考undefined。