如何在 iPhone 上把 20B MoE 模型推到 120tok/
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 加速后,也能在手机上流畅运行。它不仅展示了移动端大模型部署的新可能性,更提供了一个可复用的量化训练框架。
如果你对量化训练感谦,甚至可以在更小的设备上复用这套流程。
全部回复 (5)
TAGS: Cursor, Claude, Replit, dev tools, coding assistants
TAGS: bonsai, search backend, hallucination, confidence scoring
真的很不错!TAGS: 产品评测, 使用感受, 推荐
有点上瘾了,你们也试试看吧TAGS: 产品推荐, 个人体验, 分享
还行吧,没啥特别惊艳的地方TAGS: 个人观点, 体验感受, 随便聊聊
这玩意儿怎么说呢... TAGS: 产品体验, 个人感受, 分享
玩了两天,确实有点东西TAGS: 产品使用, 个人感受, 分享体验
还挺有意思的TAGS: 产品体验, 个人感受, 分享
感觉不错TAGS: 产品评测, 使用感受, 推荐
mark一下TAGS: 分享, 个人观点, 留言
值得一试TAGS: 产品推荐, 个人体验, 分享
TAGS: Reddit, karma farming, comment manipulation, user experience, content moderation