8B 干翻 30B?InternLM3 推理速度实测
同一张 RTX 4060 Ti 16GB 上,InternLM3-8B-Instruct Q4_K_M 的生成速度是 30 t/s(t/s 指每秒生成的 Token 数,是本地推理的核心速度指标),而 Qwen3-30B-A3B Q4_K_M 在同一张卡上只有 11 t/s。8B 比 30B 快了近 3 倍——不是 30B 不行,是 16GB 显存装不下它的权重。
本文在 16GB 与 24GB 两种显卡上实测 InternLM3-8B 的推理速度,与 30B 级 MoE 模型直接对比,回答”什么场景选什么模型”。
测试环境
两张消费级显卡。第一张是 RTX 4060 Ti 16GB(16GB 显存,显存带宽 5GB/s),代表主流 16GB 装机;第二张是 RTX 3090(24GB 显存,显存带宽接近 1TB/s),代表 24GB 装机。CPU 都是主流 6 到 8 核处理器,配 5GB DDR5 内存——CPU 性能直接决定 30B 模型混合推理的上限。
推理框架用 llama.cpp 当前版本。llama.cpp 是高性能本地推理框架,原生支持 GGUF 格式。GGUF 是本地部署通用的模型文件格式,llama.cpp、Ollama、MLX 都能直接加载。
两个模型都用 Q4_K_M 量化版。Q4_K_M 是 4 比特量化档位,用一点精度换小得多的文件,是本地部署的默认推荐。
被测模型是 InternLM3-8B-Instruct,InternLM3 开源的 80 亿参数指令模型。
对比模型是 Qwen3-30B-A3B-Instruct-2507,总参数 30B 的 MoE(Mixture of Experts,混合专家)模型。MoE 把前馈网络拆成大量专家,每个 Token 只激活其中一部分;Qwen3-30B-A3B 每个 Token 只激活约 3B 参数,名字里的 A3B 指的就是这个。
显存预算:8B 在 16GB 卡上很宽裕
先算清楚 InternLM3-8B 到底占多少显存。Q4_K_M 量化后权重 5GB,加 1.5GB 系统开销,再加 KV Cache(存放注意力中间结果,大小随上下文长度增长)。
| 上下文 | KV Cache | 总占用 | 6.5 GB 卡剩余 |
|---|---|---|---|
| 4K | 0.2GB | 6.7GB | 9.3GB |
| 8K | 0.4GB | 6.9GB | 9.1GB |
| 16K | 0.8GB | 7.3GB | 8.7GB |
| 32K | 1.6GB | 8.1GB | 7.9GB |
32K 上下文下总占用 8.1GB,16GB 卡还剩 15.9 GB。本文测到的所有上下文长度里,8B 在 16GB 卡上都是完整运行,不需要任何卸载技巧。
16GB 卡:8B 完胜
测试方法固定:一段 512 Token 的中文提示词,测提示词处理速度和首 Token 延迟(输入到吐出第一个 Token 的时间),再连续生成 256 个 Token 测生成速度。下表数字全部出自同一张卡。
InternLM3-8B 用全量 GPU 卸载(卸载即把模型层挪到 GPU 上运行):
./llama-cli -m internlm3-8b-instruct-Q4_K_M.gguf \
-ngl 999 -c 4096 -n 256
-ngl 999 表示全部层进 GPU,-c 4096 设定上下文长度,-n 256 是生成 Token 数。
Qwen3-30B-A3B 做不到这一点。它的 Q4_K_M 权重无法完整装入 16GB 显存,一部分层只能留在系统内存里由 CPU 计算。llama.cpp 官方支持这种 CPU+GPU 混合推理模式,用途正是部分加速超出总显存容量的模型:
./llama-cli -m qwen3-30b-a3b-instruct-2507-Q4_K_M.gguf \
-ngl 15 -c 4096 -n 256
这份配置把 15 层放进 GPU,其余层由 CPU 计算。实测结果:
| 指标 | InternLM3-8B | Qwen3-30B-A3B |
|---|---|---|
| 卸载方式 | 全部层进 GPU | 约三成层进 GPU,其余在 CPU |
| 生成速度(4K 上下文) | 30 t/s | 11 t/s |
| 提示词处理速度 | 约 50 t/s | 约 28 t/s |
| 首 Token 延迟(512 输入) | 约 10s | 约 17s |
| 安全上下文长度 | 32K(实测) | 4K |
| 显存占用(4K / 32K) | 6.7GB / 8.1GB | 权重无法完整装入 16GB 显存 |
生成速度 8B 快 2.7 倍,首 Token 延迟快 1.7 倍。
这里有个坑。我一开始给 30B 配的是 -ngl 999,上下文也设了 32K,加载直接失败——权重加上 32K 上下文的 KV Cache 再叠系统开销,远超 1.5 GB。后来把上下文降到 4K、GPU 层数调到 15 层才跑起来。也就是说:16GB 卡想跑 30B 级模型,得先接受 4K 上下文这个前提。
我还试了 Q2_K 量化。它能完整装进显存,生成速度升到约 31 t/s,和 8B 打平。但 2 比特量化的精度损失明显,知识类问答的答非所问率肉眼可见地上升,不适合真实使用。想让 30B 跑出 8B 的速度,得把精度降到 2 比特——这不是免费的午餐。
为什么 30B 反而慢
核心差异一句话:30B 的权重装不下。
先纠正一个常见误区。”30B 只激活 3B,小显存应该也装得下”——这是错的。MoE 模型推理时,全部专家权重必须完整加载进内存,稀疏激活只降低计算量,不降低内存占用。16GB 卡上,30B 只有 15 层能进 GPU,其余层全在 CPU 上。
每个 Token 都要等 CPU 把这些层算完。CPU 的整数算力比 GPU 低一个量级以上,等的时间就是损失的速度。
再看 8B 这边。4060 Ti 16GB 显存带宽 5GB/s,8B 是稠密模型,每个 Token 都要读一遍完整 5GB 权重,理论上限约 57 t/s。实测 30 t/s 已是上限的过半,这张卡上的 8B 基本在满负荷跑。
32K 长上下文:8B 的优势主场
16GB 卡上,8B 在 32K 上下文的生成速度是 25 t/s,比 4K 时降了 17%。原因是 KV Cache:32K 时它涨到 1.6GB,注意力计算量随之增加。总占用 8.1GB,剩余 7.9GB,依然宽裕。
想留更多余量,可以把 KV Cache 量化到 8 比特:
./llama-cli -m internlm3-8b-instruct-Q4_K_M.gguf \
-ngl 999 -c 32768 -n 256 -ctk q8_0 -ctv q8_0
-ctk 和 -ctv 把 KV Cache 的 K、V 量化到 8 比特,32K 的 KV Cache 体积约减半。16GB 卡上的 8B 就能进一步去试 64K 上下文。
24GB 卡:反转
换到 24GB 卡,故事变了。Qwen3-30B-A3B 的 Q4_K_M 权重可以完整驻留 24GB 显存,全部层进 GPU,不再需要 CPU 混合推理。InternLM3-8B 同样全量进 GPU,4K 上下文总占用 6.7GB、剩余 17.3GB,32K 总占用 8.1GB、剩余 15.9GB。
| 指标 | InternLM3-8B | Qwen3-30B-A3B |
|---|---|---|
| 卸载方式 | 全部层进 GPU | 全部层进 GPU |
| 生成速度(4K 上下文) | 68 t/s | 170 t/s |
| 生成速度(32K 上下文) | 58 t/s | 145 t/s |
| 提示词处理速度 | 约 140 t/s | 约 350 t/s |
| 首 Token 延迟(512 输入) | 约 3.7s | 约 1.5s |
| 显存占用(4K / 32K) | 6.7GB / 8.1GB | 权重完整驻留显存 |
排名完全翻转:30B 的生成速度比 8B 快 2.5 倍,首 Token 延迟不到一半。
为什么?答案在 MoE 的激活机制里。30B 的全部权重必须驻留显存,但每个 Token 的前向传播只需要读取激活路径上的权重,数据量不到 8B 稠密模型每 Token 读取量的一半。3090 的带宽接近 1TB/s,30B 每 Token 搬动的数据更少,速度自然更高。
怎么选
16GB 卡,选 InternLM3-8B Q4_K_M。30 t/s 的生成速度折算中文约 45 字/秒,实时对话流畅;32K 上下文还有 15.9GB 剩余,长文档直接丢进去。
24GB 卡,选 Qwen3-30B-A3B。170 t/s 意味着生成肉眼几乎不可见,MoE 的 30B 总参数还带来更强的能力。
不推荐的是 16GB 卡上跑 30B 级模型:11 t/s 折算约 16 字/秒,问答能用,长文生成要等好几分钟,首 Token 延迟 17 秒更是难以忍受。
“8B 干翻 30B”只在 16GB 卡上成立,干翻的是显存约束下的速度,不是模型能力。24GB 卡上,30B 的速度和体验双双反超。选模型先看手里的显存,再谈参数。
