端侧推理部署实践
端侧推理将大模型部署到手机、IoT 设备和浏览器等边缘终端,实现低延迟、离线可用和隐私保护。本文介绍端侧推理的关键技术和部署实践。
端侧推理挑战
| 挑战 | 典型约束 | 解决方向 |
|---|---|---|
| 内存 | 手机 4-8GB | 激进量化 + 模型裁剪 |
| 算力 | 手机 NPU 10-30 TOPS | 算子优化 + 稀疏化 |
| 存储 | App < 500MB | 模型压缩 + 按需下载 |
| 电池 | 功耗 < 3W | 算力调度 + 量化 |
量化与压缩
端侧部署需要最激进的量化:
python
# 使用 llama.cpp 转换为 GGUF Q4 量化
# python convert_hf_to_gguf.py \
# models/phi-2 \
# --outtype q4_K_M \
# --outfile phi-2-q4km.gguf
# MLC-LLM 编译为手机目标
# mlc_llm compile \
# --model microsoft/phi-2 \
# --quantization q4f16_1 \
# --target iphone \
# --max-seq-len 2048 \
# -o dist/phi-2-ios/移动端部署
iOS 部署
python
# MLC-LLM iOS 集成
# 1. 编译模型
# mlc_llm compile --model phi-2 --quantization q4f16_1 --target iphone
# 2. 构建 iOS App
# mlc_llm build --target iphone --model phi-2
# 3. Swift 调用
"""
import MLCEngine
let engine = MLCEngine(model: "phi-2-q4f16_1")
let response = engine.generate(prompt: "解释机器学习", maxTokens: 128)
"""Android 部署
python
# 使用 MLC-LLM Android 部署
# 1. 编译模型
# mlc_llm compile --model phi-2 --quantization q4f16_1 --target android
# 2. Java/Kotlin 调用
"""
val engine = MLCEngine(model = "phi-2-q4f16_1")
val response = engine.generate("解释机器学习", maxTokens = 128)
"""浏览器部署
WebGPU 后端支持在浏览器中运行模型:
javascript
// WebLLM 浏览器推理
import { CreateMLCEngine } from "@mlc-ai/web-llm";
const engine = await CreateMLCEngine(
"Phi-3.5-mini-instruct-q4f16_1-MLC",
{ initProgressCallback: (progress) => console.log(progress) }
);
const reply = await engine.chat.completions.create({
messages: [{ role: "user", content: "解释深度学习" }],
max_tokens: 128,
temperature: 0.7,
});
console.log(reply.choices[0].message.content);WebGPU 性能
在 Chrome 中,Phi-2 (Q4) 模型在 M1 MacBook 上可达 15-20 tok/s,在高端 Android 手机上约 5-8 tok/s。Safari 对 WebGPU 支持有限。
模型选择建议
| 设备 | 推荐模型 | 量化 | 速度 |
|---|---|---|---|
| iPhone 15 Pro | Phi-2 (2.7B) | Q4_K_M | 15-20 tok/s |
| Android 旗舰 | Qwen2-1.5B | Q4_K_M | 10-15 tok/s |
| 浏览器 (M1) | Phi-2 (2.7B) | Q4F16 | 15-20 tok/s |
| IoT 设备 | TinyLlama-1.1B | Q4_K_M | 3-5 tok/s |
首次加载时间
端侧模型首次加载需要从存储读取权重到内存,可能需要 2-5 秒。建议在 App 启动时预加载模型,或使用后台加载策略。