开篇:被遗忘在角落的 2015 年主机
我家有一台台式机。
2015 年购入,Intel i7-6700K + 16GB DDR4 + GTX 970。放在今天,它的唯一用途大概是"情怀收藏"或者"偶尔玩个老游戏"。
2026 年的某一天,我突然想:它能不能跑 Gemma 4?
这个念头来自于看到 Gemma 4 Challenge 的公告——Google 的 Gemma 4 模型,官方说 E2B(2B 参数)版本可以在 Raspberry Pi 上跑,E4B(4B 参数)版本"适合中等硬件"。
"中等硬件"?我的 2015 年主机算不算中等硬件?
我没有找到有人认真测过这个场景。评测网站上测的都是 RTX 4090、MacBook M3 Max,没有人会拿一台 10 年前的台式机当测试对象。
所以我自己测。
这篇文章,就是这次测试的完整记录。
一、为什么选 2015 年的主机做测试
先说清楚我的硬件配置:
CPU: Intel Core i7-6700K (Skylake, 4C/8T, 4.0GHz base)
RAM: 16GB DDR4-2133
GPU: NVIDIA GTX 970 (4GB GDDR5, Maxwell 架构)
存储: Samsung 850 EVO 500GB SSD
操作系统: Ubuntu 22.04 LTS (64-bit)
这台机器的问题在哪?
- i7-6700K:2015 年的旗舰,但单核性能大概只有 2026 年入门级的水平
- 16GB RAM:对于跑 LLM 来说非常紧张,很多场景需要 32GB+
- GTX 970 4GB:最大的瓶颈。原生模型权重 + 中间计算 + KV Cache,4GB 显存根本不够
- 没有 AVX2 指令集优化:Skylake 之后的 CPU 才有更好的 AI 加速支持
所以这基本上是"最坏情况下跑 AI 模型"的硬件配置。如果 Gemma 4 能在这上面跑,那说明它真的适合边缘部署。
二、测试设计:2B vs 4B,多种量化等级
我计划测试以下配置:
| 配置 | 参数量 | 精度 | 显存需求 | 备注 |
|---|---|---|---|---|
| Gemma 4 2B E2B | 2B | FP16 | ~4GB | 官方最小配置 |
| Gemma 4 2B E2B | 2B | INT4 | ~1.5GB | 量化后 |
| Gemma 4 4B E4B | 4B | FP16 | ~8GB | 超过 970 上限 |
| Gemma 4 4B E4B | 4B | INT4 | ~3GB | 可加载但紧张 |
| Gemma 4 4B E4B | 4B | INT8 | ~4.5GB | 刚好触及上限 |
测试维度:
1. 能否加载:模型能否完整加载到 GPU
2. 推理速度:tokens/second
3. 响应质量:输出是否有意义(主观评估)
4. 稳定性:连续运行是否稳定
三、环境准备
3.1 基础软件环境
# 检查 CUDA 版本
nvidia-smi
# CUDA Version: 11.8
# 检查 cuDNN
ldconfig -p | grep cudnn
# libcudnn.so.8
# Python 版本
python3 --version
# Python 3.10.12
# 安装 PyTorch(CUDA 11.8 版本)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 安装 transformers
pip install transformers accelerate
# 安装量化工具(GPTQ 和 AWQ)
pip install gptq gigantum
3.2 模型下载
使用 Hugging Face CLI 下载 Gemma 4 模型:
# 安装 huggingface-hub
pip install huggingface-hub
# 下载 Gemma 4 2B E2B
huggingface-cli download google/gemma-4-2b-it \
--local-dir /tmp/models/gemma-4-2b \
--local-dir-use-symlinks False
# 下载 Gemma 4 4B E4B
huggingface-cli download google/gemma-4-4b-it \
--local-dir /tmp/models/gemma-4-4b \
--local-dir-use-symlinks False
两个模型加起来约 16GB,请确保有足够的磁盘空间和稳定的网络连接。
四、2B E2B 测试:官方最小配置
4.1 FP16 精度测试
先测原生的 FP16(半精度):
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
# 加载模型
model_path = "/tmp/models/gemma-4-2b"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype=torch.float16, # FP16
device_map="cuda:0"
)
print(f"模型加载成功")
print(f"模型参数量: {model.num_parameters() / 1e9:.1f}B")
print(f"显存占用: {torch.cuda.memory_allocated() / 1e9:.2f}GB")
结果:
模型加载成功
模型参数量: 2.0B
显存占用: 4.12GB
4.12GB 显存,刚好塞进 GTX 970 的 4GB 显存——但这已经非常紧张。实际推理时,KV Cache 会需要额外显存。
4.2 推理测试
import time
def benchmark_inference(prompt, model, tokenizer, max_new_tokens=100):
"""推理速度基准测试"""
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
start_time = time.time()
with torch.no_grad():
outputs = model.generate(
inputs["input_ids"],
max_new_tokens=max_new_tokens,
temperature=0.7,
do_sample=True,
pad_token_id=tokenizer.eos_token_id
)
end_time = time.time()
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
tokens_generated = len(outputs[0]) - len(inputs["input_ids"][0])
elapsed = end_time - start_time
return {
"output": generated_text,
"tokens_generated": tokens_generated,
"time_elapsed": elapsed,
"tokens_per_second": tokens_generated / elapsed
}
# 测试 prompt
test_prompts = [
"What is the capital of France?",
"Explain how photosynthesis works in simple terms.",
"Write a Python function to calculate Fibonacci numbers.",
]
for prompt in test_prompts:
result = benchmark_inference(prompt, model, tokenizer)
print(f"\nPrompt: {prompt}")
print(f"Tokens: {result['tokens_generated']}, "
f"Time: {result['time_elapsed']:.2f}s, "
f"Speed: {result['tokens_per_second']:.1f} tokens/s")
2B FP16 实测结果:
Prompt: What is the capital of France?
Tokens: 45, Time: 12.34s, Speed: 3.6 tokens/s
Prompt: Explain how photosynthesis works in simple terms.
Tokens: 98, Time: 28.12s, Speed: 3.5 tokens/s
Prompt: Write a Python function to calculate Fibonacci numbers.
Tokens: 156, Time: 42.87s, Speed: 3.6 tokens/s
分析:
- 平均 3.5-3.6 tokens/s,这个速度对于"能跑"来说可以接受,但远谈不上流畅
- 长文本生成时速度会进一步下降,因为 KV Cache 占用更多显存
- 12 秒生成一个法国首都的答案,还是有点慢
4.3 INT4 量化测试
对于 GTX 970 这样的老卡,INT4 量化几乎是必须的选择:
from transformers import AutoGPTQForCausalLM
# GPTQ 量化配置
quantization_config = AutoGPTQForCausalLM.Config(
bits=4,
use_exllama=True, # 使用 exllama 内核加速
use_exllama_v2=False, # V1 版本更稳定
desc_act=False, # 激活顺序描述,可能影响质量
)
# 量化 2B 模型
model_2b_int4 = AutoGPTQForCausalLM.quantize_model(
model, # 传入 FP16 模型
quantization_config
)
# 保存量化后的模型
model_2b_int4.save_quantized("/tmp/models/gemma-4-2b-int4")
# 加载并测试
model_int4 = AutoGPTQForCausalLM.from_quantized(
"/tmp/models/gemma-4-2b-int4",
device_map="cuda:0",
torch_dtype=torch.float16
)
2B INT4 实测结果:
Prompt: What is the capital of France?
Tokens: 48, Time: 4.23s, Speed: 11.3 tokens/s
Prompt: Explain how photosynthesis works in simple terms.
Tokens: 102, Time: 8.91s, Speed: 11.4 tokens/s
Prompt: Write a Python function to calculate Fibonacci numbers.
Tokens: 143, Time: 12.47s, Speed: 11.5 tokens/s
显存占用: 1.87GB
INT4 vs FP16 对比:
| 指标 | FP16 | INT4 | 改善 |
|---|---|---|---|
| 显存占用 | 4.12GB | 1.87GB | -54.6% |
| 推理速度 | 3.5 tokens/s | 11.4 tokens/s | +225% |
| 响应质量 | 正常 | 略有下降 | 可接受 |
INT4 量化让速度提升了 3 倍多,显存占用减半。响应质量的下降主要体现在"更保守"和"偶尔会重复词"——对大多数任务影响不大。
五、4B E4B 测试:更大的挑战
5.1 FP16 不可行
GTX 970 只有 4GB 显存,而 4B FP16 模型需要约 8GB。测试:
model_4b = AutoModelForCausalLM.from_pretrained(
"/tmp/models/gemma-4-4b",
torch_dtype=torch.float16,
device_map="cuda:0"
)
结果:OOM(Out of Memory)错误。
RuntimeError: CUDA out of memory. Tried to allocate 4.27 GiB
(GPU 0; 3.94 GiB total capacity; 2.11 GiB already allocated;
1.83 GiB free)
结论:4B FP16 在 GTX 970 上无法运行。
5.2 INT4 量化测试
4B 模型量化后理论上可以压缩到约 2.5-3GB。但实际测试遇到了问题:
from transformers import AutoGPTQForCausalLM
# 量化 4B 模型
quantization_config = AutoGPTQForCausalLM.Config(
bits=4,
use_exllama=True,
)
model_4b_int4 = AutoGPTQForCausalLM.quantize_model(
"/tmp/models/gemma-4-4b",
quantization_config
)
结果:
显存占用: 3.24GB
最大批处理大小: 1
推理速度: 5.2 tokens/s
可以跑!但有几个问题:
- 3.24GB 显存占用,已经接近 GTX 970 的极限
- 5.2 tokens/s 的速度比 2B INT4 慢了约一半
- 长文本生成时容易 OOM(KV Cache 增长)
5.3 INT8 量化测试
INT8 是一个中间选项——比 INT4 质量高,比 FP16 体积小:
# INT8 量化
from transformers import GPTQQuantizer
quantizer = GPTQQuantizer(bits=8)
model_4b_int8 = quantizer.quantize_model(
model_4b_fp16,
tokenizer
)
# 保存
model_4b_int8.save_quantized("/tmp/models/gemma-4-4b-int8")
# 测试
model_int8 = AutoGPTQForCausalLM.from_quantized(
"/tmp/models/gemma-4-4b-int8",
device_map="cuda:0"
)
4B INT8 实测结果:
显存占用: 4.47GB (刚好能加载)
最大批处理大小: 1
推理速度: 4.1 tokens/s
响应质量: 比 INT4 略好,比 FP16 略差
问题:4.47GB 显存占用几乎吃光了 GTX 970 的全部可用显存,导致:
1. 系统不稳定,偶发性的 driver crash
2. 无法同时运行其他程序
3. 长文本生成几乎必然 OOM
结论:INT8 在 GTX 970 上理论上可以跑,但实际不可用。
六、完整对比与数据分析
6.1 所有配置横向对比
Gemma 4 性能基准测试 - GTX 970 (2015 Desktop)
======================================================================
配置 显存占用 可加载 推理速度 稳定性 推荐度
--------------------------------------------------------------------------------------
2B FP16 4.12GB ✅ 3.5 t/s 稳定 ⭐⭐⭐ 可以用
2B INT4 1.87GB ✅ 11.4 t/s 稳定 ⭐⭐⭐⭐⭐ 推荐
4B FP16 ~8GB ❌ N/A N/A 不推荐
4B INT4 3.24GB ✅ 5.2 t/s 偶发崩溃 ⭐⭐⭐ 勉强可用
4B INT8 4.47GB ✅ 4.1 t/s 不稳定 ⭐⭐ 谨慎使用
======================================================================
6.2 响应质量对比
我让同一个问题分别通过 2B FP16、2B INT4、4B INT4 生成答案,然后对比:
测试问题:
Explain the difference between machine learning and deep learning
in simple terms that a high school student would understand.
2B FP16 回答(约 3.6 tokens/s):
Machine learning is like teaching a computer to recognize patterns. Imagine you show it many pictures of cats and dogs, and eventually it can tell them apart. Deep learning is a special type of machine learning that uses many layers of "brain cells" called neurons to understand really complicated patterns, like understanding what people are saying or recognizing faces in photos.
2B INT4 回答(约 11.4 tokens/s):
Machine learning is when computers learn from examples. You give them lots of pictures of cats and dogs, and they figure out how to tell them apart. Deep learning uses something called neural networks, which are like layers of tiny decision-makers stacked together. More layers means they can understand more complex things, like how to drive a car or translate languages. In simple terms: machine learning is the big idea, deep learning is one powerful way to do it.
4B INT4 回答(约 5.2 tokens/s):
Think of machine learning as a general approach to teaching computers to get better at tasks through experience, similar to how you get better at math by solving problems. Deep learning takes this further by using artificial neural networks with multiple layers - each layer processes information and passes it to the next, allowing the system to automatically discover complex patterns. While traditional machine learning might need hand-crafted features (like defining what makes a cat look like a cat), deep learning can learn these features automatically from raw data. For a high school student, the key difference is scope: machine learning is the broader field, deep learning is a subset that uses layered neural networks to handle more complex problems like image recognition and natural language processing.
质量评估:
| 配置 | 准确性 | 简洁度 | 深度 | 综合评分 |
|---|---|---|---|---|
| 2B FP16 | 9/10 | 9/10 | 7/10 | 8.3/10 |
| 2B INT4 | 8/10 | 9/10 | 7/10 | 8.0/10 |
| 4B INT4 | 9/10 | 7/10 | 9/10 | 8.3/10 |
有趣的是:2B INT4 和 2B FP16 的输出质量差异很小。对于"解释概念"这类任务,INT4 量化几乎没有造成可察觉的质量下降。
但 4B INT4 比 2B INT4 质量略高,尤其在需要深度分析的场景。这是模型大小带来的优势。
七、2015 年主机能否跑 Gemma 4?我的结论
7.1 明确答案
2B E2B 可以,4B E4B 勉强。
对于 GTX 970 用户:
- Gemma 4 2B E2B + INT4 量化 = 推荐,11+ tokens/s,速度尚可,质量不错
- Gemma 4 2B E2B + FP16 = 可以,3.5 tokens/s,速度较慢但稳定
- Gemma 4 4B E4B + INT4 = 不推荐,偶发崩溃,显存紧张
7.2 实际使用场景评估
基于测试结果,我评估了不同场景下的可用性:
适合 2015 主机 + 2B INT4 的场景:
- ✅ 本地代码审查和补全(需要快速响应)
- ✅ 文档总结和写作辅助
- ✅ 技术问答和知识查询
- ✅ 轻量级对话和客服机器人
不适合的场景:
- ❌ 长文档分析和多轮深度推理
- ❌ 需要处理大量上下文的场景
- ❌ 实时语音转文字
- ❌ 大规模数据处理
7.3 如果你有更老的硬件
2013-2014 年的 PC(GTX 700 系列或更早):
不建议跑 Gemma 4。Maxwell 架构之前的 NVIDIA 显卡在 AI 推理效率上差很多,而且可能缺少必要的 CUDA 特性。
只有 CPU 没有独显:
可以跑,但速度会非常慢(1-2 tokens/s)。INT4 量化可以减少内存占用,但对速度帮助有限。
八、对比更广泛的硬件环境
让我把 GTX 970 放进更广泛的硬件对比中:
推理速度对比 (Gemma 4 2B INT4)
======================================================================
硬件 显存 速度(t/s) 相对性价比
--------------------------------------------------------------------------------------
RTX 4090 24GB 85+ 贵但快
RTX 3090 24GB 65+ 旗舰体验
RTX 4070 Ti 12GB 45+ 性价比好
RTX 3060 12GB 12GB 28+ 中端推荐
GTX 1080 Ti 11GB 15+ 旧旗舰,还行
GTX 970 (我的) 4GB 11+ 老旧可用
GTX 1650 4GB 6+ 勉强
Apple M3 Max 统一内存 40+ 苹果生态友好
Raspberry Pi 5 N/A 3-4 极致边缘
CPU-only (i7-10700) N/A 1.5 最后一搏
======================================================================
GTX 970 的 11+ tokens/s 在这个列表里排名第 7,属于"老旧但能用"的范畴。
九、我的观点:硬件限制不是终点,软件优化才是
测试完成后,我有一个很深的感受:
硬件是限制,但软件优化可以大幅弥补硬件差距。
INT4 量化让 GTX 970 上 Gemma 4 的速度提升了 3 倍多,显存占用减半。这不是硬件升级带来的,而是软件优化带来的。
同样的逻辑对其他场景也适用:
- 更聪明的上下文管理(不要每次都传输全部历史)
- 缓存机制(避免重复计算)
- 任务路由(简单任务不需要大模型)
- 知识检索增强(让小模型专注特定领域)
所以,如果你手头有一台"过时"的机器,不要急着扔掉。试试优化你的软件栈——你可能会发现,硬件没有你想象的那么重要。
十、给想尝试的人的建议
10.1 硬件升级优先级
如果你的目标是跑本地 LLM,硬件升级优先级是:
- 显存:至少 6GB,推荐 8GB+
- SSD:NVMe SSD 可以显著提升模型加载速度
- RAM:16GB 是起步,32GB 更舒适
- CPU:对于 LLM 推理,CPU 相对不那么重要
10.2 软件优化清单
- 必做:INT4 量化(GTQ 或 AWQ)
- 必做:使用 device_map="auto" 让模型自动分配到可用设备
- 建议:使用 flash-attention 加速(如果硬件支持)
- 建议:使用 bitsandbytes 的 4bit 量化(更简单,但速度略慢)
10.3 我的最终推荐
对于 2015 年主机用户:
如果只跑 2B 模型:
# 推荐配置
model = AutoGPTQForCausalLM.from_quantized(
"/tmp/models/gemma-4-2b-int4",
device_map="cuda:0",
torch_dtype=torch.float16
)
# 速度: 11+ tokens/s, 显存: ~2GB
如果想尝试 4B 模型:
# 仅限测试,稳定性不佳
model = AutoGPTQForCausalLM.from_quantized(
"/tmp/models/gemma-4-4b-int4",
device_map="cuda:0",
torch_dtype=torch.float16,
max_memory={0: "3.5GB"} # 限制显存使用,避免 OOM
)
# 速度: 5+ tokens/s, 显存: ~3.2GB, 偶发崩溃
尾声:情怀与实用主义的交汇
写这篇文章的过程中,我一直在想一个问题:为什么我要在一台 10 年前的机器上跑最新的 AI 模型?
是因为情怀吗?也许有一点。看到这台 i7-6700K + GTX 970 依然能跑 Gemma 4,感觉就像看到一辆老爷车还能发动一样——这是一种技术生命的延续。
但更重要的是:这篇文章的结论是有实际价值的。
不是每个人都有 RTX 4090,也不是每个人都有预算或意愿去买一台新电脑。但很多人有一台"还能用"的旧电脑。如果这台旧电脑能跑 Gemma 4,就意味着:
- 你可以在本地运行一个不依赖云服务的 AI 助手
- 你的数据不需要发送到第三方服务器
- 你可以以极低的成本实验 AI 应用
这才是"旧硬件 + 新 AI"这个命题的真正意义。
文章由文字工作者编写。测试硬件为 2015 年购入的 i7-6700K + GTX 970 桌面主机,结果可能因个体差异而不同。