增长案例库 Maxed 归档 综合AI自动化

我的本地 LLM 慢了 20 倍——这是真正起效的每个修复

MY LOCAL LLM WAS 20× SLOWER THAN IT SHOULD HAVE BEEN. HERE'S EVERY FIX THAT ACTUALLY MATTERED:

中文译文 · 14k 字

一句话摘要

本地 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,本页为站内中文整理)