1、 Layout:支持BNSD、BSND、TND
2、 Dtype与量化形式:
a. Q/K/V:hifloat8
b. QScale:fp32,per-tensor,shape:[1]
c. KScale:fp32,per-tensor,shape:[1]
d. VScale:fp32,per-tensor,shape:[1]
e. PScale:fp32,per-tensor静态量化,shape [1],可选参数,不传默认值为1.0f
f. 输出:bf16
3、 Shape要求:
a. D=128
b. BNS支持泛化
4、 属性要求:
a. quant_mode:7:A8C8_QKV_HIF8_PER_TENSOR_P_FP8_E4M3_PER_TENSOR_SOFTMAX_FP32
b. mask_mode:0(仅支持不传入mask)/ 3 atten_mask [2048, 2048]
c. 不支持PA
d. 支持softmaxLSE
QuantFlashAttn HIF8 Per-Tensor 量化模式实现文档
1. 背景
1.1 HIF8 Per-Tensor 量化背景
QuantFlashAttn 算子此前仅支持 MXFP8(
quant_compute_mode=1)量化模式,该模式采用 per-block group 量化(每 32 个元素一组,使用FLOAT8_E8M0类型的 block scale)。随着大模型推理场景对精度和性能的需求演进,HIFLOAT8(HiFloat8)数据类型被引入,其核心优势在于:FLOAT32标量 descale,无需 per-block scale 数据,简化了数据准备和内存访问shape=(1,)的标量,显著减少 descale 数据的内存占用1.2 支持规格
1、 Layout:支持BNSD、BSND、TND
2、 Dtype与量化形式:
a. Q/K/V:hifloat8
b. QScale:fp32,per-tensor,shape:[1]
c. KScale:fp32,per-tensor,shape:[1]
d. VScale:fp32,per-tensor,shape:[1]
e. PScale:fp32,per-tensor静态量化,shape [1],可选参数,不传默认值为1.0f
f. 输出:bf16
3、 Shape要求:
a. D=128
b. BNS支持泛化
4、 属性要求:
a. quant_mode:7:A8C8_QKV_HIF8_PER_TENSOR_P_FP8_E4M3_PER_TENSOR_SOFTMAX_FP32
b. mask_mode:0(仅支持不传入mask)/ 3 atten_mask [2048, 2048]
c. 不支持PA
d. 支持softmaxLSE
2. 主要方案
2.1 方案大纲
3. 主要工作
3.1 Host 侧 Tiling 修改
qfa_tiling_info.hA8C8_QKV_HIF8_P_PER_TENSOR_SOFTMAX_FP32 = 7枚举;DTYPE_SUPPORT_MAPQ/K/V 加DT_HIFLOAT8,attn_out 加DT_FLOAT16qfa_tiling_info.cppqfa_tiling_info_parser.cppGetQuantMode()加 mode=7 校验;ParseAxisInfo()加 HIF8 early return;Parse()中GetQuantMode()提前到ParseAxisInfo之前quant_flash_attn_def.cppDataType和FormatListduplicate 为双条目(支持 E4M3/HIFLOAT8 两种 dtype 组合)checkers/quant_checker.cppCheckSingleParaQuantMode加 mode=7;Q/K/V descale 加 HIF8 dtype(FLOAT)/shape(1D) early return;CheckQDescaleShape等加 HIF8(1,)early return;CheckDescaleDtype加 HIF8 FLOAT 分支;CheckLayoutConstraint加 HIF8 layout 表;新增CheckHeadDimConstraint(≤128)checkers/quant_checker.hCheckHeadDimConstraint声明checkers/common_checker.cppCheckSingleParaDtype加 HIF8 分支 (Q/K/V →DT_HIFLOAT8)arch35/quant_flash_attn_tiling_mxfp8.cppIsCapable加 HIF8;SplitPolicy加 SINNER_256;UpdateTilingKeyConfig加 Config 2/3 + HIF8 fallback;UpdateTilingKeyQuantMode加QFA_HIF8_FP32_PREFILLqfa_adjust_sinner_souter.hSINNER_256和QUANT_MODE_HIF8_FP32 = 7常量3.2 Kernel 侧修改
quant_flash_attn_common_def.hQFA_HIF8_FP32_PREFILL = 7;新增FA_BYTE_BLOCK常量quant_flash_attn_template_tiling_key.hquant_flash_attn.cppquant_flash_attn_hif8函数 (hifloat8_t, DN-only);#elif (ORIG_DTYPE_Q == DT_HIFLOAT8)分支quant_flash_attn_block_cube_hif8.h(新增)MatmulFullMX用 dummyScale;s2BaseSizeCur = s2BaseSizequant_flash_attn_block_vec_hif8.h(新增)descaleQKValue_/vScaleValue_/SetDescaleQK/SetVScale;ProcessVec2OnUb用vScaleValue_;s2BaseSizeCur = s2BaseSizequant_flash_attn_kernel_hif8.h(新增)SetDescaleQK/SetVScale传给 vec block;ClipSInnerTokenHif8避免重复定义vf_mul_sel_softmaxflashv2_cast_nz_dn.h(公共)ProcessVec1DnNoUpdateMxfp8VF/ProcessVec1DnUpdateMxfp8VF中 4 处 castTraitRint 加 hifloat8_t 分支 (castTraitZero/One/Two/Three)3.3 Metadata 修改
quant_flash_attn_metadata_check.hquantModeSet加QUANT_MODE_HIF8 = 7quant_flash_attn_metadata_aicpu.cppqueryType/kvType条件加quantMode_ == 7;s2BaseSize_ = 256U(HIF8);v_descale 校验跳过quantMode_ == 73.4 Torch Extension 修改
torch_extension/cann_ops_transformer/ops/csrc/quant_flash_attn.cppQUANT_MODE_HIF8 = 7、HIFLOAT8 = 34常量;make_wrapper加 HIFLOAT8 dtype 分支;新增quant_mode == QUANT_MODE_HIF8的 wrapper 调用路径3.5 测试文件 (新增)
tests/pytest/fia_fullquant_hif8_test/common/generate_hifloat8_data.pycommon/quant_flash_attn_golden.pycommon/test_runner.pycommon/result_compare_method.pyquant_flash_attn_paramset_func_rdv.pytest_quant_flash_attn_func_rdv.pyconftest.py/pytest.ini