GPU 层数与线程数——手机本地推理的性能关键
llama.cpp 的核心加速思路
llama.cpp 在移动设备上的加速主要靠两点:
- GPU offload:把模型的部分计算层交给 GPU(iOS Metal / Android Vulkan)
- CPU 多线程:在 CPU 上并行处理剩余计算
num_gpu_layers
这个参数决定多少层模型权重在 GPU 上计算。
| 设为 | 含义 |
|---|---|
| 0 | 全部跑在 CPU,兼容性最好但速度最慢 |
| 正数 N | 前 N 层跑 GPU,其余跑 CPU |
| -1 | 自动:llama.cpp 尝试能放多少就放多少(推荐) |
怎么选
- 新手:保持默认(通常是 -1 自动),跑一次 Benchmark 看速度
- GPU 报错 / 闪退:设小一点,比如 20 或 30,或者直接设 0 纯 CPU 跑
- 想要极致性能:设 -1 自动就够了,手动调通常不会比自动好太多
iOS vs 安卓的差异
iOS 设备统一使用 Apple Metal API,GPU offload 相对稳定。安卓需要 Vulkan 支持,部分老设备或定制 ROM 可能 GPU offload 效果不好甚至完全不可用。
num_threads
CPU 线程数。设成设备的物理核心数比较好。
| 设备 | 建议线程数 |
|---|---|
| 4 核老机型 | 4 |
| 6~8 核主流机型 | 6~8 |
| 10+ 核旗舰 | 8(别设太高,边际收益递减) |
注意过热
把线程数拉满会让 CPU 跑满,手机发热很快。如果发现手机明显发烫、甚至降频,可以把线程数减到核心数的一半。
实战调优流程
- 先跑一次基准测试,记录当前 num_gpu_layers=-1、默认线程数下的速度
- 如果 iOS 上速度慢,检查 GPU offload 是否真的生效(设置里通常有显示)
- 如果安卓上 GPU offload 不生效,改用纯 CPU 线程数调优
- 每次只改一个参数,跑 Benchmark 看变化,避免多变量干扰