接口功能:适配decode & prefill场景的FlashAttention算子,既可以支持prefill计算场景(PromptFlashAttention),也可支持decode计算场景(IncreFlashAttention)。
相比于FusedInferAttentionScoreV4,本接口新增qStartIdxOptional、kvStartIdxOptional、pseType参数。
说明:
decode场景下特有KV Cache:KV Cache是大模型推理性能优化的一个常用技术。采样时,Transformer模型会以给定的prompt/context作为初始输入进行推理(可以并行处理),随后逐一生成额外的token来继续完善生成的序列(体现了模型的自回归性质)。在采样过程中,Transformer会执行自注意力操作,为此需要给当前序列中的每个项目(无论是prompt/context还是生成的token)提取键值(KV)向量。这些向量存储在一个矩阵中,通常被称为kv缓存(KV Cache)。
计算公式:
self-attention(自注意力)利用输入样本自身的关系构建了一种注意力模型。其原理是假设有一个长度为的输入样本序列,的每个元素都是一个维向量,可以将每个维向量看作一个token embedding,将这样一条序列经过3个权重矩阵变换得到3个维度为的矩阵。
self-attention的计算公式一般定义如下,其中为输入样本的重要属性元素,是输入样本经过空间变换得到,且可以统一到一个特征空间中。公式及算子名称中的"Attention"为"self-attention"的简写。
本算子中Score函数采用Softmax函数,self-attention计算公式为:
其中和的乘积代表输入的注意力,为避免该值变得过大,通常除以的开根号进行缩放,并对每行进行softmax归一化,与相乘后得到一个的矩阵。
说明:
[object Object]
算子执行接口为,必须先调用“aclnnFusedInferAttentionScoreV5GetWorkspaceSize”接口获取入参并根据计算流程计算所需workspace大小,再调用“aclnnFusedInferAttentionScoreV5”接口执行计算。
- 约束类型说明
FusedInferAttentionScore算子约束分为4个档位,按约束复杂程度递增分为单参数约束、存在性约束、一致性约束和特性交叉约束,各档位约束内容和示例如下:
单参数约束:对于单个接口参数的约束,包含FusedInferAttentionScore算子接口中的Tensor、TensorList、Array和Attributes
- 对于Tensor、TensorList、Array,单参数约束中包含如下校验
- 校验shape,包括shape维度dim、每一维度dim value
- 校验dtype
- 校验format
- 对于属性Attribute
- 校验属性取值
- 对于Tensor、TensorList、Array,单参数约束中包含如下校验
存在性约束:约束特定场景下,特性参数组内,必须传入某参数,或不支持传入某参数
一致性约束:特性参数组内,各个参数间约束。
- Example 1:属性sparseMode和输入tensor attenMask均属于Attention Mask参数组,sparseMode取值为2/3/4时,attenMask shape必须为(2048,2048),此类约束即为参数组内的一致性约束
特性交叉约束:涉及多个参数组,不同参数组间交叉约束
- Example 1:输入tensor blockTable和属性blockSize属于Paged Attention(同PA)参数组,输入tensor attenMask属于Mask参数组;在PA场景下,attenMask输入最后一维(attenMaskS2)需要大于等于maxBlockNumPerSeq * blockSize,此类约束即为多参数组间的交叉约束;且为保证风格统一,此约束会放在入参顺序靠后的Paged Attention参数组中
特性参数组
- 基准信息说明
资料约束中,常见字段释义如下:
- 参数组约束
公共参数组(CommonChecker)
单参数约束
公共约束
[object Object]
存在性约束
[object Object]一致性约束
[object Object]特性交叉约束
非量化场景
[object Object]- [object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]、[object Object]Atlas A2 训练系列产品/Atlas A2 推理系列产品[object Object]:
- Prefill MLA场景下,不支持tensorlist、左padding
- MLA场景下,不支持后量化
- [object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]、[object Object]Atlas A2 训练系列产品/Atlas A2 推理系列产品[object Object]:
PSE参数组
- 单参数约束
- 公共
- 入参pseType应满足以下条件:
- pseType必须为0, 2或者3
- pseType为1不支持FA推理场景,仅支持FA训练场景
- 入参pseShift应满足以下条件:
- tensor的数据类型应满足以下条件:
- pseType为2或者3时,tensor的数据类型必须为FLOAT32
- pseType为0时,且query的数据类型为FLOAT16或者INT8时,tensor的数据类型必须为FLOAT16
- pseType为0时,且query的数据类型为BFLOAT16时,tensor的数据类型必须为BFLOAT16
- tensor shape应满足以下条件:
- pseType为2或者3时,tensor shape应为(Q_N)
- pseType为0时:
- tensor shape的维度必须为4
- P_S1(tensor shape的第3维) > 1时:
- tensor shape的第1维应等于1或者B
- tensor shape的第2维应等于Q_N
- tensor shape的第3为应大于等于Q_S
- 非prefix场景时,tensor shape的第4维应大于等于KV_S
- prefix场景时,tensor shape的第4维应大于等于KV_S + actualSharedPrefixLen
- P_S1(tensor shape的第3维) = 1时:
- tensor shape的第1维应等于1或者B
- tensor shape的第2维应等于Q_N
- 非prefix场景时,tensor shape的第4维应大于等于KV_S
- prefix场景时,tensor shape的第4维应大于等于KV_S + actualSharedPrefixLen
- tensor的数据类型应满足以下条件:
- 入参pseType应满足以下条件:
- 公共
- 存在性约束
- 公共
- 入参pseShift应满足以下条件:
- pseType为2或者3时,必须传入pseShift
- 入参pseShift应满足以下条件:
- 公共
- 一致性约束
- 公共
- pseType为2或者3时,入参qStartIdx和kvStartIdx应满足以下条件:
- qStartIdx的取值范围应满足 [-2147483648, 2147483647]
- kStartIdx的取值范围应满足 [-2147483648, 2147483647]
- kvStartIdx - qStartIdx的取值范围应满足 [-1048576, 1048576]
- 若qStartIdxOptional或kvStartIdxOptional非空,则取列表中的第一个数据作为qStartIdx或kvStartIdx
- pseType为2或者3时,入参qStartIdx和kvStartIdx应满足以下条件:
- 公共
- 特性交叉约束
- 公共
- PagedAttention场景下,入参pseShift应满足以下条件:
- tensor shape的最后一维应大于等于maxBlockNumPerBatch * blockSize
- alibi场景下,Q_S应等于KV_S
- MLA场景下,入参pseShift应满足以下条件:
- 不支持pse,不能传入pseShift
- D不等长场景下,入参pseShift应满足以下条件:
- 不支持pse,不能传入pseShift
- 伪量化场景下,当pseType为0且Q_S为1时,pseShift的第三维仅支持1
- PagedAttention场景下,入参pseShift应满足以下条件:
- 公共
- 单参数约束
[object Object]Attention Mask参数组[object Object]
单参数约束
- 公共
入参attenMask需要满足以下条件:
- tensor dtype为INT8/UINT8/BOOL类型
- tensor format为ND/NCHW/NHWC/NCDHW类型
- 如果输入attenMask shape中的Q_S、KV_S非32B对齐,可以向上取到对齐的Q_S、KV_S
入参sparseMode需要满足以下条件:
- sparseMode支持输入范围为0-4,默认值为0
- sparseMode在不开启mask时,仅支持输入为0
- sparseMode含义如下表所示(注:attenMask矩阵示例部分中的1 = masked out,0 = keep)
[object Object]undefined
- 公共
存在性约束
- 无
一致性约束
- 公共
- 入参attenMask的输入维度仅支持2/3/4
- Atlas 350 加速卡:
- 维度为2时,不支持sparseMode为0/1模式
- [object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]、[object Object]Atlas A2 训练系列产品/Atlas A2 推理系列产品[object Object]:
- sparseMode为0/1模式时,若传入query_rope和key_rope,或者query与key的D不等于value的D,则不支持attenMask输入维度为2
- sparseMode为0/1模式时,若attenMask输入维度为2,则layout仅支持为BSH、BSND、BNSD、BNSD_BSND
- Atlas 350 加速卡:
- 入参sparseMode为0/1模式时,attenMask矩阵的shape应满足 [batchSize/1,>=Q_S,>=KV_S + actualSharedPrefixLen]
- 入参sparseMode为2/3/4模式时,attenMask矩阵的shape最后两维应等于2048,即支持传入(2048,2048)或(1,2048,2048)或(1,1,2048,2048)
- 非伪量化或Q_S大于1时,preTokens与nextTokens应满足nextTokens * (-1) <= preTokens,以确保具有有效数据
- 入参attenMask的输入维度仅支持2/3/4
- 伪量化
- Q_S等于1时,attenMask输入维度仅支持3/4,且attenMask输入的shape应满足,第一维等于batchSize或1,倒数第二维应大于等于Q_S,最后一维应大于等于blockTable的第二维 * blockSize + actualSharedPrefixLen
- Q_S大于1时,若sparseMode为4模式,且attentionOut为int8类型时,则preTokens与nextTokens均不能为负数
- 公共
特性交叉约束
- 非量化
- Decode MLA场景下,sparseMode仅支持0/3/4模式
- GQA场景下,当query,key及value的head dim不相等时,sparseMode仅支持0/2/3模式
- 全量化
- Decode MLA场景下,如果query/key/value的类型为INT8,当layout为TND/TND_NTD时,sparseMode仅支持0/3模式,且0模式下不支持传入attenMask矩阵
- Decode MLA场景下,如果query/key/value的类型为INT8,当layout不为TND/TND_NTD时,Q_S大于1时,sparseMode仅支持3模式,且传入attenMask矩阵;Q_S等于1时,sparseMode仅支持0模式,且不支持传入attenMask矩阵
- Decode MLA场景下,如果query/key/value的类型为FLOAT8_E4M3FN/HIFLOAT8时,sparseMode仅支持0/3模式,且0模式下不支持传入attenMask矩阵
- MxFP8场景下,sparseMode仅支持0/3模式,且0模式下不支持传入attenMask矩阵
- 非量化
ActualSeqLen参数组
- 单参数约束
- 公共
- 入参actualSeqLengths(query的actualSeqLengths)应满足以下条件:
- 长度应满足以下条件:
- 当query的layout为TND/NTD时,长度应等于batch数
- 当query的layout为非TND/NTD时,长度应等于1或者大于等于query的batch值
- 入参中的数值应满足以下条件:
- 当query的layout为TND/NTD时,其值应递增(大于等于前一个值)排列
- 当query的layout为TND/NTD是,最后一个元素应等于T
- 当query的layout为非TND/NTD时,其值应不大于Q_S
- 其值应为非负数
- 长度应满足以下条件:
- 入参actualSeqLengthsKv(key/value的actualSeqLengths)应满足以下条件:
- 长度应满足以下条件:
- 当key/value的layout为TND/NTD时,长度应等于batch数
- 当key/value的layout为非TND/NTD时,长度应等于key/value的batch值
- 入参中的数值应满足以下条件:
- 当key/value的layout为TND/NTD时,最后一个元素应等于T
- 当key/value的layout为TND/NTD时,其值应递增(大于等于前一个值)排列
- 当key/value的layout为非TND/NTD时,其值应不大于KV_S
- 其值应为非负数
- 长度应满足以下条件:
- 入参actualSeqLengths(query的actualSeqLengths)应满足以下条件:
- 公共
- 存在性约束
- 公共
- 入参actualSeqLengths(query的actualSeqLengths)应满足以下条件:
- 当query的layout为TND/NTD时,必须传入actualSeqLengths
- 入参actualSeqLengthsKv(key/value的actualSeqLengths)应满足以下条件:
- 当key/value的layout为TND/NTD时,必须传入actualSeqLengthsKv
- PagedAttention场景下,必须传入actualSeqLengthsKv
- 入参actualSeqLengths(query的actualSeqLengths)应满足以下条件:
- 公共
- 一致性约束
- 无
- 特性交叉约束
- 公共
- alibi pse (pseType为2或3)场景下,入参actualSeqLengths和actualSeqLengthsKv应满足以下条件:
- actualSeqLengths和actualSeqLengthsKv在每个batch的数值需要相等
- alibi pse (pseType为2或3)场景下,入参actualSeqLengths和actualSeqLengthsKv应满足以下条件:
- 全量化
- Decode MLA场景下,若传入actualSeqLengths,query的layout必须为TND/NTD
- 公共
- 单参数约束
[object Object]伪量化/全量化参数组(DequantChecker)[object Object]
- 单参数约束
- 伪量化场景
- 入参keyAntiquantMode和valueAntiquantMode应满足以下条件:
- 入参中的数值应满足以下条件:
- 其值应为0(per-channel/per-tensor)、1(per-token)、2(per-tensor叠加per-head)、3(per-token叠加per-head)、 4(per-token模式使用page attention管理scale/offset)、 5(per-token叠加per-head模式并使用page attenion管理scale/offser)、6(per-token-group)
- 除key支持per-channel叠加value支持per-token,keyAntiquantMode和valueAntiquantMode应相等
- 入参中的数值应满足以下条件:
- 入参keyAntiquantScale和valueAntiquantScale应满足以下条件:
- 入参的数据类型应满足以下条件:
- per-channel(per-tensor),数据类型应与query相同
- per-token,数据类型仅支持FLOAT32
- per-tensor叠加per-head,数据类型应与query相同
- per-token叠加per-head,数据类型仅支持FLOAT32
- per-token模式使用page attention管理scale/offset,数据类型仅支持FLOAT32
- key支持per-channel叠加value支持per-token,数据类型仅支持FLOAT32
- per-token-group,数据类型仅支持FLOAT8_E8M0
- 入参的shape应满足以下条件:
- per-channel,shape应为(1, N, 1, D)、(1, 1, N, D)、(1, N, D)、(1, H)、(N, 1, D)、(N, D)、(H)
- per-tensor,shape应为(1)
- per-token,shape应为(1, B, >=KV_S)、(B, >=KV_S)
- per-tensor叠加per-head,shape应为(N)
- per-token叠加per-head,shape应为(B, N, >=KV_S)
- per-token模式使用page attention管理scale/offset,shape应为(blockNum, blockSize)
- ter-token叠加per-head模式并使用page attention管理scale/offset, shape应为(blockNum, N, blockSize)
- key支持per-channel叠加value支持per-token,keyAntiquantScale的shape应为(1, N, 1, D)、(1, N, D)、(1, H)、(N, 1, D)、(N, D)、(H)
- key支持per-channel叠加value支持per-token,valueAntiquantScale的shape应为(1, B, >=KV_S)、(B, >=KV_S)
- per-token-group,shape应为(1, B, N, >=KV_S, D/32)
- 入参的数据类型应满足以下条件:
- 入参key和value应满足以下条件:
- 入参的数据类型应满足以下条件:
- per-tensor模式,其支持的数据类型为INT8
- per-channel模式,其支持的数据类型为INT8、INT4(INT32)、HIFLOAT8、FLOAT8_E4M3FN
- per-token模式,其支持的数据类型为INT8、INT4(INT32)、FLOAT8_E4M3FN
- per-tensor叠加per-head模式,其支持的数据类型为INT8
- per-token叠加per-head模式,其支持的数据类型为INT8、INT4(INT32)
- per-token模式使用page attenion管理scale/offset,其支持的数据类型为INT8、FLOAT8_E4M3FN
- key支持per-channel叠加value支持per-token,其支持的数据类型为INT8、INT4(INT32)
- per-token-group,其支持的数据类型为FLOAT4_E2M1
- 入参的数据类型应满足以下条件:
- 入参keyAntiquantMode和valueAntiquantMode应满足以下条件:
- 全量化场景
- Decode MLA全量化
- 入参dequantScaleQuery、keyAntiquantScale、valueAntiquantScale的dtype为FLOAT32类型
- 入参keyAntiquantScale、valueAntiquantScale的shape为(1)
- 入参keyAntiquantMode、valueAntiquantMode为0(per-tensor模式),queryQuantMode为3(per-token叠加per-head模式)
- MxFP8全量化
- 入参dequantScaleQuery、keyAntiquantScale、valueAntiquantScale的dtype为FLOAT8_E8M0类型
- 入参dequantScaleQuery的shape为(Q_T, Q_N, D/64, 2)、keyAntiquantScale的shape为(Bn, KV_N, Bs, D/64, 2)、valueAntiquantScale的shape为(Bn, KV_N, Bs/64, D, 2)
- 入参queryQuantMode、keyAntiquantMode为6(per-token-group模式),valueAntiquantMode为8(per-channel-group模式)
- 入参quantScale1的shape为(1),dtype支持FLOAT32,复用quantScale1作为pScale
- Decode MLA全量化
- 伪量化场景
- 存在性约束
- 伪量化场景
- 入参keyAntiquantScale和valueAntiquantScale应满足以下条件:
- 必须传入keyAntiquantScale
- 必须传入valueAntiquantScale
- 入参keyAntiquantOffset和valueAntiquantOffset应满足以下条件:
- 传入keyAntiquantOffset时,必须传入valueAntiquantOffset
- 传入valueAntiquantOffset时,必须传入keyAntiquantOffset
- 当key/value的数据类型为FLOAT8_E4M3FN、HIFLOAT8、FLOAT4_E2M1时,不支持offset,不能传入keyAntiquantOffset
- 当key/value的数据类型为FLOAT8_E4M3FN、HIFLOAT8、FLOAT4_E2M1时,不支持offset,不能传入valueAntiquantOffset
- 入参keyAntiquantScale和valueAntiquantScale应满足以下条件:
- 全量化场景
- Decode MLA全量化
- dequantScaleQuery、keyAntiquantScale、valueAntiquantScale需同时存在
- 不支持传入keyAntiquantOffset、valueAntiquantOffset
- 不支持传入deqScale1、quantScale1、deqScale2
- 不支持传入antiquantScale、antiquantOffset
- 不支持传入keyRopeAntiquantScale
- MxFP8全量化
- dequantScaleQuery、keyAntiquantScale、valueAntiquantScale需同时存在
- 不支持传入keyAntiquantOffset、valueAntiquantOffset
- 不支持传入deqScale1、deqScale2
- 不支持传入antiquantScale、antiquantOffset
- 不支持传入keyRopeAntiquantScale
- Decode MLA全量化
- 伪量化场景
- 一致性约束
- 无
- 特性交叉约束
- 伪量化场景
- inputLayout仅支持BSH, BNSD, BSND, BNSD_BSND, TND
- key/value的数据类型为INT8时,inputLayout不支持TND
- Q_S = 1时:
- inputLayout不支持BNSD_BSND
- 当key/value的数据类型为INT8, keyAntiquantMode = 0且valueAntiquantMode = 1时,query和output的数据类型仅支持FLOAT16
- Q_S > 1时:
- key/value的数据类型为INT8时,keyAntiquantMode不支持2,3,4,5
- key/value的数据类型为INT8,且keyAntiquantMode为0或1时,query和output的数据类型仅支持BF16
- key/value的数据类型为INT8,且keyAntiquantMode为0或1时,Q_S长度不能大于16
- key/value的数据类型为INT8,且keyAntiquantMode为0或1时,不支持tensor list
- key/value的数据类型为INT8,且keyAntiquantMode为0或1时,不支持左padding
- key/value的数据类型为INT8,且keyAntiquantMode为0或1时,不支持page attention
- key/value的数据类型不支持INT4、INT32
- page attention场景下,入参keyAntiquantScale和valueAntiquantScale应满足以下条件:
- tensor shape应满足以下条件:
- per-token模式,shape的最后一维应大于等于maxBlockNumPerBatch * blockSize
- per-token叠加per-head模式,shape的最后一维应大于等于maxBlockNumPerBatch * blockSize
- per-token-group模式,shape的倒数第二维应大于等于maxBlockNumPerBatch * blockSize
- tensor shape应满足以下条件:
- 不支持合并rope
- 全量化场景
- Decode MLA全量化
- query、key、value的dtype为FLOAT8_E4M3FN/INT8/HIFLOAT8
- attenOut的dtype为BFLOAT16
- queryRope、keyRope的dtype为BFLOAT16
- 当query/key/value是FLOAT8_E4M3FN/HIFLOAT8时, inputLayout仅支持BSH、BSND、BNSD、TND、BSH_NBSD、BSND_NBSD、BNSD_NBSD、TND_NTD;当query/key/value类型为INT8时, inputLayout仅支持BSH、BSND、TND、BSH_NBSD、BSND_NBSD、TND_NTD
- Q_N支持1、2、4、8、16、32、64、128
- KV_N必须为1;G支持 [1, 128];Q_S支持[1,16]
- 当query的inputLayout为BSH时,dequantScaleQuery的shape应该为(B, Q_S, Q_N);当query的inputLayout为BSND、BNSD、TND时,dequantScaleQuery的shape相比query仅少一个维度D,且每一维需要和query的对应维度保持一致
- 不支持公共前缀场景、不支持pse场景、不支持alibi场景、不支持左padding场景
- 当query/key/value类型为INT8时,仅支持PagedAttention场景,且kv cache排布为NZ格式
- MxFP8全量化
- query、key、value的dtype为FLOAT8_E4M3FN
- attentionOut的dtype支持FLOAT16、BFLOAT16
- Q_S、KV_S仅支持64对齐
- inputLayout仅支持TND
- 仅支持PagedAttention场景
- 不支持alibi场景、不支持Rope存在、不支持后量化、不支持D不等长场景、不支持公共前缀场景
- Decode MLA全量化
- 单参数约束
[object Object]后量化参数组(PostQuantChecker)[object Object]
- 单参数约束
- 公共
- 入参quantScale2需要满足以下条件:
- tensor dtype为BF16/FP32类型
- 入参quantOffset2需要满足以下条件:
- tensor dtype为BF16/FP32类型
- PostQuant场景下,输出attenOut的数据类型仅支持INT8/FP8_E4M3FN/HIFLOAT8
- 入参quantScale2需要满足以下条件:
- 公共
- 存在性约束
- 公共
- PostQuant场景下,必须传入quantScale2
- 公共
- 一致性约束
- 公共
- PostQuant场景下,当quantScale2维度大于1且量化方式为per-channel时,若layout为BSH/BSND/BNSD/BNSD_BSND,则quantScale2仅支持shape为queryN*valueD,否则仅支持 [numHeads, vHeadDim]
- PostQuant场景下,当quantScale2维度等于1且量化方式为per-tensor时,quantScale2仅支持shape为(1)
- PostQuant场景下,当quantOffset2存在时,quantOffset2应与quantScale2保持相同shape及数据类型
- 公共
- 特性交叉约束
- 公共
- PostQuant场景下,当query输入类型不为BF16时,quantScale2仅支持FP32类型
- 非量化
- PostQuant场景下,当存在prefix时,仅支持输出attenOut的数据类型为INT8
- 伪量化
- PostQuant场景下,输出attenOut的数据类型仅支持与输入Key、Value数据类型相同
- 当keyAntiquantMode和valueAntiquantMode为per-token或per-token使用page attention管理scale/offset,query数据类型为FP16/BF16且key/value数据类型为FLOAT8_E4M3FN时,不支持叠加后量化
- 公共
- 单参数约束
Paged Attention参数组
- 单参数约束
- 公共
- 入参blockTable需要满足以下条件:
- tensor dtype为int32类型
- tensor shape为2维,每一维dim value取值均不能为0,第一维长度需等于Batch size,第二维长度不能小于maxBlockNumPerSeq(maxBlockNumPerSeq为每个batch中最大actualSeqLengthsKv对应的block数量)
- 入参blockSize需要满足以下条件:
- blockSize需要大于0
- blockSize是用户自定义的参数,该参数的取值会影响PagedAttention的性能,通常情况下,PagedAttention可以提高吞吐量,但会带来性能上的下降,调大blockSize会有一定性能收益
- 入参blockTable需要满足以下条件:
- 非量化
- 入参blockSize需要满足以下条件:
- Decode MLA/Prefill MLA场景:blockSize 16对齐,最大支持1024
- GQA场景:QueryHeadDim/KeyHeadDim/ValueHeadDim均为64或128时,blockSize 16对齐,最大支持1024;其他情况下,若Q_S> 1,blockSize 128对齐,最大支持1024,若Q_S= 1,blockSize 16对齐,最大支持512
- 入参blockSize需要满足以下条件:
- 伪量化
- 入参blockSize需要满足以下条件:需要根据key、value dtype size 32B对齐,最大支持512。即当key、value dtype为INT8/HIFLOAT8/FLOAT8_E4M3FN时,blockSize需要32对齐,即当key、value dtype为INT4(INT32)、FLOAT4_E2M1时,blockSize需要64对齐
- 全量化
- Decode MLA全量化场景下,仅支持blockSize取值128
- MxFP8全量化场景下,仅支持blockSize取值512
- 公共
- 存在性约束
- 公共
- PagedAttention开启情况下,必须传入actualSeqLengthsKv
- PagedAttention不支持tensorlist场景,不支持左padding场景,不支持公共前缀场景,不支持D不等长场景
- 公共
- 一致性约束
- 无
- 特性交叉约束
- 公共
- PagedAttention的开启场景下,若同时开启attenMask,传入attenMask的最后一维需要大于等于maxBlockNumPerSeq * blockSize
- PagedAttention场景下,kv cache排布为BnNBsD时性能通常优于kv cache排布为BnBsH时的性能,建议优先选择BnNBsD格式。
- PagedAttention场景下,当输入kv cache排布格式为BnBsH(blocknum, blocksize, H),且KV_N * D超过65535时,受硬件指令约束,会被拦截报错。可通过开启GQA(减小KV_N)或调整kv cache排布格式为BnNBsD(blocknum, KV_N, blocksize, D)解决。
- 伪量化
- PagedAttention场景下,kv cache的layout为4维时,inputLayout必须为BNSD、BNSD_BSND或TND
- 全量化
- Decode MLA场景下:
- 当query的数据类型为FP8_E4M3FN/HIFLOAT8,且inputLayout为BSH、BSND、BSH_NBSD、BSND_NBSD时,kv cache排布只支持BnBsH(blocknum, blocksize, H)和NZ (blocknum,KV_N,D/D0,blocksize,D0)两种格式
- 当query的数据类型为FP8_E4M3FN/HIFLOAT8,且inputLayout为BNSD、TND、BNSD_NBSD、TND_NTD时,kv cache排布支持BnBsH(blocknum, blocksize, H)、BnNBsD(blocknum, KV_N, blocksize, D)和NZ(blocknum,KV_N,D/D0,blocksize,D0)三种格式
- 当query的数据类型为INT8时,kv cache排布仅支持NZ,且kv cache排布为(blocknum,KV_N,D/D0,blocksize,D0)
- 当kv cache排布为NZ时,最后一维D0是32, keyRope最后一维D0是16
- GQA全量化场景除开MxFP8均不支持PagedAttention
- MxFP8全量化仅支持PagedAttention场景,kv cache排布仅支持BnNBsD(blocknum, KV_N, blocksize, D)
- Decode MLA场景下:
- 公共
- 单参数约束
左padding参数组
- 单参数约束
- 非量化
- Query左padding场景下,queryPaddingSize的shape应为(1)
- Key、value左padding场景下,kvPaddingSize的shape应为(1)
- 非量化
- 存在性约束
- 公共
- Query左padding场景下,必须传入queryPaddingSize
- Key、value左padding场景下,必须传入kvPaddingSize
- 公共
- 一致性约束
- 无
- 特性交叉约束
- 公共
- 左padding场景下,不支持PagedAttention
- 左padding场景下,不支持pseType = 2/3
- 左padding场景下,不支持BSH_BNSD、BSND_BNSD、TND、NTD、NTD_TND、TND_NTD场景
- 左padding场景下,必须传入actualSeqLengths/actualSeqLengthsKv
- 公共
- 单参数约束
公共前缀参数组
- 单参数约束
- 入参keySharedPrefix和valueSharedPrefix应满足以下条件:
- tensor shape应满足以下条件:
- shape应为(1)
- layout为BNSD和BSND时,N轴和D轴应与key/value的N轴和D轴相等
- layout为BSH时,H轴应与key/value的H轴相等
- keySharedPrefix和valueSharedPrefix的S轴应相等
- tensor数据类型应满足以下条件:
- 数据类型应与key/value的数据类型相同
- tensor shape应满足以下条件:
- 入参actualSharedPrefixLen应满足以下条件:
- shape应满足以下条件: shape应为1
- 入参中的数值应满足以下条件:
- 其值不能大于keySharedPrefix和valueSharedPrefix的shape的S轴
- 入参keySharedPrefix和valueSharedPrefix应满足以下条件:
- 存在性约束
- 公共
- 入参keySharedPrefix和valueSharedPrefix应满足以下条件:
- 传入keySharedPrefix时,必须传入valueSharedPrefix
- 传入valueSharedPrefix时,必须传入keySharedPrefix
- 入参keySharedPrefix和valueSharedPrefix应满足以下条件:
- 公共
- 一致性约束
- 无
- 特性交叉约束
- 公共
- 不支持PagedAttention场景
- 不支持tensorlist场景
- 不支持左padding场景
- 不支持alibi场景
- 不支持TND场景
- 不支持Prefill MLA (包括D不等长和ROPE独立输入)场景
- 不支持Decode MLA场景
- 全量化
- 全量化(包括MLA全量化和GQA全量化)场景,不支持prefix
- 后量化场景,仅支持数据类型INT8
- 伪量化
- 伪量化key/value合成场景所有量化模式prefix均支持
- 伪量化key/value分离场景,prefix仅支持以下量化模式:
- Q_S > 1时,伪量化方式为per-channel(per-tensor)、per-token时,key/value数据类型仅支持INT8
- Q_S = 1时,伪量化方式为per-tensor、per-tensor叠加per-head、per-token叠加使用page attention模式管理 scale/offset、per-token叠加per-head并使用page attention模式管理scale/offset,key/value数据类型仅支持INT8
- Q_S = 1时,伪量化方式为per-channel、per-token、per-token叠加per-head、key支持per-channel 叠加value支持per-token,key/value数据类型支持INT8、INT4(INT32)
- 公共
- 单参数约束
Rope参数组
- 单参数约束
- 公共
- 入参queryRope和keyRope需要满足以下条件
- tensor dtype为FLOAT16/BFLOAT16
- tensor shape中D维为64
- 入参queryRope和keyRope需要满足以下条件
- 公共
- 存在性约束
- 公共
- 入参queryRope和keyRope必须同时存在
- 公共
- 一致性约束
- 无
- 特性交叉约束
- 公共
- query shape的D仅支持128、512
- 非tensorlist场景, queryRope shape维度需要和query保持一致,除了queryRope shape的D为64外,其余维度需要和query一致;keyRope shape维度需要和key保持一致,除了keyRope shape的D为64外,其余维度需要和key一致
- 非量化场景,入参queryRope和keyRope的dtype需要和query、key保持一致
- 不支持公共前缀场景、不支持pse场景、不支持alibi场景
- 不支持伪量化场景
- Decode MLA
- Layout仅支持BNSD、BSND、BSH、TND、BNSD_NBSD、BSND_NBSD、BSH_NBSD、TND_NTD
- Q_N支持1/2/4/8/16/32/64/128;KV_N仅支持1
- 非量化场景,Q_S无限制;全量化场景,Q_S支持 [1,16]
- 不支持左padding场景、不支持tensorlist场景
- Prefill MLA
- Layout仅支持BNSD、BSND、BSH、TND、NTD、BSH_BNSD、BSND_BNSD、NTD_TND、BNSD_BSND
- 在tensorlist场景下,传入keyRope shape中D为64,B需要和key的tensorlist长度保持一致,N、S需要与key的tensorlist中每个tensor的N、S相等
- 不支持全量化场景
- 公共
- 单参数约束
LearnableSink参数组
- 单参数约束
- 公共
- 入参learnableSink需要满足以下条件
- tensor dtype为FLOAT16/BFLOAT16
- tensor shape为(Q_N)
- 入参learnableSink需要满足以下条件
- 公共
- 存在性约束
- 无
- 一致性约束
- 无
- 特性交叉约束
- 公共
- LearnableSink开启场景下,tensor dtype需要和query dtype保持一致
- LearnableSink开启场景下,QueryHeadDim/KeyHeadDim仅支持64、128、192,ValueHeadDim仅支持64、128
- LearnableSink开启场景下,innerPrecise必须为高精度模式(0)
- LearnableSink不支持左padding场景、不支持公共前缀场景、不支持pse场景、不支持alibi场景、不支持后量化场景
- LearnableSink不支持全量化场景、不支持伪量化场景、不支持Decode MLA场景
- 公共
- 单参数约束
SoftmaxLSE参数组
- 单参数约束
- 公共
- 输出lseOut仅支持数据类型FP32
- 公共
- 存在性约束
- 公共
- softmaxLSE场景下,输出lseOut不应为空
- 公共
- 一致性约束
- 无
- 特性交叉约束
- 公共
- softmaxLSE且非空tensor场景下,如输出layout为TND或NTD,则lseOut输入维度应为3,且shape匹配 [Q_T,Q_N,1]
- softmaxLSE且非空tensor场景下,如输出layout不为TND或NTD,则lseOut输入维度应为4,且shape匹配 [B,Q_N,Q_S,1]
- 公共
- 单参数约束