一句话摘要
本地 LLM 提速的有效修复
我的本地 LLM 比它本该有的速度慢了 20 倍。以下是每一个真正起作用的修复: July 19, 2026 · 阅读时长 12 分钟 · 查看来源 ↗ 硬件 AI Quant 营销
我在一块消费级 GPU 上花了 6 个月优化本地推理。试遍了每一个 flag、每一种量化格式、每一个 Reddit 上的土办法。其中大多数毫无作用。少数几个让我的速度翻倍甚至三倍。有一个我忽略了好几个月的设置,从头到尾都在让我损失 3 倍的性能。
这不是参考手册,而是一份排好序的清单:先修什么、后修什么、什么直接跳过。它建立在真实硬件上的真实基准测试之上。如果你的本地模型感觉很慢,其中一个多半就是原因。
我会在它变成常识之前,先把 alpha 发出来。如果你对本地 AI、自托管、以及那些等到上了你的时间线就已经太晚的东西感兴趣,关注我:@MPxbt
唯一重要的那个数字
在动任何东西之前:你真正该关心的指标是 TG(token 生成速度)。也就是模型读完你的提示词之后,输出文本的速度。它是你坐在那里干等时,切身体会到的东西。
这篇文章里的所有优化,都用它对 TG 的影响来衡量。有些优化影响的是提示词处理(PP)或首 token 时间(TTFT)而不是 TG。我会把它们标出来。但如果我说「这个给了我 +30%」,我指的是 TG 提升了 30%。
这是人类体感的分级:
- < 5 tok/s —— 痛苦。你会关掉标签页。
- 5-10 tok/s —— 能用。大约是人类的阅读速度。
- 10-20 tok/s —— 舒适。交互式聊天感觉正常。
- 20-40 tok/s —— 快。编程 agent 感觉很跟手。
- 40+ tok/s —— 即时。你会忘记它是本地跑的。
我在一块 RTX 4070(12GB)上的基线,是在一个 30B 的 MoE 模型上大约 12 tok/s。做完下面所有优化之后,同样的模型、同样的硬件,根据所用的技术,能达到 40-100 tok/s。同样的 GPU,同样的模型,只是配置不同。
第一档:那些像作弊一样的修复
这些是那种你改一个设置、数字就跳得如此猛烈、以至于你以为哪里坏了的优化。
修复 #1:你的内存很可能只在半速运行
这是让我损失了好几个月的那个。
大多数主板出厂时,内存默认运行在 JEDEC 基准速度,只是你内存条标称速度的一个零头。如果你买了 DDR5-6000 的内存却从没进过 BIOS,它很可能正跑在 DDR5-4800。你花钱买了一条高速公路,却一直在学区限速里开车。
对于 MoE 模型(Qwen3、DeepSeek、gpt-oss,基本上就是现在统治开源界的那类架构),专家权重在每一个 token 上都要从系统内存里流出来。内存带宽就是瓶颈。内存越慢,生成速度就成比例地越慢。
修复方法:进 BIOS,开启 XMP(Intel)或 EXPO(AMD)。一个开关。重启。
我的结果:TG 从大约预期的 1/3 提到了全速。在一个 120B 的 MoE 模型上,那就是「勉强能用」和「舒适」之间的区别。
不用重启就能检查的办法:
```
bashsudo dmidecode -t memory | grep -E "Speed|Configured"
```
如果「Configured Memory Speed」低于你内存的标称速度,那你就是在白白丢掉性能。在你动任何一个 llama.cpp flag 之前,先修这个。
修复 #2:投机解码(MTP)
这是目前可用的最大单项提速倍率——如果你的模型支持它的话。
用 Multi-Token Prediction 头训练的模型(Gemma 4、Qwen 3.6,以及更多正在来的)会带一个小型配套草稿模型。草稿模型提前猜出几个 token,主模型在一次通过里验证它们。当猜得准的时候,你用一次计算的开销得到多个 token。
RTX 4070 12GB 上的真实数字:
- Gemma 4 26B 基线:38.5 tok/s
- Gemma 4 26B 开 MTP:100.6 tok/s(2.6× 提速)
- Gemma 4 12B 开 MTP:120.8 tok/s(2.0× 提速)
这不是打错字。同样的模型、同样的 GPU、同样的量化,只是打开了投机解码。
llama.cpp 里的配置:
```
llama-server \
-m model.gguf \
--spec-draft-model mtp-companion.gguf \
--spec-type draft-mtp \
--spec-draft-n-max 2
```
没人警告过你的那个坑:MTP 有两份独立的 KV cache——一份给目标模型,一份给草稿模型。量化目标 cache(通常能省显存、也很好用)在有些模型上会把草稿接受率打到几乎为零。Gemma 4 需要 f16 的目标 KV 才能把接受率保持在 70% 以上。永远要对接受率做基准测试,而不只是看裸 TG。
修复 #3:你跑在了错误的核上
如果你的 CPU 是第 12 代及以上的 Intel,它有两类核:性能核(P-core)和能效核(E-core)。E-core 在矩阵运算上慢 20-30%。默认情况下,操作系统会把工作调度到所有核上。
对于每个 token 都要靠 CPU 处理专家计算的 MoE 模型来说,E-core 是在实打实地拖你后腿。
修复方法:
```
# 只固定到 P-core(i5-12600K 的例子:核 0-11 是 P-core)
taskset -c 0-11 llama-server ...
```
我的结果:TG +25%。立竿见影。零代价。
第二档:那些会累积起来的 15-20% 增益
修复 #4:换到 Linux(或者把 Windows 调好)
Linux 的推理吞吐比 Windows 好大约 15-20%。CUDA 驱动开销更精简、持续负载下的调度更好、内存直接可控。
如果没法双系统,至少在 Windows 上做这些:
- 电源计划 → 「卓越性能」
- NVIDIA 控制面板 → 电源管理 → 「最高性能优先」
- WSL2 可以接受,但虚拟化会带来一些显存开销
在 Linux 上有个阴险的陷阱:power-profiles-daemon(KDE 和 GNOME 都自带)可能在硬件层面悄悄给你的 CPU 降频。在 sysfs 里一切看起来都正常。governor 显示「performance」,频率看起来也对。但 TG 却跑在预期之下 20-30%。而且每次重启之间还会变化。
修复方法:
```
# 用 tuned 换掉那个坏掉的守护进程
sudo apt install tuned # Ubuntu/Debian
sudo systemctl enable --now tuned
sudo tuned-adm profile throughput-performance
```
修复 #5:让 llama.cpp 自己决定层的放置
对于那些没法完全装进显存的 MoE 模型,问题是:哪些层放 GPU,哪些层放 CPU?搞错了,要么显存闲置,要么会话中途 OOM 崩溃。
别手动调。用 --fit on:
```
llama-server \
-m model.gguf \
--fit on \
--fit-ctx 65536 \
--fit-target 512
```
这会在启动时探测你的空闲显存,自动算出最优放置。--fit-target 512 留出 512MB 余量。这一点很重要,因为 CUDA 内存会随着上下文填充而增长,一个在短测试里能跑的紧贴合配置,会在真实对话里 OOM。
对于稳定的生产配置,先跑一次 llama-fit-params 拿到精确的 flags,然后把它们硬编码进去。
修复 #6:量化你的 KV cache
KV cache 存储所有上下文 token 的注意力状态。在 64k 上下文、f16 精度下,它要吃掉约 4GB 显存。在一张 12GB 的卡上,那占了你总预算的三分之一。
换成 q8_0 就能把它砍半,质量损失实际为零:
```
-ctk q8_0 -ctv q8_0
```
省出来的显存让 --fit 能在 GPU 上多放 1-2 层,这直接转化为更高的 TG。在 Qwen3-Coder-Next 上,这给我带来了 +2 tok/s。不是 cache 本身变快了,而是省出来的内存换来的额外 GPU 层带来的。
修复 #7:无头模式
如果你的推理机是一台专用服务器(不是你的日用机),杀掉桌面环境:
```
sudo systemctl isolate multi-user.target
```
这会释放 200-400MB 内存,外加合成器占用的那部分显存。在 TTY 里用 zellij 做终端分屏。
要拿回桌面:sudo systemctl isolate graphical.target
修复 #8:通过 iGPU 走显示输出
如果你的主板有 HDMI/DisplayPort 输出(Intel iGPU),把显示器插在那里,而不是插在显卡上。独立显卡就不再为桌面合成保留 500-1000MB。这些显存现在可以用来放模型权重了。
第三档:在规模下才重要的那些细节
修复 #9:从源码构建 llama.cpp
发行版软件包都过时了。Ollama 内部用 llama.cpp,却把每一个调优旋钮都藏了起来。MoE 推理内核每次发布都有可测量的改进。
```
git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON \
-DGGML_NATIVE=ON -DGGML_LTO=ON \
-DGGML_CUDA_GRAPHS=ON -DGGML_CUDA_FA=ON \
-DGGML_CUDA_FA_ALL_QUANTS=ON \
-DCMAKE_CUDA_ARCHITECTURES=89 # RTX 40 系;查一下你自己的
cmake --build . --config Release --parallel
```
定期重新构建。上游一次提交就能让你的模型 + tok/s。
修复 #10:用 --no-mmap 和 --mlock
不加 --no-mmap 的话,模型权重通过内存映射 I/O 惰性加载。每一个冷页都会触发一次 page fault。对于专家访问模式不连续的 MoE 模型来说,这会给每个 token 增加延迟抖动。
--no-mmap 把整个模型提前加载进内存。启动更慢,生成更稳。
--mlock 防止操作系统在内存压力下把那些页换出去。在 vm.swappiness 较高的系统上至关重要(很多发行版默认 60+)。
```
llama-server -m model.gguf --no-mmap --mlock ...
```
修复 #11:Flash attention。打开就完了
```
--flash-attn on
```
减少注意力内存流量,避免物化完整的注意力矩阵。长上下文稳定推理的必备项。在 CUDA 上没有实质性的坏处。永远开启。
修复 #12:单用户设置用 --parallel 1
每个并行槽位都维护自己的 KV cache。--parallel 4 就是 4 倍的 KV 显存。如果你只有一个用户,那就是本可以放模型层的浪费内存。
在 gpt-oss-120b 上,从 --parallel 4 降到 --parallel 1 释放了约 540MB 显存,够多放一层 GPU 并 +1 tok/s。
量化决策树
这正是人们花几个小时刷 Reddit 帖子的地方。这里是捷径:
用能装得下的最高量化。这就是规则。其他都是细节。
你的配置能扛住 Q5_K_XL / UD-Q5_K_XL 吗?→ 用它
太大了?→ 降到 Q4_K_M 或 UD-Q4_K_XL
模型提供 QAT Q4?→ 先试 QAT。它是为 4-bit 专门训练过的
还是太大?→ IQ3 系列变体,但要在你的工作负载上测试
QAT(量化感知训练)是低比特宽度下的规则改变者。标准的训练后量化只是把权重四舍五入、然后祈祷好运。QAT 在训练时就把舍入噪声烤进模型里,于是权重学会了去补偿。一个 QAT Q4 模型的行为可以接近 Q8,而不是接近普通的 Q4。
Unsloth 的动态量化把敏感张量保持在高精度,把容易的张量压得更低。在相同平均大小下,往往能打败均匀量化。
那个陷阱:一个在困惑度基准上赢了的量化,仍然可能在你实际的工作负载上失败。基于 Wiki 的困惑度、编程基准、以及「它在 64k 上下文下还能保持连贯吗」是三个不同的测试。一个量化只有在你实际跑的那个任务里活下来,才算「赢」。
该跳过什么
这些我都测过了,省得你浪费一个下午:
--poll 调优:在 CPU+GPU 混合推理下,所有取值都拉平了。GPU 内核执行占主导。保持默认。
单路系统上的 --numa:没用。只有一个内存节点。用 taskset 做亲和性。
GGML_CUDA_FORCE_CUBLAS:强制用 cuBLAS 替代 llama.cpp 的原生内核。在消费级卡上测过:更慢。cuBLAS 是为数据中心批量大小优化的,不是为单用户解码。跳过。
纠结 --ubatch-size:默认 512 对大多数配置都够用。扫一遍也许能在你特定的提示形状上多找出几个百分点,但把它放到最后做,别第一个做。从 512 开始,只有当你把上面这些都榨干了再去扫。
不做基准就开 n-gram 投机解码:对重复性代码会话有前景,但接受率波动极大。别盲目开。先测,只有当端到端循环时间确实改善时才保留。
诊断速查表
在开始优化之前,先跑这个。一半的情况下,问题出在下面其中一条:
```
# 你的内存跑在满速吗?
sudo dmidecode -t memory | grep -E "Speed|Configured"
# CPU governor 设为 performance 了吗?
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# EPP 也设为 performance 了吗?(光有 governor 不够)
cat /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference
# P-core 接近最高睿频了吗?
grep "cpu MHz" /proc/cpuinfo | sort -rn | head -6
# 还有多少显存空闲?
nvidia-smi | grep MiB
# 有东西在 swap 吗?
cat /proc/vmstat | grep -E "pswpin|pswpout"
# 什么在吃 CPU?
ps aux --sort=-%cpu | head -10
# 激活的是哪个电源配置?
sudo tuned-adm active
```
如果这里面任何一条不对,在动 llama.cpp flags 之前先修它。我见过有人花好几天调层的放置,而他们的内存从头到尾都在 JEDEC 基准速度上跑。
完整的启动命令
下面是在一张 12GB 卡上、跑一个 MoE 模型时,一个完全优化过的单用户设置长什么样:
```
taskset -c 0-11 llama-server \
-m model.gguf \
--fit on --fit-ctx 65536 --fit-target 512 \
-ctk q8_0 -ctv q8_0 \
--flash-attn on \
--batch-size 1024 --ubatch-size 512 \
--threads 10 --threads-batch 12 \
--parallel 1 \
--no-mmap --mlock \
--prio 2 \
--no-warmup
```
如果模型支持 MTP,再加上投机解码:
```
--spec-draft-model mtp-companion.gguf \
--spec-type draft-mtp \
--spec-draft-n-max 2
```
就这些。这篇文章里的所有优化,一条命令。
诚实的总结
这里是完整清单,按影响排序,附带我 RTX 4070 12GB 上的真实数字:
```
# Fix Impact on TG
────────────────────────────────────────────────────────────────────────
1 Enable XMP/EXPO in BIOS up to 2-3× (if it was off)
2 MTP speculative decoding 2.0-2.6×
3 QAT quants instead of PTQ major quality at same VRAM
4 Switch to Linux ~15-20%
5 Fix power-profiles-daemon eliminates 20-30% random drops
6 Pin to P-cores (taskset) +20-30% on Intel hybrid
7 --fit on (auto layer placement) major TG vs bad manual placement
8 KV cache q8_0 frees VRAM → more GPU layers
9 Build llama.cpp from source cumulative per release
10 --no-mmap + --mlock eliminates TG jitter
11 --flash-attn on required for long context
12 --parallel 1 frees KV VRAM
13 Headless mode frees 200-400MB RAM + VRAM
14 iGPU for display frees 500-1000MB VRAM
```
修复 #1 和 #2 合起来,能让你在同样的硬件上从 12 tok/s 到 100 tok/s。其余的都是增量。但增量会累积起来。而在一台你 7×24 小时都在跑的机器上,每一个 tok/s 都会复利成省下来的小时。
从最上面开始,往下做,做到你满意为止。
如果你觉得有用,请点赞并分享给你的朋友。我深挖本地 AI 配置、自托管,以及那些在进入主流之前真正能改变局面的东西。alpha 就在这里。
标签:# X # 硬件 # AI # Quant # 营销 # 增长 # 指南 相关文章 OpenClaw:一月份爆红的那个人 AI Agent,却没人解释怎么装 OpenClaw:一月份爆红的那个人 AI Agent,却没人解释怎么装 AI 营销 Claude 硬件 如何在不做交易员的情况下靠永续 DEX 谋生 ETH 涨 20%?你做多赚 $2k,做空亏 $2k。ETH 跌 20%?反过来一样。净结果:什么都没有。你是平的。这就是「delta neutral」的含义。 加密 营销 AI Quant 大语言模型到底是怎么工作的 「奖杯放不进箱子里,因为它太大了。」 营销 AI Loops 硬件
原文参考:https://maxed.wiki/posts/my-local-llm-was-20-slower-than-it-should-have-been-here-s-every-fix-that-actually-mattered/ (Maxed.wiki,本页为站内中文整理)