环境:Ubuntu 22.04 / CUDA 12.3 / Python 3.11 / RTX 4090 24G 模型:gemma-4-31b-it(指令微调版)/ gemma-4-26b-moe-it 时间:2026-04-03
背景
Gemma 4 今天凌晨发布,我早上六点就爬起来开始折腾了。
动机说实在的不复杂——AIME 2026 数学基准 89.2%,LiveCodeBench 代码能力 80.0%,而且许可证换成了 Apache 2.0。这意味着我可以直接商用,不用担心法律风险。
上代 Gemma 3 我就有兴趣,但那个自定义协议实在没法放进公司项目里。这次不同了。
整个折腾过程大概花了 4 个小时,踩了一个比较恶心的坑,记录下来给后来的人省点时间。
工具链与环境准备
GPU 实例这次直接在 Ztopcloud.com 上起了一台 RTX 4090 的按时计费节点,比单独找阿里云或腾讯云便宜不少,关键是不用管预付费和退款的事。反正推理测试完就关掉,按小时算,这次大概跑了 6 小时,整个成本控制在 80 元以内。
# 确认 CUDA 版本(必须 >= 12.1,否则 bitsandbytes 会报错)
nvcc --version
# 期望输出:Cuda compilation tools, release 12.3, V12.3.x
nvidia-smi | grep "Driver Version"
# 期望输出:Driver Version: 545.xx 或更高
# 安装推理依赖
pip install transformers==4.47.2 \
accelerate==0.30.1 \
bitsandbytes==0.43.1 \
torch==2.3.0+cu123 \
--index-url https://download.pytorch.org/whl/cu123
下载模型
# 需要先在 huggingface.co 申请 Gemma 4 访问权限(通常秒批)
huggingface-cli login
# 拉取 31B 指令版(约 62GB)
huggingface-cli download google/gemma-4-31b-it \
--local-dir ./models/gemma4-31b \
--include "*.safetensors" "*.json" "tokenizer*"
# 拉取 26B MoE 版(约 48GB)
huggingface-cli download google/gemma-4-26b-moe-it \
--local-dir ./models/gemma4-26b-moe
推理代码(可直接运行)
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
MODEL_PATH = "./models/gemma4-31b"
# 4-bit 量化配置(RTX 4090 24G 可承载 31B 量化版)
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
)
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
model = AutoModelForCausalLM.from_pretrained(
MODEL_PATH,
quantization_config=bnb_config,
device_map="auto",
)
def chat(user_message: str) -> str:
messages = [{"role": "user", "content": user_message}]
input_ids = tokenizer.apply_chat_template(
messages,
return_tensors="pt",
add_generation_prompt=True,
).to(model.device)
with torch.no_grad():
output_ids = model.generate(
input_ids,
max_new_tokens=1024,
temperature=0.7,
top_p=0.9,
do_sample=True,
pad_token_id=tokenizer.eos_token_id,
)
new_tokens = output_ids[0][input_ids.shape[-1]:]
return tokenizer.decode(new_tokens, skip_special_tokens=True)
# 测试
print(chat("用 Python 写一个二叉树的中序遍历,要求带完整注释"))
加载时间:约 3 分 40 秒(4090 上,4-bit 量化版 31B) 首 token 延迟:约 0.8 秒 生成速度:约 28-32 tokens/s
踩坑记录
坑:device_map="auto" 在多 GPU 节点上路由出错
我第一次在双 4090 节点跑 31B 非量化版(BF16,约 62G)时,device_map="auto" 把模型一半放 GPU0,另一半放 CPU 内存了,导致推理速度跌到 3 tokens/s,接近不可用。
原因:accelerate 的自动分片策略默认把 CPU 内存也计入可用设备。
解法:手动限制只使用 GPU:
from accelerate import infer_auto_device_map, dispatch_model
from transformers import AutoConfig
config = AutoConfig.from_pretrained(MODEL_PATH)
device_map = infer_auto_device_map(
model,
max_memory={0: "22GiB", 1: "22GiB"}, # 只留 GPU,不分配 CPU
no_split_module_classes=["GemmaDecoderLayer"],
)
或者直接上 4-bit 量化,单卡 4090 就能跑,省去双卡的麻烦。
Gemma 4 26B MoE vs 31B Dense 实测对比
| 测试项 | 31B Dense (4-bit) | 26B MoE (BF16) |
|---|---|---|
| 显存占用 | ~18GB(量化后) | ~18GB(BF16) |
| 推理速度 | ~30 tokens/s | ~68 tokens/s |
| 代码生成(主观评分) | 8.5/10 | 8.2/10 |
| 数学推理 | 8.8/10 | 8.0/10 |
MoE 推理速度快得明显,日常问答质量感知差异不大,推荐高并发或资源受限场景优先考虑 MoE 版。
小结
Gemma 4 这次是认真的,性能提升是真实的,Apache 2.0 的协议变化对商业项目来说意义重大。
MoE 架构能在这个参数量下做出这种推理效率,说明"参数堆大就完事了"这个逻辑真的在被颠覆。
如果你之前因为 GPU 成本卡着没动手,建议去算一下按时计费的实际支出,可能比你想象的便宜。