接口功能:适配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参数组中
- 单参数约束:对于单个接口参数的约束,包含FusedInferAttentionScore算子接口中的 Tensor、TensorList、Array 和 Attributes
特性参数组
[object Object]undefined
基准信息说明
资料约束中,常见字段释义如下:
[object Object]undefined
参数组约束
[object Object]公共参数组(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]:
- 非量化场景[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 矩阵
- 非量化
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模式)
- per-tensor 全量化
- 入参 deqScale1、deqScale2 的dtype支持 UINT64、FLOAT32
- 入参 quantScale1 的dtype支持FLOAT32
- 入参 deqScale1、quantScale1、deqScale2 的shape为(1)
- 入参 queryQuantMode、keyAntiquantMode、valueAntiquantMode 为0
- 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
- per-tensor 全量化
- deqScale1、quantScale1、deqScale2 需同时存在
- 不支持传入 dequantScaleQuery、keyAntiquantScale、valueAntiquantScale
- 不支持传入 keyAntiquantOffset、valueAntiquantOffset
- 不支持传入 antiquantScale、antiquantOffset
- 不支持传入 keyRopeAntiquantScale
- Decode MLA 全量化
- 伪量化场景
- 一致性约束
- 无
- 特性交叉约束
- 伪量化场景
- inputLayout 仅支持 BSH, BNSD, BSND, BNSD_BSND, TND
- key/value 的数据类型为 INT8 时,inputLayout 不支持 TND
- 当 Q_S 等于 1 时,inputLayout 不支持 BNSD_BSND
- 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 应满足以下条件:
- 全量化场景
- 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格式
- per-tensor 全量化
- query、key、value 的dtype为INT8
- attentionOut 的dtype支持FLOAT16、BFLOAT16
- Q_S 不能为1
- Q_N 支持 [1, 256];KV_N 支持 [1, 256];G 支持 [1,64];D 支持 [1,512]
- inputLayout 支持 BSH、BNSD、BSND、BNSD_BSND
- 不支持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
- 公共
- 存在性约束
- 公共
- 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全量化场景不支持PagedAttention
- 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]
- 公共
- 单参数约束