如何用多GPU微调Whisper模型?解决4×16G GPU显存不足问题
4×16G GPU微调Whisper-medium的显存问题解决方案
并非绝对无法微调Whisper-medium
4×16G GPU(总显存64G)不是完全不能微调Whisper-medium,显存不足是默认训练配置下显存占用过高导致的,通过调整训练策略可以降低显存消耗,完成微调。
具体优化策略
1. 启用梯度累积
在training_args中设置梯度累积步数,等价于用小batch模拟大batch效果,大幅降低单步显存占用:
training_args = Seq2SeqTrainingArguments( # 保留原有其他参数 gradient_accumulation_steps=4, # 可根据显存情况调整为2/8等 )
2. 开启混合精度训练
启用FP16半精度计算,在几乎不损失模型性能的前提下减少显存占用:
training_args = Seq2SeqTrainingArguments( # 保留原有其他参数 fp16=True, )
3. 降低单卡batch size
直接减小per_device_train_batch_size,配合梯度累积保证训练效果:
training_args = Seq2SeqTrainingArguments( # 保留原有其他参数 per_device_train_batch_size=4, # 从默认8降至4或2,视显存情况调整 )
4. 启用梯度检查点
牺牲少量训练速度换取显存节省,加载模型时开启:
model = WhisperForConditionalGeneration.from_pretrained( "openai/whisper-medium", gradient_checkpointing=True, )
5. 使用DeepSpeed的ZeRO优化
通过ZeRO技术将模型参数、梯度拆分到多卡,进一步降低单卡显存压力。需配置training_args并添加DeepSpeed配置文件:
training_args = Seq2SeqTrainingArguments( # 保留原有其他参数 deepspeed="deepspeed_config.json", )
基础版deepspeed_config.json配置示例:
{ "train_batch_size": 32, "optimizer": { "type": "AdamW", "params": { "lr": 1e-5 } }, "zero_optimization": { "stage": 2, "allgather_partitions": true, "allgather_bucket_size": 1e8, "overlap_comm": true, "reduce_scatter": true, "reduce_bucket_size": 1e8, "contiguous_gradients": true }, "fp16": { "enabled": true } }
6. 冻结部分层训练
仅微调模型头部或最后几层,减少需要更新的参数数量:
# 冻结编码器所有层,仅微调解码器和任务头部 for param in model.model.encoder.parameters(): param.requires_grad = False # 或者解冻编码器最后2层(Whisper-medium编码器共24层) for name, param in model.model.encoder.named_parameters(): if "layers.22" in name or "layers.23" in name: param.requires_grad = True else: param.requires_grad = False
配置验证
调整参数后可先运行1-2个epoch测试显存占用,若仍不足可组合多个策略(如混合精度+梯度累积+梯度检查点),这些组合基本能让4×16G GPU完成Whisper-medium的微调。
内容的提问来源于stack exchange,提问作者user22264203




