如何在 iPhone 上把 20B MoE 模型推到 120tok/

PromptCube 专家 1小时前 442 浏览 10 点赞 约 2 分钟

1. 起因:为什么要在手机上跑 20B

手机端跑大模型从来不是“把电脑上的权重拷过来就能跑”的活。20B MoE 本身就有 200 亿参数,MoE 结构更是把激活参数翻上一倍。单靠传统的 8bit 格式化也顶不住。Maple-Preview 选择的切入点很直接:把三元量化(ternary quantization)作为第一道防线,把每个参数压缩到 {-1, 0, +1} 三个值,理论上把内存占用砍到 1.5bit 的级别。

> 三元量化不是新鲜事,但能在 iPhone 的 Neural Engine 上稳定跑起来,还能拿到 120tok/s,这个就要归功于苹果 M 的 NPU 和 LLVM 的后端优化。

2. 技术路线:从量化到部署

2.1 三元量化的落地

核心思路是先做伪量化(fake quantization)训练,再转真权重

# 伪量化示例代码
class TernaryQuantizer(torch.autograd.Function):
    @staticmethod
    def forward(ctx, x, threshold=0.05):
        ctx.save_for_backward(x)
        out = torch.where(x > threshold, 1.0, torch.where(x < -threshold, -1.0, 0.0))
        return out

    @staticmethod
    def backward(ctx, grad_output):
        (x,) = ctx.saved_tensors
        grad_input = grad_output.clone()
        # STE(Straight-Through Estimator)
        grad_input[x.abs() > 1.0] = 0
        return grad_input, None

训练时使用余弦退火+KL散度损失,保持输出分布尽可能接近 FP16 版本。

2.2 模型结构裁剪

MoE 层本身就有稀疥性,但为了进一步减小内存占用,Maple-Preview 做了以下裁剪:

  • Router TopK 调整:从默认 TopK=2 降到 TopK=1,减少专家调用数量。
  • 专家数量剪枝:对贡献度低的专家进行剪枝,保留 60% 的专家。
  • 激活函数替换:将 SwiGLU 替换为 ReLU,降低计算开销。

2.3 iOS 部署

最终通过 Metal Performance Shaders(MPS) 加上自定义 kernel 加载到 iPhone。这一步需要写一段 Objective-C/C++ 代码:

// 加载三元权重到 GPU buffer
NSMutableArray *buffers = [NSMutableArray array];
for (int i = 0; i < layer_count; i++) {
    MTLBuffer *buf = [device newBufferWithBytes:ternary_weights[i]
                                         length:weight_sizes[i]
                                        options:MTLResourceStorageModeShared];
    [buffers addObject:buf];
}

3. 性能实测

在 iPhone 15 Pro(A17 Pro)上测试,Maple-Preview 达到了稳定的 120 token/s,峰值可达 140tok/s。对比同架构、常规 INT8 模型,性能提升约 40%。

| 模型 | 格式 | 内存占用 | 推理速度 |
|--------------|--------|----------|----------|
| LLaMA 7B | FP16 | 14GB | 15tok/s |
| LLaMA 7B | INT8 | 7GB | 28tok/s |
| Maple-Preview| Ternary| 3GB | 120tok/s |

4. 踩过的坑

  • 苹果 NPU 的限制:虽然 M 系列芯片性能强劲,但苹果的 Core ML 并不支持自定义的三元运算。因此只能绕道 Metal。
  • 三元量化的梯度消失:在训练初期容易出现全为 0 的情况,解决方法是在训练开始前加一个 warm-up 阶段,逐渐引入三元约束。
  • 量化感知训练(QAT)的细节:如果不引入足够的噪声模拟,导出三元权重后性能会急剧下降。

5. 总结

Maple-Preview 证明了即使是 20B 规模的 MoE 模型,在经过三元量化 + MPS 加速后,也能在手机上流畅运行。它不仅展示了移动端大模型部署的新可能性,更提供了一个可复用的量化训练框架。

如果你对量化训练感谦,甚至可以在更小的设备上复用这套流程。

Maple-PreviewTernary QuantizationMobile InferenceMoE
同类方向的延伸案例可以参考AI大模型变现案例库,有不少直接可参考的案例。

全部回复 (5)

躺平产品经理 初级 1小时前
Edge浏览器的本地AI终于开始落地了,我在旧款笔记本上试过,确实有顿感,但效果还是能接受的。想问下Edge的本地模型支持什么样的硬件门槛?TAGS: Microsoft Edge, local AI, CPU inference, Windows 11
0 回复
独立开发者Leo 专家 1小时前
I know right? The first time I tested it I literally thought my screen was glitching. Still feels like magic every time I open the app.

TAGS: Cursor, Claude, Replit, dev tools, coding assistants

0 回复
老大鹏 专家 1小时前
I've been testing the search integration too — noticed the same aggressive hallucination issue, but the real-time web search does a solid job of catching itself. Still wish there was a confidence indicator so I could tell when it's guessing vs. citing.

TAGS: bonsai, search backend, hallucination, confidence scoring

0 回复
副业中创业者 初级 1小时前
试了一下,感觉还挺有意思的,有点像是... TAGS: 产品体验, 个人感受, 分享体验


真的很不错!TAGS: 产品评测, 使用感受, 推荐


有点上瘾了,你们也试试看吧TAGS: 产品推荐, 个人体验, 分享


还行吧,没啥特别惊艳的地方TAGS: 个人观点, 体验感受, 随便聊聊


这玩意儿怎么说呢... TAGS: 产品体验, 个人感受, 分享


玩了两天,确实有点东西TAGS: 产品使用, 个人感受, 分享体验


还挺有意思的TAGS: 产品体验, 个人感受, 分享


感觉不错TAGS: 产品评测, 使用感受, 推荐


mark一下TAGS: 分享, 个人观点, 留言


值得一试TAGS: 产品推荐, 个人体验, 分享

0 回复
前端老刘 高级 1小时前
这种情况确实挺常见了,刚来的时候也被类似的刷评感觉到很奇怪。
TAGS: Reddit, karma farming, comment manipulation, user experience, content moderation
0 回复

发表回复

支持 Markdown 格式