ToB企服应用市场:ToB评测及商务社交产业平台

标题: llamafactory用多卡4090服务器,训练qwen14B大模型时报错GPU显存不足oom(o [打印本页]

作者: 铁佛    时间: 2024-12-10 23:07
标题: llamafactory用多卡4090服务器,训练qwen14B大模型时报错GPU显存不足oom(o
(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.办理方案

run_train_bash.sh文件中内容:
  1. CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 accelerate launch  src/train.py \
  2.     --deepspeed ds_config_zero3.json \
  3.     --stage sft \
  4.     --do_train True \
  5.     --model_name_or_path /home/admin1/Qwen2.5-72B-Instruct \
  6.     --finetuning_type lora \
  7.     --template qwen \
  8.     --dataset_dir data \
  9.     --dataset alpaca_zh_demo \
  10.     --cutoff_len 1024 \
  11.     --learning_rate 5e-05 \
  12.     --num_train_epochs 1 \
  13.     --max_samples 100000 \
  14.     --per_device_train_batch_size 1 \
  15.     --gradient_accumulation_steps 1 \
  16.     --lr_scheduler_type cosine \
  17.     --max_grad_norm 1.0 \
  18.     --logging_steps 5 \
  19.     --save_steps 100 \
  20.     --warmup_steps 0 \
  21.     --neftune_noise_alpha 0 \
  22.     --lora_rank 8 \
  23.     --lora_dropout 0.1 \
  24.     --lora_target  all \
  25.     --output_dir saves/Qwen2.5-72B-Instruct/lora/train_2024-10-22-17-04-29 \
  26.     --fp16 True \
  27.     --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格式如下:
  1. {
  2.     "fp16": {
  3.         "enabled": "auto",
  4.         "loss_scale": 0,
  5.         "loss_scale_window": 1000,
  6.         "initial_scale_power": 16,
  7.         "hysteresis": 2,
  8.         "min_loss_scale": 1
  9.     },
  10.     "bf16": {
  11.         "enabled": "auto"
  12.     },
  13.     "optimizer": {
  14.         "type": "AdamW",
  15.         "params": {
  16.             "lr": "auto",
  17.             "betas": "auto",
  18.             "eps": "auto",
  19.             "weight_decay": "auto"
  20.         }
  21.     },
  22.     "scheduler": {
  23.         "type": "WarmupLR",
  24.         "params": {
  25.             "warmup_min_lr": "auto",
  26.             "warmup_max_lr": "auto",
  27.             "warmup_num_steps": "auto"
  28.         }
  29.     },
  30.     "zero_optimization": {
  31.         "stage": 3,
  32.         "offload_optimizer": {
  33.             "device": "cpu",
  34.             "pin_memory": true
  35.         },
  36.         "offload_param": {
  37.             "device": "cpu",
  38.             "pin_memory": true
  39.         },
  40.         "overlap_comm": true,
  41.         "contiguous_gradients": true,
  42.         "sub_group_size": 1e9,
  43.         "reduce_bucket_size": "auto",
  44.         "stage3_prefetch_bucket_size": "auto",
  45.         "stage3_param_persistence_threshold": "auto",
  46.         "stage3_max_live_parameters": 1e9,
  47.         "stage3_max_reuse_distance": 1e9,
  48.         "stage3_gather_16bit_weights_on_model_save": true
  49.     },
  50.     "gradient_accumulation_steps": "auto",
  51.     "gradient_clipping": "auto",
  52.     "steps_per_print": 100,
  53.     "train_batch_size": "auto",
  54.     "train_micro_batch_size_per_gpu": "auto",
  55.     "wall_clock_breakdown": false
  56. }
复制代码
创建后的ds_config_zero3.json如下图,:

把ds_config_zero3.json中的device改为cpu即可。
  1. "zero_optimization": {
  2.         "stage": 3,
  3.         "offload_optimizer": {
  4.             "device": "cpu",
  5.             "pin_memory": true
  6.         },
  7.         "offload_param": {
  8.             "device": "cpu",
  9.             "pin_memory": true
  10.         },
复制代码
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报错。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4