(llamafactory用多张4090卡,训练qwen14B大模型时oom(out of memory)报错,torch.OutOfMemoryError:CUDA out of memory,Tried to allocate 136MB,GPU 5 has a total capacity of 23.64GB which 16.56MB is free,已解决)
1.问题描述
通过export CUDA_VISIBLE_DVICES=0,1,2,3,4,5,6,7指定使用8张显卡,训练qwen2.5-7B大模型时正常,但训练qwen2.5-14B,qwen2.5-32B模型时报错,torch.OutOfMemoryError:CUDA out of memory,Tried to allocate 136MB,GPU 5 has a total capacity of 23.64GB which 16.56MB is free 。
大概意思就是说GPU显存不足,很明显不符合实际,我的8张4090卡总显存是8*24GB,理论上14B的大模型肯定能跑起来。
linux服务器环境:
系统:Ubuntu22;
硬件:本机512G内存,8张4090显卡;
python:3.10版本;
llamafactory版本:0.9.1.dev0;
cuda版本:12.4版本;
pytorch版本:2.4.0+cuda121(GPU);
大模型:qwen2.5(7B,14B,32B,72B)Instruct版;
2.解决方案
- 减小大模型训练参数: 查一些帖子说是大模型训练参数太大,尝试减小数据量,减小步数,fp16位精度等,依旧不行,未解决,说明不是模型训练参数太大;
-
多余的内存分配给CPU: 从上面的oom报错原因我们可以看出,给GPU分配了136M内存,但实际GPU只剩16M了,导致oom报错,使用ZeRO-offload 技术通过一系列策略,将原本在GPU上处理的一部分数据和任务转移到CPU上,以此来降低GPU内存的占用,解决oom报错问题。
**具体解决方案:**在LLaMA-Factory目录下新建一个run_train_bash.sh新件,具体目录如下图:
在run_train_bash.sh文件中,设置参数如下:
model_name_or_path和output_dir 改成你自己的本地大模型和输出路径就行;
src/train.py 取决于你src目录下的训练启动文件名,这个是llamafactory自带的;
CUDA_VISIBLE_DEVICES:看你有几张卡,需要用几张卡,我的是8张卡;
其它都是训练参数,根据实际需要修改。最重要的是deepspeed ds_config_zero3.json这行,
这个是qwen官网给的。deepspeed 库可以用pip install deepspeed 安装一下。
run_train_bash.sh文件中内容:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 accelerate launch src/train.py
--deepspeed ds_config_zero3.json
--stage sft
--do_train True
--model_name_or_path /home/admin1/Qwen2.5-72B-Instruct
--finetuning_type lora
--template qwen
--dataset_dir data
--dataset alpaca_zh_demo
--cutoff_len 1024
--learning_rate 5e-05
--num_train_epochs 1
--max_samples 100000
--per_device_train_batch_size 1
--gradient_accumulation_steps 1
--lr_scheduler_type cosine
--max_grad_norm 1.0
--logging_steps 5
--save_steps 100
--warmup_steps 0
--neftune_noise_alpha 0
--lora_rank 8
--lora_dropout 0.1
--lora_target all
--output_dir saves/Qwen2.5-72B-Instruct/lora/train_2024-10-22-17-04-29
--fp16 True
--plot_loss True
至于ds_config_zero3.json这个,可以去qwen官网下载,https://github.com/QwenLM/Qwen/blob/main/finetune/ds_config_zero3.json。
使用qwen官方给的例子,新建一个ds_config_zero3.json,依旧是LLaMA-Factory目录下,和刚才的run_train_bash.sh文件在同一个目录。
ds_config_zero3.json格式如下:
{
"fp16": {
"enabled": "auto",
"loss_scale": 0,
"loss_scale_window": 1000,
"initial_scale_power": 16,
"hysteresis": 2,
"min_loss_scale": 1
},
"bf16": {
"enabled": "auto"
},
"optimizer": {
"type": "AdamW",
"params": {
"lr": "auto",
"betas": "auto",
"eps": "auto",
"weight_decay": "auto"
}
},
"scheduler": {
"type": "WarmupLR",
"params": {
"warmup_min_lr": "auto",
"warmup_max_lr": "auto",
"warmup_num_steps": "auto"
}
},
"zero_optimization": {
"stage": 3,
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
"offload_param": {
"device": "cpu",
"pin_memory": true
},
"overlap_comm": true,
"contiguous_gradients": true,
"sub_group_size": 1e9,
"reduce_bucket_size": "auto",
"stage3_prefetch_bucket_size": "auto",
"stage3_param_persistence_threshold": "auto",
"stage3_max_live_parameters": 1e9,
"stage3_max_reuse_distance": 1e9,
"stage3_gather_16bit_weights_on_model_save": true
},
"gradient_accumulation_steps": "auto",
"gradient_clipping": "auto",
"steps_per_print": 100,
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto",
"wall_clock_breakdown": false
}
创建后的ds_config_zero3.json如下图,:
把ds_config_zero3.json中的device改为cpu即可。
"zero_optimization": {
"stage": 3,
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
"offload_param": {
"device": "cpu",
"pin_memory": true
},
3.运行run_train_bash.sh,开始大模型训练
不能通过llamafactory-cli webui或者llamafactory-cli train方式启动,否则依旧会报oom错误。正确启动方式是在pycharm终端或linux终端,执行run_train_bash.sh文件即可。run run_train_bash.sh或./run_train_bash.sh方式均可。
至此大功告成,使用多卡,qwen14B,qwen32B的模型都能训练成功,不会再有oom报错。

文章来源于互联网:llamafactory用多卡4090服务器,训练qwen14B大模型时报错GPU显存不足oom(out of memory),已解决
相关推荐: 基于GPT的生成模型在AIGC领域的应用实践与技术优化【附核心实战代码】
本文收录于专栏:精通AI实战千例专栏合集 https://blog.csdn.net/weixin_52908342/category_11863492.html 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意…
5bei.cn大模型教程网











