在Flan-T5模型上用LoRA做PEFT训练时遭遇无可用批量大小错误
错误原因分析
核心原因:显存资源耗尽
"no executable batch size found"本质是当前GPU显存不足以承载哪怕最小的训练batch(包括模型参数、梯度、优化器状态等)。你重启内核后恢复,是因为重启彻底清理了之前残留的显存占用:
- 之前的训练/模型加载进程没有正常退出,残留的CUDA上下文或模型参数占用了大部分8GB显存;
- Python的垃圾回收机制没及时释放已删除模型的显存,导致显存被“占死”,新的训练进程无法分配足够空间。
解决方案
即时修复(不用重启内核)
- 清理残留GPU进程
- 先查看显存占用进程:
nvidia-smi - 杀掉占用显存的异常进程(替换
<PID>为进程号):kill -9 <PID>
- 先查看显存占用进程:
- 手动释放CUDA缓存
在训练代码开头添加强制清理逻辑:import torch # 清理未被释放的显存缓存 torch.cuda.empty_cache() # 可选:打印当前显存状态,确认清理效果 print(f"已分配显存: {torch.cuda.memory_allocated()/1024**2:.2f} MB") print(f"已保留显存: {torch.cuda.memory_reserved()/1024**2:.2f} MB")
长期预防(避免重复出现)
- 优化LoRA与训练配置
- 降低LoRA的rank值:比如把
r=8改成r=4,减少适配器参数规模; - 限制LoRA作用层:只在模型的注意力层添加适配器,而非全层,示例配置:
from peft import LoraConfig lora_config = LoraConfig( r=4, lora_alpha=8, target_modules=["q", "v"], # 仅作用于注意力的query和value层 lora_dropout=0.05, bias="none", task_type="SEQ_2_SEQ_LM" ) - 启用混合精度训练:在Trainer配置中添加
fp16=True,大幅降低显存占用:from transformers import Trainer, TrainingArguments training_args = TrainingArguments( output_dir="./lora-flan-t5", per_device_train_batch_size=4, gradient_accumulation_steps=2, # 梯度累积,等效batch size=8 fp16=True, # 混合精度 num_train_epochs=3, logging_steps=10 )
- 降低LoRA的rank值:比如把
- 训练前显存校验
代码中添加显存预检查,避免启动训练后报错:def check_gpu_memory(min_required_mb=2048): allocated = torch.cuda.memory_allocated()/1024**2 reserved = torch.cuda.memory_reserved()/1024**2 free = (torch.cuda.get_device_properties(0).total_memory/1024**2) - reserved if free < min_required_mb: raise RuntimeError(f"GPU剩余显存不足:{free:.2f} MB,需至少{min_required_mb} MB") # 训练前调用 check_gpu_memory() - 规范进程退出
训练结束后显式清理资源:# 训练完成后 del trainer, model, tokenizer torch.cuda.empty_cache()
内容的提问来源于stack exchange,提问作者user3476463
相关产品推荐
相关产品推荐

