我把 Gemma 4 跑在 RTX 4090 上:从踩坑到跑通,记录一次真实的本地推理折腾史

0 阅读3分钟

环境: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/108.2/10
数学推理8.8/108.0/10

MoE 推理速度快得明显,日常问答质量感知差异不大,推荐高并发或资源受限场景优先考虑 MoE 版。


小结

Gemma 4 这次是认真的,性能提升是真实的,Apache 2.0 的协议变化对商业项目来说意义重大。

MoE 架构能在这个参数量下做出这种推理效率,说明"参数堆大就完事了"这个逻辑真的在被颠覆。

如果你之前因为 GPU 成本卡着没动手,建议去算一下按时计费的实际支出,可能比你想象的便宜。