Cider:为什么 Apple Silicon 推理需要原生 INT8 激活量化

37 阅读6分钟

Cider:为什么 Apple Silicon 推理需要原生 INT8 激活量化

当 MLX 只做了一半量化,我们把另一半补上了。

背景:端侧 AI 的推理瓶颈

Apple Silicon 是目前最适合跑本地大模型的消费级硬件之一。统一内存架构让 72B 模型不再需要多卡互联,MLX 框架则提供了 PyTorch 级别的开发体验。

明略科技的 Mano-P 就是这条路线的产物——一个完全运行在本地 Mac 上的 AI Agent,72B 版本在 OSWorld 基准上拿到 58.2% 的成绩(当前第一),4B 轻量版在 M5 Pro 上也能跑到约 80 tok/s 的解码速度。数据不出本机,Apache 2.0 开源。

但即便硬件和模型都到位了,推理速度仍然是体验的硬约束。尤其是 prefill 阶段——处理长上下文、多轮对话历史、视觉输入时,这个阶段的延迟直接决定了用户感知的"反应速度"。

问题出在哪? MLX 目前的量化方案只做了"一半"。

MLX 量化的盲区

MLX 提供的量化选项是 W8A16 和 W4A16——权重被压缩了,但激活值(activations)始终保持 FP16。

这意味着:

  • 计算依然是 FP16 GEMM:权重在计算前被 dequantize 回 FP16,实际矩阵乘法还是 16-bit 浮点
  • 无法利用 INT8 TensorOps:Apple M5 芯片引入了专用的 INT8 矩阵运算单元(mpp::tensor_ops::matmul2d(16,32,16)),但 MLX 的量化路径完全没有触及这些硬件能力
  • 带宽节省有限:权重量化减少了内存占用,但 prefill 阶段是 compute-bound,真正需要的是计算加速

简单说:MLX 量化省了存储,没省计算。M5 的 INT8 硬件能力被浪费了。

Cider:补上另一半

Cider 是明略科技开源的推理加速 SDK,核心做的事情就一个:把激活值也量化到 INT8,让整个 GEMM 在 INT8 精度下完成

两种模式:

模式权重激活对比 MLX
W8A8INT8 对称INT8 per-tokenMLX 只有 W8A16
W4A8INT4 packedINT8 per-tokenMLX 只有 W4A16

技术实现上:

  • 通过 Metal 4 的 cooperative_tensor API 调用 M5 原生 INT8 TensorOps
  • 以 MLX custom primitives 方式构建,完全兼容 MLX 的 lazy evaluation 机制
  • prefill 阶段使用 INT8 GEMM,decode 阶段自动切换为 INT8 MV kernel

硬件要求:Apple M5 及以上(M4 会 fallback 到纯 Python 实现)。

性能数据

单算子延迟(M5 Pro)

矩阵形状 [N=10240, K=2560]:

MPC(ms)PG(ms)w8a16w4a16PC/w8PC/w4PG/w8PG/w4
10.27ms0.26ms0.26ms0.18ms0.96x0.67x0.99x0.69x
1280.34ms0.39ms0.49ms0.44ms1.43x1.28x1.26x1.13x
10241.23ms1.52ms2.24ms2.04ms1.82x1.66x1.47x1.34x
40964.41ms5.65ms8.12ms7.72ms1.84x1.75x1.44x1.37x
81928.71ms11.40ms16.23ms15.09ms1.86x1.73x1.42x1.32x

(PC = per-channel,PG = per-group)

矩阵形状 [N=2560, K=10240]:

MPC(ms)PG(ms)w8a16w4a16PC/w8PC/w4PG/w8PG/w4
10.25ms0.26ms0.26ms0.20ms1.03x0.78x0.98x0.75x
1280.39ms0.41ms0.55ms0.46ms1.43x1.19x1.35x1.12x
10241.31ms1.65ms2.35ms2.14ms1.80x1.64x1.43x1.30x
40965.37ms6.79ms8.54ms8.04ms1.59x1.50x1.26x1.18x
819210.97ms12.94ms17.28ms16.23ms1.58x1.48x1.34x1.25x

随着 M 增大,加速比稳步提升——更大的矩阵更能发挥 INT8 TensorOps 的吞吐优势。注意 M=1 时 per-channel MV kernel 略慢于 MLX W4A16(已知限制),但 M≥128 后优势即显现。

端到端 VLM 推理:Qwen3-VL-2B(M5 Pro)

Prompt TokensFP16 Prefill (tok/s)W8A16 Prefill (tok/s)W8A8 PC Prefill (tok/s)FP16 Decode (tok/s)W8A16 Decode (tok/s)W8A8 PC Decode (tok/s)
133430102065324270107104
23932868184729836997100
3455277717412796669095

端到端 VLM 推理:Qwen3-VL-4B(M5 Pro)

Prompt TokensFP16 Prefill (tok/s)W8A16 Prefill (tok/s)W8A8 PC Prefill (tok/s)FP16 Decode (tok/s)W8A16 Decode (tok/s)W8A8 PC Decode (tok/s)
1334188417862186325654
2393181517002028315552
3455175516031881305249

LLM 量化精度 vs 速度

Qwen3-8B:

量化方案wikitext2 PPL(↓)Prefill Time(s)(↓)Peak Memory(GB)(↓)
FP169.726179.918.93
W8A16 (mlx RTN)9.707221.312.07
W8A8 (per-channel)9.756123.511.32
W8A8 (per-group gs=64)9.744179.111.83
W8A8 (per-group gs=128)9.727165.811.61

Llama3-8B:

量化方案wikitext2 PPL(↓)Prefill Time(s)(↓)Peak Memory(GB)(↓)
FP166.138175.818.32
W8A16 (mlx RTN)6.147236.911.46
W8A8 (per-channel)6.271123.310.69
W8A8 (per-group gs=64)6.269178.711.19
W8A8 (per-group gs=128)6.270155.710.98

W8A8 per-channel 在两个模型上都实现了最快的 prefill 速度和最低的内存占用。PPL 增加极小(Qwen3-8B +0.049,Llama3-8B +0.124),精度损失可忽略。

W8A8 量化粒度选择指南

粒度大致加速比精度特点
Per-channel~1.8x最快,精度损失极小
Per-group gs=128~1.5x平衡选择
Per-group gs=64~1.3x最接近原始精度

开发者可根据场景在精度和速度之间权衡。

使用方式

Cider 的设计哲学是"最小侵入"——一行代码完成转换:

from cider import convert_model, is_available
model, proc = load("path/to/model")
if is_available():
    convert_model(model)

convert_model 会替换模型中所有 Linear 层为 Cider 的 INT8 实现。prefill 时走 INT8 GEMM,decode 时走 INT8 MV kernel,自动切换,无需手动干预。

Cider 同时提供了 OpenAI 兼容的 VLM 推理服务端,方便集成到现有工作流。

适用范围

需要强调的是:Cider 不是 Mano-P 的专属组件,而是通用的 MLX 模型加速基础设施

目前已验证支持的模型家族:

  • Qwen3 / Qwen3-VL
  • Llama3
  • 理论上所有基于 nn.Linear 的 MLX 模型都可以通过 convert_model 一键转换

条件编译:M5+ 获得完整 INT8 TensorOps 加速,M4 自动 fallback 到纯 Python 实现。

已知限制:M=1 时 per-channel MV kernel 比 MLX W4A16 慢;完整 INT8 加速仅限 M5+。

此外,Cider 还包含实验性的 ANE+GPU 异构张量并行方案(针对 M4 设备,同步流水线下可获得 3-16% 额外加速)。

总结

MLX 生态在权重量化上做得很好,但激活量化是缺失的一环。M5 的 INT8 TensorOps 是明确的硬件信号——Apple 在芯片层面已经为 INT8 推理铺好了路,软件层面需要跟上。

Cider 做的就是这件事:让 Apple Silicon 的 INT8 硬件能力不再被浪费。


GitHub: github.com/Mininglamp-…

如果你也在 Mac 上跑本地模型,欢迎体验并⭐️