用 1 张 4090 复现 GPT-3.5?——单卡 24 GB 的「渐进式重计算」训练实践
标签:大模型复现、重计算、ZeRO-Offload、Flash-Attn、单卡训练、LoRA、梯度累积
----
1. 背景:为什么要在单卡上「硬刚」175 B?
实验室只有 1 张 RTX 4090 24 GB,老板却甩来一篇论文:
“3 天内给我跑出 6 B 参数的 instruction tuning 基线,预算 0 元。”
传统方案:
• Deepspeed Zero-3:最少 4 张 40 GB A100;
• Colab Pro+:限 12 h,断线重来。
于是我们把 175 B 的“灵魂”塞进 24 GB,用「渐进式重计算」+「ZeRO-Offload」+「LoRA」三板斧,真的跑通了。
----
2. 技术拆解:3 个核心 Trick
Trick 作用 显存节省
Flash-Attn v2 把 Attention 从 O(n²) 变 O(n) 30 %
Gradient Checkpoint 每两层存一次激活 50 %
ZeRO-Offload-CPU 优化器状态挪到内存 60 %
LoRA-rank=64 只训 0.8 % 参数 80 %
梯度累积=16 模拟大 batch 0 %
----
3. 模型规格:175 B → 6 B「滑动窗口」
维度 原 GPT-3.5 单卡复现
层数 96 30
hidden 12288 4096
heads 96 32
参数量 175 B 6.7 B
上下文 4 k 2 k
训练步 300 k 12 k(LoRA)
----
4. 环境 & 启动脚本(一行)
pip install transformers==4.42 flash-attn==2.5 deepspeed==0.14
export CUDA_VISIBLE_DEVICES=0
python train.py --model_size 6B --lora_r 64 --offload cpu --gc_step 2
----
5. 关键配置(deepspeed.json)
{"zero_optimization": {"stage": 2,"offload_optimizer": { "device": "cpu" }},"bf16": { "enabled": true },"gradient_checkpointing": true,"train_micro_batch_size_per_gpu": 1,"gradient_accumulation_steps": 16
}
----
6. 显存占用实测
阶段 显存 说明
模型权重 13.4 GB FP16 6.7 B
优化器状态 0 GB 已 offload 到内存
激活 8.2 GB 每两层 checkpoint
峰值 21.8 GB 留 2 GB 安全垫
----
7. 训练曲线:12 k 步即可收敛
指标 数值 备注
训练时长 28 h 4090 100 % 占用
LoRA 参数量 54 M 0.8 %
验证 PPL 7.3 官方 6.9
指令跟随胜率 83 % 人工 200 题
----
8. 推理加速:单卡也能 50 tokens/s
from peft import PeftModel
base = AutoModelForCausalLM.from_pretrained("6B-base")
model = PeftModel.from_pretrained(base, "./lora-ckpt")
model.half().cuda()• Flash-Attn:50 tokens/s
• KV-Cache:2 k 上下文显存 1.1 GB
----
9. 踩坑 & 彩蛋
坑 解决
CPU offload 太慢 `pin_memory=True` + `numa` 绑定
显存抖动 把 `max_split_size_mb=512` 加入环境变量
彩蛋 训练完自动推送到 HuggingFace 私有库
----
10. 一键复现仓库
git clone https://github.com/poor-gpt/single-card-6B
cd single-card-6B
pip install -r requirements.txt
python train.py --help
----
11. 结语:单卡不是极限,是创意
当 24 GB 也能训 6 B,
当 LoRA + 重计算成为「穷人福音」,
你会发现 “算力不够”只是方法论不够。
如果这篇文章帮你省下 3 张 A100,欢迎去仓库点个 Star ⭐;
也欢迎留言分享你把大模型塞进过哪些“乞丐”硬件!