Llama 3训练/推理OOM时,可通过五项软件配置优化显存:一、将per_device_train_batch_size设为1;二、cutoff_len调至2048–4096;三、启用adamw_torch_8bit优化器;四、开启fp16或bf16混合精度;五、LoRA仅微调q_proj/v_proj并冻结其余权重。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您正在运行 Llama 3 模型,但训练或推理过程中频繁触发 CUDA out of memory 错误,且无法更换更高显存的 GPU,问题极可能源于配置参数与显存使用策略不匹配。以下是不依赖硬件升级、仅通过软件配置调整即可实施的救急方案:
一、降低批处理大小(per_device_train_batch_size)
批处理大小直接影响梯度与激活值的显存占用量,是显存压力最敏感的杠杆。减小该值可线性降低梯度与中间激活显存,同时对训练稳定性影响最小。
1、打开训练配置文件(如 examples/train_lora/llama3_lora_sft.yaml)。
2、定位到 per_device_train_batch_size 字段,将其值由默认的 4 或 2 改为 1。
3、若使用命令行启动,直接添加参数:--per_device_train_batch_size 1。
二、压缩序列长度(cutoff_len)
cutoff_len 并非仅用于截断输入,PyTorch 会据此预分配最大可能的激活内存空间。设置过高将导致显存被严重虚占,尤其在长上下文场景下危害显著。
1、在配置文件中查找 cutoff_len 参数。
2、将原值(如 8192 或 100000)修改为 2048 或 4096,确保不超过实际数据平均长度的 1.5 倍。
3、验证数据集 token 分布:运行 python utils/check_seq_length.py --data_path data/alpaca_zh.json 获取真实长度统计。
三、启用 8-bit 优化器(bitsandbytes)
AdamW 优化器状态(动量 + 方差)通常消耗模型参数显存的 2–3 倍。8-bit 量化可将每参数优化器状态从 8 字节压缩至约 1.5 字节,显存节省幅度超 80%。
1、执行安装:pip install bitsandbytes --no-cache-dir。
2、在配置文件中添加字段:optim: "adamw_torch_8bit" 或命令行传参 --optim adamw_torch_8bit。
3、确认未启用 gradient_checkpointing: false,避免与 8-bit 优化器冲突。
四、切换混合精度训练(FP16 / BF16)
FP16 可使模型参数、梯度、激活值显存占用减半;BF16 在部分 A100/V100 上兼容性更优且数值稳定性更强。二者均无需修改模型结构,仅需开启开关。
1、在配置文件中设置:fp16: true 或 bf16: true(二者不可同时为 true)。
2、若使用 vLLM 推理,启动时添加:--dtype half(对应 FP16)或 --dtype bfloat16。
3、禁用 torch.compile(某些版本存在混合精度兼容问题),在代码中移除 model = torch.compile(model) 行。
五、冻结原始权重并精调 LoRA 目标模块
LoRA 微调本身不省显存,除非严格限制可训练参数范围。若 lora_target_modules 包含 q_proj/v_proj/o_proj/up_proj 等全部投影层,则梯度仍覆盖大量原始权重路径,显存节省失效。
1、检查配置中 lora_target_modules 字段,将其限定为最小必要集合,例如:["q_proj", "v_proj"]。
2、确认 trainable_params 输出中 LoRA 参数占比 ≥ 95%,原始权重参数显示为 requires_grad=False。
3、运行前插入校验代码:print([(n, p.requires_grad) for n, p in model.named_parameters() if 'lora' in n.lower() or 'q_proj' in n or 'v_proj' in n])。











