端侧 AI 推理框架周报(2026-05-10 ~ 2026-05-17)
本周(2026/05/10 ~ 2026/05/17)15 个跟踪仓库中有 10 个产生更新,总计 157 次提交。重点关注 llama.cpp 的 MTP 推测解码支持、ONNX Runtime 的 FlashAttention 20x 加速、ncnn 的 ARM BF16 全线优化以及 ExecuTorch 的 RISC-V 基础设施落地。
tencent/ncnn — 12 commits
本周 ncnn 的核心主题是 BF16 存储与计算的深度优化,围绕 ARMv8.4 BF16 指令集展开了一系列 GEMM/卷积/全连接层的优化。
ARMv8.4 BF16 GEMM 优化(#6714)
PR #6714 针对 ARMv8.4 架构下的 BF16 GEMM 进行了深度实现。ARMv8.4 引入了 BFMMLA 指令(即 BFloat16 Matrix Multiply-Accumulate),每条指令可完成 2×4×8 的 BF16 矩阵乘加操作。ncnn 此次将 GEMM 核心路径切换至 BFMMLA,相比此前用 FP32 模拟 BF16 的方案,理论上可实现约 2x 的吞吐提升(单周期完成的乘加操作数翻倍),同时保留 BF16 带来的一半内存带宽消耗。
ARMv8.4 BF16 Convolution im2col-GEMM(#6715)
紧随 GEMM 优化,#6715 将 im2col-GEMM 卷积路径也接入了 BF16 存储 + BFMMLA 计算。im2col 展开后的矩阵乘法是卷积最重的计算瓶颈,以 BF16 格式存储 im2col 后的中间矩阵,一方面减少显存/缓存压力,另一方面利用 BFMMLA 加速 GEMM 内核。
ARMv8.4 BF16 InnerProduct(#6716)
全连接层(InnerProduct)同样得到 BF16 升级,#6716 同步适配了 BFMMLA 内核。这使得 Transformer 架构中的 FFN 层(本质上是多个全连接层)在 ARM 端侧的推理性能获得显著提升。
MultiHeadAttention BF16 存储(#6717)
#6717 将 MHA 层的 K/V 投影权重以及中间结果切换为 BF16 存储格式。在 Vision Transformer 或 LLM 场景中,MHA 层的内存瓶颈极为突出,BF16 存储可将 K/V 缓存的内存占用减半,对长序列推理尤其关键。
BF16 重构与 OHOS Clang 兼容(#6725)
#6725 将 BF16 转换逻辑重构为通过 float32_to_bfloat16 统一入口,避开了 OHOS(OpenHarmony)Clang 在 AArch64 上因 __bf16 类型导致的编译器崩溃。这是国产操作系统生态适配中的重要修复。
x86/ARM GEMM 对 m==1 的优化(#6723)
当 GEMM 的第一个维度 m=1 时(即单向量情况),#6723 在 x86 和 ARM 两端都引入了特殊路径。这在 Transformer decode 阶段极为常见(batch_size=1),跳过冗余的循环展开,直接执行向量-矩阵乘法而非完整 GEMM。
benchncnn_llm 基准工具(#6711)
#6711 引入了 benchncnn_llm 基准测试工具,专门用于测量 ncnn 上 LLM 运行时各个阶段的耗时(prefill、decode、注意力等)。此前 ncnn 主要基准是 benchncnn,侧重 CNN 模型的吞吐;新工具填补了 LLM 场景的空白。
Adreno GPU Cooperative Matrix 禁用(#6719)
Adreno GPU 驱动在 cooperative matrix(高通版本的矩阵累加器)上存在硬件限制,#6719 将其禁用。这意味着在高通 Adreno GPU 上暂时回退到通用计算路径,待驱动修复后重新启用。
alibaba/MNN — 3 commits
融合 GatedDelta 内核加速 LinearAttention Prefill(#4434)
#4434 新增 MNNFusedGatedDelta 融合内核,用于 LinearAttention 的 prefill 阶段。LinearAttention 通过核函数近似替代 softmax 注意力,其 prefill 阶段需要计算门控 delta(gated delta)序列。融合内核将多个分散的 element-wise 操作合并为单个 kernel launch,减少访存次数和 kernel launch 开销。
QNN Binary Op 性能优化
MNN 的 Qualcomm QNN 后端优化了 binary op(逐元素二元操作),直接加速视觉模型推理。QNN 后端的 binary op 通常被拆解为多个 QNN 节点,优化后减少节点数量和中间张量分配,对于 ResNet/轻量 ViT 这类含有大量残差加法的模型效果明显。
分离编译模式 Diffusion Bugfix(#4438)
修复了分离编译(sep-build)模式下 LLM 链接错误,确保 Diffusion 模型的兼容性。
sophgo/LLM-TPU — 2 commits
Qwen3 编程式 API 支持
#f1ef2e 为 Qwen3 模型添加了编程式(programmatic)模式支持。此前 LLM-TPU 主要支持命令行式运行,编程式 API 允许开发者通过 C++ 接口直接调用模型推理,方便集成到更大系统中。
设备内存信息打印
#1cf861 在所有 demo 中添加了 TPU 设备内存信息的打印,并统一了代码格式。这是面向调试和性能分析的基础设施改进,方便开发者了解模型在 BM168x 系列 TPU 上的内存占用情况。
ggml-org/llama.cpp — 30 commits
本周 llama.cpp 更新密集,涉及推测解码架构、量化支持、WebUI 重构、多模态音频等多个方向。
MTP(Multi-Token Prediction)推测解码支持(#22673)
这是本周最值得关注的特性。#22673 实现了 MTP(Multi-Token Prediction)支持。与传统推测解码使用独立的 draft model 不同,MTP 是 DeepSeek V3 论文中提出的方法:在 main model 的最后一层附加多个 MTP head,每个 head 预测后续第 k 个 token。这些 head 共享 backbone 的 hidden states,因此无需额外加载 draft model。
实现要点包括:
- 新增
draft-mtp架构标识,用于识别 MTP 模型 - 修改 speculative decoding 引擎以支持 MTP head 输出的批次处理
- 转换脚本适配 MTP 模型的权重导出
MTP 的优势在于:使用与 main model 相同的参数容量进行推理,draft 质量远高于小型 draft model,在数学推理等对生成质量敏感的 task 上推测解码的接受率更高。
NvFP4 量化 LM Head(#23046)
NVIDIA 的 NvFP4 格式(4-bit 浮点量化)被应用于 LM Head(语言模型头,即最后的全连接层)。LM Head 是 LLM 推理中参数量巨大的计算瓶颈(vocab_size × hidden_size),NvFP4 量化将其内存占用降至原来的 1/8,并通过 GPU 端的 FP4 矩阵乘内核加速。这意味着在 GPU 上推理时,采样阶段(logits 计算)可以显著加速。
GGML v0.12.0 版本发布
#e6c37a 将 ggml 版本升级至 0.12.0,同时 ggml.pc 的安装路径修复为 <libdir>/pkgconfig(#ggml/1480),符合 pkg-config 标准规范。
WebUI 重构:从 webui 到 ui
#59778f 将前端代码从 tools/server/webui/ 迁移至 tools/ui/,CMake 变量和预处理器宏从 LLAMA_BUILD_WEBUI 更新为 LLAMA_BUILD_UI(旧名作为 deprecation 保留)。这是对项目结构清晰化的整理。
Qwen3A 多模态音频支持(#23073)
#72e60f 为 Qwen3A(音频版)添加了 MTMD(Multi-Token Multi-Decoder)chunks 支持和正确的音频预处理。Qwen3A 使用类似 Whisper 的音频编码器 + 文本解码器的架构,llama.cpp 需要处理音频 token 与文本 token 的拼接以及注意力掩码的构建。
Qwen3 ASR 转换修复(#23081)
修复了 Qwen3 ASR(自动语音识别)模型到 GGUF 的格式转换,确保 ASR 权重正确导出。
AIME 2026 数据集支持(#23058)
llama-eval 工具新增 AIME 2026 数据集支持,从 HuggingFace 的 MathArena/aime_2026 加载 30 道数学竞赛题目(两组各 15 题)。这是持续跟踪 LLM 数学推理能力的重要基准更新。
MCP 工具调用的请求超时(#23138)
llama-ui 的 MCP(Model Context Protocol)工具调用新增请求超时配置,用户可以在系统设置中调整超时时间。这对于通过 MCP 连接外部工具(如文件搜索、代码执行)时防止无限等待非常关键。
GPU Router 模式改进(#23137)
#23137 优化了 server 的 router 模式:跳过 GPU 设备枚举以避免创建 CUDA primary context。当运行多个 llama.cpp 实例做负载均衡时,每个实例原本都会创建完整的 CUDA context,这会消耗大量 GPU 显存。跳过枚举后,router 实例仅作为 HTTP 转发代理运行。
convert_hf_to_gguf.py 重大重构(#17114)
这个传统单文件转换脚本被拆分为 conversion/ 目录下的多个模块,类似于 src/models/ 的架构。每个模型架构有独立的转换文件,降低维护难度和合并冲突。
qualcomm/ai-hub-models — 29 commits
Qwen2.5-VL-7B-Instruct 现代化(#3311)
#3311 对 Qwen2.5-VL(Vision-Language)模型进行全面现代化改造:使用代码生成 export.py、修复 evaluate 中 _sequence_lengths 的处理逻辑。关键改进是动态序列长度支持,使得 VLM 在不同分辨率输入下的推理更加灵活。
Pi05 量化支持(#2988)
Pi05(π0.5,物理世界交互模型)新增混合精度量化支持。使用 AIMET ONNX 工具链实现 w8a16(权重 8-bit、激活 16-bit)和 w4a16 两种量化方案。最低 Hexagon DSP 版本从 v79 降至 v73,使 Dragonwing IQ-9075 EVK 也能运行 Pi05。
YoloE 分割模型(#3090)
新增 YOLOE-Segmentation 模型,支持 FP16 和 w8a16 量化导出。YOLOE 是 YOLO 家族的最新版本,其分割头能够同时输出检测框和实例掩码。
YOLOv11 Pose 估计(#3056)
新增 YOLOv11 Pose(姿态估计)模型,对端侧人体姿态检测应用提供了完整支持。
NAFNet 模型系列(#2977)
新增 NAFNet 的去噪、去模糊和立体超分三个变体,均支持量化。NAFNet 是”Nonlinear Activation Free Network”,通过去除非线性激活函数实现高效的低级视觉任务处理。
get_input_spec 从静态方法改为实例方法(#3309)
这是一个横跨 216 个文件的重大重构:将 get_input_spec、get_output_names 等方法从 @staticmethod 改为普通实例方法。原因是模型可配置性增强后(分辨率、batch size、序列长度等参数存储在 self 上),静态方法无法访问实例配置。
SourceAsRoot 模型迁移(#3174)
将所有之前依赖 SourceAsRoot(从外部源码目录构建)的模型迁移为统一的导出流程。这简化了 CI 和依赖管理。
Scorecard 基础设施完善
本周有多项 scorecard(性能评分卡)改进:修复链接任务版本问题(#3318)、启用 LLM 模型的 scorecard 收集(#3289)、移除已废弃的”mirror device”支持(#3280)、修复 GPU 夜间测试目录创建问题(#3282)等。
microsoft/onnxruntime — 30 commits
FlashAttention 在 M4 Max 上实现 20x 加速(#27780)
#27780 是本周 ORT 最亮眼的更新。通过优化 FlashAttention 在 Apple Silicon M4 Max 上的实现,MultiHeadAttention 的性能从 58.3 秒降至 2.89 秒,提速约 20 倍。
实现关键在于动态 max_k_step——FlashAttention 的分块策略中,max_k_step(在 KV 维度上每次处理的块数)通常是静态预设的。而 M4 Max 的 GPU(Apple GPU 自研架构)对内存带宽和计算单元的调度特殊,动态调整块大小使得计算密集度和访存带宽利用率达到最佳平衡。
更新中特别提到该优化针对 NVIDIA GPU 也已同步移植(#28511),在 RTX 5060 Ti 上 prefill 阶段提升 10~15%。
RVV(RISC-V 向量扩展)优化卷积和池化(#28411)
#28411 为 RISC-V 架构添加了 MLAS 层的卷积和池化优化内核,使用 RVV 1.0 的 LMUL=4(vfloat32m4_t)向量宽度,BlockSize=16。包含 7 个 NCHWc 格式的内核:
- Direct NCHW 卷积
- 3×3 stride-1 深度可分离卷积
- NCHWc 格式的 Winograd 和直接卷积
- 池化内核
这是 ORT 在 RISC-V 端侧推理生态中的重要布局。
NHWC 卷积实现避免多次转置(#26834)
#26834 为 CPU EP 添加了 NHWC 数据布局的 FusedNhwcConv 核,由 KleidiAI 编译守卫控制启用。此前 ORT 默认使用 NCHW 布局,遇到 NHWC 输入时需要频繁转置。FusedNhwcConv 直接以 NHWC 格式计算,消除转置开销,在 Cortex-X 系列大核上有显著的 cache 局部性优势。
2-bit LUT GEMM 浮点零点支持(#28354)
#28354 为 MatMulNBits 的 2-bit LUT(Look-Up Table)GEMM 路径添加了 float/float16 零点支持。AMD QAD/Quark 的 2-bit 量化使用非均匀量化级别 $[-1, -1/3, 1/3, 1]$,对应的零点为 1.5(无法用 uint8 表示)。该 PR 修改了 LUT GEMM 的打包和计算逻辑,允许零点为浮点值。
LSTM CUDA 算子 opset 扩展(#27737)
将 LSTM CUDA 内核的算子集注册从 opset 14 扩展至 opset 22,填补了长达 8 个 opset 版本的兼容性鸿沟。opset 22 引入的 BFloat16 支持和新的 Tensor IR 特性使得 LSTM 在现代 ONNX 图中的兼容性恢复。
安全加固(多项)
- Expand 算子和常量折叠优化中添加 SafeInt 溢出保护(#28055)
- Tile 内核添加 4 GiB 输出大小上限(#28070)
- SoftmaxCrossEntropyLoss 标签越界检查(#28004)
- Resize 核的维度溢出检查和内存安全加固(#28402)
MLAS 批处理 NCHW Conv 的临时缓冲区修复(#28482)
修复了 #26103 引入的 bug:批处理/分组 NCHW 卷积并行化时,每线程临时缓冲区分配过大,浪费大量栈空间。该修复减少了栈溢出风险。
microsoft/onnxruntime-genai — 7 commits
Qwen3.5 位置 ID 去重优化(#2102)
#c34da1 优化了 Qwen3.5 模型 builder 中 _make_synthetic_position_ids() 的导出逻辑。通过固定的 basename 触发 make_node 的去重机制,position_ids 的计算子图只会被创建一次而非每层重复。这降低了 ONNX 图的大小,并消除了 WebGPU 上 INT64 Mul 导致的 CPU fallback(WebGPU 不支持 INT64 Mul)。
Gemma4 多模态 DecoderState 修复(#2148)
PR #2103 引入 Gemma4 多模态支持时新增了可选的 decoder_input_ids_,但检查条件使用了合并的 SessionInfo,误将编码器和解码器的输入混在一起判断。修复后改为仅在 decoder session 输入中包含 input_ids 时才传递该字段。
Extensions 修复 id2token bug(#2159)
更新了 onnxruntime-extensions 子模块,修复 id2token 映射中的 bug,涉及 tokenizer 的正确性问题。
pytorch/executorch — 30 commits
RISC-V QEMU 冒烟测试(#19399)
#933b476 实现了 RISC-V 支持第一阶段:交叉编译 executor_runner 为 riscv64-linux-gnu,在 x86_64 CI runner 上通过 qemu-user-static 运行 BundledProgram,验证 portable backend 正确输出。
这意味着 ExecuTorch 正式启动了 RISC-V 端侧推理的 CI 保障,后续将推进 XNNPACK 的后端适配。
融合量化 BMM 内核(#19489)
#a92200fb3e 引入了融合量化 batch matrix multiply(bmm)内核。在量化场景下,bmm 之前通常需要反量化权重、执行 FP32 bmm 再量化输出。融合内核将 dequant → bmm → quant 合并为单一 CUDA kernel,减少显存带宽使用。这是 LLM 推理中 attention 计算加速的关键优化。
Vulkan Backend mediump 精度修复(#19287)
#3a9230de32f 修复了 Vulkan shader 生成中的一个精度问题:半精度(FP16)shader 变体使用 highp 精度修饰符,这在 Mali G715 GPU 上导致 FP16 ALU 以 FP32 吞吐运行(Mali 严格遵循 highp 精度合约),而 Adreno 通过 relaxed-precision pass 自动降级因此不受影响。改为 mediump 后,Mali 才能正确使用 FP16 ALU。
Arm Backend VGF PT2E 量化模式(#19029)
Arm 后端新增 VGF(Variable Granularity Format)的 PT2E 量化模式,包括 16a8w(16-bit 激活、8-bit 权重)和 8a8w 两种。VGF 是 Arm 的灵活量化格式,支持不同的粒度级别(per-tensor、per-channel、per-block)。
LogitProcessor 接口(#19517)
#174d3adc9d6 新增了 LogitProcessor 接口,用于在采样前对 logits 进行变换。这为实现 repetition penalty、top-k/top-p 过滤、temperature scaling 等推理时策略提供了统一的 hook 机制。
Grammar 字段与约束解码(#19616→#19620)
#7355d7 在 GenerationConfig 中添加了 grammar 字段用于约束解码,但立即被 revert(#e6bf14)——原因是其破坏了 QNN 后端的测试。约束解码让 LLM 的输出遵循指定的文法(如 JSON 格式),对于结构化输出场景至关重要。
CoreML Stable RMSNorm(#19523)
为 CoreML backend 添加了 stable RMSNorm 路径,使其在 CPU fallback 路径上也能正确执行 LayerNorm 类操作,确保与 CoreML 硬件的兼容性。
XNNPACK 权重缓存运行时配置(#19603)
将 XNNPACK 的权重缓存从编译时宏改为运行时布尔选项。之前即便通过 set_option(weight_cache_option_key, true) 运行时启用,若编译时未定义宏也会静默无效。
A16W8 量化测试覆盖率增强(多项)
本周 ExecuTorch 显著增强了 Arm Ethos-U NPU 上的 a16w8(int16 激活、int8 权重)量化测试:
- mean_dim 测试(#19594)
- reciprocal 测试(#19592)
- exp 测试(#19591)
这些都是为 Cortex-M 系列 MCU 上的 tinyML 推理提供更全面的量化验证。
计算机视觉使用文档(#19518)
新增了 ExecuTorch 中 CV 模型使用的详细文档,涵盖预处理放置策略、resize/crop 行为、dtype 转换、归一化以及 NCHW vs NHWC 布局选择。
apache/tvm — 11 commits
Metal Cooperative Tensor 支持(#19423)
#c309e4 为 TVM 的 TIR 层添加了 Metal cooperative_tensor 的内建函数和存储作用域。Apple Metal 4 引入了 MetalPerformancePrimitives(MPP)的 matmul2d 操作,使用 cooperative_tensor 操作数。在 M5 芯片上,该操作路由至 NAX Tensor Core;在 M1-M4 上,回退到 simdgroup 矩阵指令。这是 TVM 在 Apple Silicon 上启用量化矩阵乘和 attention 计算的基础。
TFLite Frontend StableHLO 支持(#19536)
#c0406a 为 Relax TFLite 前端新增了 29 个 StableHLO builtin 算子支持,涵盖纯逐元素操作、元数据操作、形状操作、以及 STABLEHLO_GATHER 的子集。StableHLO 是 TFLite 的新中间表示格式,逐步取代 TFLite 传统的 operator codes。
ONNX Backend Test Suite 系统化覆盖(#19515)
#b4731854cc 引入了基于官方 ONNX Backend Test Suite 的自动化测试框架,用于系统验证 Relax ONNX importer 的正确性。此前的手写测试不到 200 个,而 ONNX 官方测试套件覆盖数百个算子组合,这是向完整 ONNX 兼容性迈出的重要一步。
ONNX Frontend 多项 Bug 修复
- Clip NaN 边界处理(#19535):当 ONNX Clip 的 min/max 为 NaN 时,将其替换为 +inf/-inf 以匹配 ONNX”无约束”语义,并在输出中保留输入的 NaN 值
- Gather 负索引归一化(#19525):ONNX Gather 允许负索引,但 Relax 的
take操作需要正索引,故在 converter 中插入归一化节点 - ScatterElements reduction(#19527):补全对
reduction属性的支持(add/mul/min/max),此前仅支持默认的”none” - NonMaxSuppression 默认值(#19547):将
max_output_boxes_per_class默认值设为 0,对齐 ONNX 规范
Bool Prod 修复(#19557)
#4b93f2060f1c 修复了布尔类型上 R.prod(乘积归约)的代码生成问题:布尔乘积具有逻辑与语义,不能通过 TIR Mul 在 LLVM codegen 中实现,需要改用 all() 归约。
CUDA Contrib 修复(#19539)
#19483 的头文件清理移除了 <tvm/runtime/logging.h> 的传递包含和 Array{...} 别名,导致六个 CUDA contrib 源码编译失败。#19539 补充了缺失的包含和 FFI 命名空间调整。
TFLite CONV_3D_TRANSPOSE 支持(#19530)
为 TFLite 前端添加了 3D 转置卷积的支持。3D 转置卷积在医学影像(CT/MRI 超分辨率)和视频生成任务中有重要应用,其权重布局为 DHWOI(Depth-Height-Width-Input-Output),与常规 3D Conv 不同。
mlc-ai/mlc-llm — 3 commits
TVM Runtime 重构适配(#3495、#3496)
MLC-LLM 本周的核心工作是适配 TVM 主线的 runtime/脚本重构。TVM 移除了若干公共头文件并重新命名了其内容:
- C++ include 路径更新为
tvm/ffi/和tvm/ir/ IntTuple重命名为ffi::Shape- 将
tvm::runtime的 re-export 替换为显式的using tvm::ffi::Object/... - 链接方式从
libtvm切换到libtvm_runtime
#3496 还修复了 GCC 11 拒绝 C++20 扩展的编译问题(在 engine_state.cc 中显式添加了 using tvm::ffi::GetRef)。
总结
本周各框架的发展方向体现了清晰的趋势:
BF16/FP4 低精度计算加速:ncnn 在 ARMv8.4 全线 BF16 优化、llama.cpp 的 NvFP4 LM Head、ONNX Runtime 的 2-bit LUT GEMM,均在持续推进更低精度的计算支持,以降低推理的内存带宽瓶颈。
推测解码和多模态推理深化:llama.cpp 的 MTP 支持和 Qwen3A 音频多模态、ORT-GenAI 的 Gemma4 多模态修复和 Qwen3.5 优化,表明端侧推理框架正在从纯文本 LLM 向视觉-语言-音频多模态统一推理演进。
新兴架构支持扩张:Executorch 的 RISC-V QEMU CI、ORT 的 RVV 卷积优化、TVM 的 Metal cooperative_tensor,都在为下一代终端芯片架构做准备。
安全性系统性加固:ONNX Runtime 连续多周持续加固算子安全边界(SafeInt、越界检查、Allocation 上限),反映了端侧推理在生产环境部署中对安全性的日益重视。
工具链和开发体验改进:llama.cpp 的 convert_hf_to_gguf 拆分、ORT 的模型 builder 去重优化、Executorch 的 CV 文档新增,都在降低开发者的使用门槛。
下周见!🦅