localaiforum
登录
指南 › 硬件

仅用 CPU 运行

纯 CPU 推理是可行的,而且数字不像传说那么沮丧——只要你明白这是与 GPU 解码相同的带宽游戏,只是管道是十分之一。一台双通道 DDR5 的现代台式机有 ~80–100 GB/s 内存带宽。那是你的全部预算;CPU 核心本身改变不了多少。

公式算一遍

decode tok/s ≈ effective bandwidth (GB/s) ÷ model size (GB)

双通道 DDR5-5600 纸面 ~90 GB/s;核心和预取器拿走份额后算 60–80 GB/s 有效。8B Q4 模型约 5 GB,所以:

90 GB/s ÷ 5 GB ≈ 18 tok/s 理论上限 → 实际 8–14 tok/s。

这不是 bug——这是大型独立 GPU 用的同样算术,带宽是十分之一。

按硬件的预期

平台 大致带宽 8B Q4 解码 感觉
笔记本,DDR4 双通道 40–50 GB/s 5–8 tok/s 可读,启动慢
笔记本,DDR5 双通道 60–80 GB/s 8–12 tok/s 可用聊天
台式机,DDR5 双通道 80–100 GB/s 10–16 tok/s ≤8B 时愉快
Threadripper/EPYC,四通道以上 200–460 GB/s 30–80 tok/s 真的好
双路服务器 400+ GB/s 60–100 tok/s 几乎是内存 GPU

双通道台式机上的舒适档位:

  • 愉快:10+ tok/s 的 7–8B Q4 聊天和代码帮手。
  • 可用:~5–8 tok/s 的 13–14B Q4。要等,不是永远。
  • 耐心:~2–4 tok/s 的 24–32B Q4。过夜批处理,不是聊天。
  • 别:双通道上低于 1 tok/s 的 70B Q4。只限四通道工作站,即便那样也要三思。

逃生舱:部分卸载

如果有一块小 GPU,llama.cpp 会在 CPU 和 GPU 之间切分层——比如 8 GB 卡上 32 层放 20 层。驻留 GPU 的部分按显存带宽跑,其余按内存带宽,所以速度落在两个极端之间。当权重哪里都装不下整份时它胜过任一纯模式,也胜过看着“全 GPU 卸载”在共享内存里颠簸。

预填充才是真正的痛

解码得到所有关注,但 CPU 疼在预填充:它是算力瓶颈,而台式 CPU 的 FLOPs 只有 GPU 的零头。8B 模型上一个 4,000 词元的提示词可能在第一个词元出现前花掉几十秒。带大注入上下文的 RAG 式流水线每个请求都要付这笔钱。缓解:提示词保持短、给批预填充比解码更多的线程、把索引当作一次性成本(见 RAG)。

实用标志

# 解码线程数 = 物理核心;批预填充也可用逻辑核心
llama-server -m qwen2.5-7b-instruct-q4_k_m.gguf -c 8192 -t 8 --threads-batch 16

# 多路机器:跨 NUMA 节点交错内存
numactl --interleave=all ./llama-server -m model.gguf -t 32

# 这颗 CPU 有哪些 SIMD?AVX2 是底线;AVX-512 助预填充
lscpu | grep -o 'avx[0-9a-z_]*' | sort -u
  • -t 设为物理核心通常胜过逻辑/SMT 数;在你的机器上两者都测,交叉点随工作负载而异。
  • AVX2 是所有地方的基线;AVX-512(Zen 4/5、近期 Xeon)带来真实的预填充收益。llama.cpp 在构建时检测支持。
  • 多路机器上 NUMA 绑定可值 20%+——远端插槽上的内存是慢内存。
  • 笔记本 DDR4 的带宽约为台式 DDR5 的一半。同一公式、更差的常数:台式机给 12 的地方预期 5–8 tok/s。

CPU-only 何时真是正确答案

  • 嵌入和 RAG 索引——吞吐重要、延迟不重要;通宵跑几小时的分块嵌入不花什么。
  • 脚本里的小模型——0.5–3B 分类器、抽取器、重排序器即使在 CPU 上也以几十毫秒作答。
  • 批量后台任务——你睡觉时以 3 tok/s 摘要积压;没人在看流。
  • 买前试用——在投入 GPU 购买之前验证一个模型家族到底行不行。

如果目标是交互式聊天且任何 GPU 可用,把模型放那儿。用 首次运行 今天就跑起来,用 速度 理解你看到的数字是什么意思。

相关: 首次运行 · 速度 · RAG