GroupedMatmulV4 A5 MXFP8 调度源码导读
本文聚焦
aclnnGroupedMatmulV4在 A5/DAV_3510 上的 MXFP8 主路径:
x/weight=FLOAT8_E4M3FN、scale/perTokenScale=FLOAT8_E8M0、weight 为 ND,
transA=false、transB=false。其他 format、转置方式和量化模式只在必要时用于对比。
本文聚焦
aclnnGroupedMatmulV4在 A5/DAV_3510 上的 MXFP8 主路径:
x/weight=FLOAT8_E4M3FN、scale/perTokenScale=FLOAT8_E8M0、weight 为 ND,
transA=false、transB=false。其他 format、转置方式和量化模式只在必要时用于对比。
本文面向以下场景:
GroupedMatmul;aclnnGroupedMatmulV4;NpuArch::DAV_3510 和 arch35;x 和 weight 均为 FLOAT8_E4M3FN;scale/perTokenScale 使用 FLOAT8_E8M0。RAG可以基于外部知识源进行回答,增强了知识密集型问题的可靠性
→ 但仍然受到忠实性错误的影响 → 所以需要幻觉检测和缓解方法
→ 人们开始探索微调检测器,但是需要大量高质量数据进行训练
→ 后来使用LLM进行基于prompt的幻觉检测,但成本高、prompt敏感,而且无法反映决策过程
→ 最近的研究开始转向利用LLM内部表示进行幻觉检测
在 Ascend 950 (A5) 芯片上,部分 profiling 工具展示的指令级 cycle 数据可能来自静态查表,适合观察指令组成,但无法完整反映实际运行时的 pipeline stall、同步等待、访存延迟以及跨核通信开销。
为了测量代码在硬件上的实际执行周期,可以使用:
GetSystemCycle() 读取硬件 cycle;PipeBarrier<PIPE_ALL>() 排空相关流水线;printf 输出开始时间、结束时间和持续周期。该方法适合定位某段代码的真实耗时,以及不同执行阶段之间的等待和流水间隙。
AscendC::DumpTensor 用于在 AscendC Kernel 中导出输入、中间结果或输出 Tensor。配合 compare_dumps.py,可以比较基准版本(golden)和待测版本(test)的日志,逐步定位数值差异最早出现的位置。
推荐使用两个 Git worktree 同时维护两个待比较版本。每个 worktree 拥有独立的源码、构建产物和运行环境,不需要反复切换分支,也能避免两个版本互相覆盖。
浮点数的构成分为三部分:1bit符号位S、若干bit指数位E、若干bit尾数位M。
FP16内部是e5m10的结构。BSA算子在A5芯片上采用的是 fp8e4m3fn 精度。
此外还有 fp8e8m0 精度,只能表示正二的次幂,常用于 scale factor
用于支撑核间的同步控制。
1 | template <uint8_t modeId, pipe_t pipe> |
与SetFlag & WaitFlag 类似,pipe用于指定数据流之间的依赖,flagId表示事件类型;此外还新增了modeId用于指定模式。
Ascend的指令流水类型分为以下几种:
开发模型:Host-Device
编程模型:
存储单元:
Retrieval head采用大海捞针任务,成功识别出了检索头。但在MM场景下,证据常常以编码方式存在,而不是copy-paste,因此要看问题token对证据区域token的注意力质量。