ymcui / Chinese-LLaMA-Alpaca

中文LLaMA&Alpaca大语言模型+本地CPU/GPU训练部署 (Chinese LLaMA & Alpaca LLMs)
https://github.com/ymcui/Chinese-LLaMA-Alpaca/wiki
Apache License 2.0
17.98k stars 1.84k forks source link

执行基于现有alpaca-plus进行SFT时报错,请老师帮帮忙 #834

Closed zzisbeauty closed 10 months ago

zzisbeauty commented 11 months ago

提交前必须检查以下项目

问题类型

模型训练与精调

基础模型

LLaMA-7B

操作系统

Linux

详细描述问题

No response

依赖情况(代码类问题务必提供)我执行SFT的 .sh 文件的配置

lr=1e-4
lora_rank=8
lora_alpha=32
modules_to_save="embed_tokens,lm_head"
lora_dropout=0.05
lora_trainable="q_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj"

# todo 请注意如下说明。基于已有LoRa继续训练的情况 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# 说明1:Chinese-LLaMa LoRa 分为 Chinese-LLaMa-Plus-LoRa 以及 Chinese-LLaMa-LoRa;
#       这两种模型的区别在于训练语料的尺寸不同。因此采用Chinese Plus LoRa就可以。 因此默认得到的Chinese-LLaMa-Alpaca就一种Plus,
#       因此就是默认只有一种Chinese-LLaMa-LoRa,得到仅有的一种 Chinese-LLaMa 基座模型就好了。
# 说明2:进一步SFT训练Alpaca模型:有两种: Chinese-LLaMa-Alpaca-Plus 和 Chinese-LLaMa-Alpaca-Pro 两种基座模型
#       上述两种基座模型的差异: Plus Alpaca模型的答复都过偏短; Pro是对这一问题的一些优化。  因此官方不建议使用 Plus系列的Alpaca模型
# 说明3:接下来进一步展开指令微调Alpaca:
#       3.1 基于现有的 Chinese-Alpaca LoRa权重继续训练有两种情况:
#           3.1.1:Alpaca-Plus版:基座模型用这个:合并Chinese-LLaMA-Plus-LoRA后的Chinese-LLaMA模型; 即说明1说明的模型
#           3.1.2:Alpaca-Pro版:基座模型用这个:原版HF格式LLaMA模型
#       3.2 自己重新训练Alpaca:那么基座模型直接选择 Chinese-LLaMA-LoRA后的HF格式Chinese-LLaMA模型(说明1)的模型;
#           就不用管已经训练得到 Alpaca Plus or Alpaca Pro了。因为我们自己重新训练的Alpaca和已经训练的这两个Alpaca没关系了。
#       3.3 给我造成困扰的地方:官方文章的表述给我造成了困扰,官方表述如下:
#           --model_name_or_path: 合并对应Chinese-LLaMA-LoRA后的HF格式Chinese-LLaMA模型(无论是否是Plus模型)
#           这里的 Plus说的不是Chinese-LLaMa的Plus,是是否是Alpaca的Plus

# Chinese-LLaMa base model
pretrained_model=/home/fzm/task_conversation_tuninglama2/baize-chatbot/modelllama1/mergeHFMWithChiese_llama_7b_hunggingface
# Chinese-LLaMa-Alpaca tokneizer
chinese_tokenizer_path=/home/fzm/task_conversation_tuninglama2/baize-chatbot/modelllama1/mergeHFMWithChiese_llama_alpaca_plus_7b_huggingface

# * json format data
#[
#  {"instruction" : ,
#   "input" : ...,
#   "output" : ...},
#  ...
#]
dataset_dir=/home/fzm/task_conversation_tuninglama2/Chinese-LLaMA-Alpaca/data

per_device_train_batch_size=1
per_device_eval_batch_size=1
gradient_accumulation_steps=8
output_dir=output_dir_stf_demo_data_to_test_lora_sft

validation_file=/home/fzm/task_conversation_tuninglama2/Chinese-LLaMA-Alpaca/data/valid_data_zh.json
peft_model=/home/fzm/task_conversation_tuninglama2/baize-chatbot/modelllama1/chinese_alpaca_plus_lora_7b
deepspeed_config_file=ds_zero2_no_offload.json

#继续sft训练Chinese-Alpaca模型的LoRA权重,和训练全新的LoRa参数不一样,因为这种方案一些参数是取消掉了的 - 有验证数据
torchrun --nnodes 1 --nproc_per_node 1 run_clm_sft_with_peft.py \
    --deepspeed ${deepspeed_config_file} \
    --model_name_or_path ${pretrained_model} \
    --tokenizer_name_or_path ${chinese_tokenizer_path} \
    --dataset_dir ${dataset_dir} \
    --validation_split_percentage 0.001 \
    --per_device_train_batch_size ${per_device_train_batch_size} \
    --per_device_eval_batch_size ${per_device_eval_batch_size} \
    --do_train \
    --do_eval \
    --seed $RANDOM \
    --fp16 \
    --num_train_epochs 1 \
    --lr_scheduler_type cosine \
    --learning_rate ${lr} \
    --warmup_ratio 0.03 \
    --weight_decay 0 \
    --logging_strategy steps \
    --logging_steps 10 \
    --save_strategy steps \
    --save_total_limit 3 \
    --evaluation_strategy steps \
    --eval_steps 100 \
    --save_steps 200 \
    --gradient_accumulation_steps ${gradient_accumulation_steps} \
    --preprocessing_num_workers 8 \
    --max_seq_length 512 \
    --output_dir ${output_dir} \
    --overwrite_output_dir \
    --ddp_timeout 30000 \
    --logging_first_step True \
    --torch_dtype float16 \
    --validation_file ${validation_file} \
    --peft_path ${peft_model} \
    --gradient_checkpointing \
    --ddp_find_unused_parameters False

运行日志或截图

# 请在此处粘贴运行日志

老师,我在基于Chinese-LLaMa做基础模型,对Alpaca-plus模型进行追加微调的时候,程序爆出如下错误: 微信截图_20230828174427

我看堆栈信息好像是因为 deepspeed 框架的错误。但是我没不会解决。 我的机器环境是单机4张4090。 请老师帮帮我,我该如何处理这个问题,项目中 deepspeed 的配置文件我并没有做任何改变。

zzisbeauty commented 11 months ago

老师,上面的问题我更改了 .sh 文件的配置文件如下:

也就是我把第一行的 nproc_per_node 从最初的1 改成 了 4 (因为我单机 4 卡)

#继续sft训练Chinese-Alpaca模型的LoRA权重,和训练全新的LoRa参数不一样,因为这种方案一些参数是取消掉了的 - 有验证数据
torchrun --nnodes 1 --nproc_per_node 4 run_clm_sft_with_peft.py \
    --deepspeed ${deepspeed_config_file} \
    --model_name_or_path ${pretrained_model} \
    --tokenizer_name_or_path ${chinese_tokenizer_path} \
    --dataset_dir ${dataset_dir} \
    --validation_split_percentage 0.001 \
    --per_device_train_batch_size ${per_device_train_batch_size} \
    --per_device_eval_batch_size ${per_device_eval_batch_size} \
    --do_train \
    --do_eval \
    --seed $RANDOM \
    --fp16 \
    --num_train_epochs 1 \
    --lr_scheduler_type cosine \
    --learning_rate ${lr} \
    --warmup_ratio 0.03 \
    --weight_decay 0 \
    --logging_strategy steps \
    --logging_steps 10 \
    --save_strategy steps \
    --save_total_limit 3 \
    --evaluation_strategy steps \
    --eval_steps 100 \
    --save_steps 200 \
    --gradient_accumulation_steps ${gradient_accumulation_steps} \
    --preprocessing_num_workers 8 \
    --max_seq_length 512 \
    --output_dir ${output_dir} \
    --overwrite_output_dir \
    --ddp_timeout 30000 \
    --logging_first_step True \
    --torch_dtype float16 \
    --validation_file ${validation_file} \
    --peft_path ${peft_model} \
    --gradient_checkpointing \
    --ddp_find_unused_parameters False

改为如上配置后,程序不报错,但是爆出来了 OOM的问题如下: image

这个问题让我非常奇怪,这个SFT明明是一个LoRa指令微调。为什么我单机4张4090都跑不起来,都爆出显存溢出的问题呢?

xiaoqi25478 commented 11 months ago

老师,上面的问题我更改了 .sh 文件的配置文件如下:

也就是我把第一行的 nproc_per_node 从最初的1 改成 了 4 (因为我单机 4 卡)

#继续sft训练Chinese-Alpaca模型的LoRA权重,和训练全新的LoRa参数不一样,因为这种方案一些参数是取消掉了的 - 有验证数据
torchrun --nnodes 1 --nproc_per_node 4 run_clm_sft_with_peft.py \
    --deepspeed ${deepspeed_config_file} \
    --model_name_or_path ${pretrained_model} \
    --tokenizer_name_or_path ${chinese_tokenizer_path} \
    --dataset_dir ${dataset_dir} \
    --validation_split_percentage 0.001 \
    --per_device_train_batch_size ${per_device_train_batch_size} \
    --per_device_eval_batch_size ${per_device_eval_batch_size} \
    --do_train \
    --do_eval \
    --seed $RANDOM \
    --fp16 \
    --num_train_epochs 1 \
    --lr_scheduler_type cosine \
    --learning_rate ${lr} \
    --warmup_ratio 0.03 \
    --weight_decay 0 \
    --logging_strategy steps \
    --logging_steps 10 \
    --save_strategy steps \
    --save_total_limit 3 \
    --evaluation_strategy steps \
    --eval_steps 100 \
    --save_steps 200 \
    --gradient_accumulation_steps ${gradient_accumulation_steps} \
    --preprocessing_num_workers 8 \
    --max_seq_length 512 \
    --output_dir ${output_dir} \
    --overwrite_output_dir \
    --ddp_timeout 30000 \
    --logging_first_step True \
    --torch_dtype float16 \
    --validation_file ${validation_file} \
    --peft_path ${peft_model} \
    --gradient_checkpointing \
    --ddp_find_unused_parameters False

改为如上配置后,程序不报错,但是爆出来了 OOM的问题如下: image

这个问题让我非常奇怪,这个SFT明明是一个LoRa指令微调。为什么我单机4张4090都跑不起来,都爆出显存溢出的问题呢?

把之前的程序进程都清掉看看是否是这个原因

zzisbeauty commented 11 months ago

老师,上面的问题我更改了 .sh 文件的配置文件如下: 也就是我把第一行的 nproc_per_node 从最初的1 改成 了 4 (因为我单机 4 卡)

#继续sft训练Chinese-Alpaca模型的LoRA权重,和训练全新的LoRa参数不一样,因为这种方案一些参数是取消掉了的 - 有验证数据
torchrun --nnodes 1 --nproc_per_node 4 run_clm_sft_with_peft.py \
    --deepspeed ${deepspeed_config_file} \
    --model_name_or_path ${pretrained_model} \
    --tokenizer_name_or_path ${chinese_tokenizer_path} \
    --dataset_dir ${dataset_dir} \
    --validation_split_percentage 0.001 \
    --per_device_train_batch_size ${per_device_train_batch_size} \
    --per_device_eval_batch_size ${per_device_eval_batch_size} \
    --do_train \
    --do_eval \
    --seed $RANDOM \
    --fp16 \
    --num_train_epochs 1 \
    --lr_scheduler_type cosine \
    --learning_rate ${lr} \
    --warmup_ratio 0.03 \
    --weight_decay 0 \
    --logging_strategy steps \
    --logging_steps 10 \
    --save_strategy steps \
    --save_total_limit 3 \
    --evaluation_strategy steps \
    --eval_steps 100 \
    --save_steps 200 \
    --gradient_accumulation_steps ${gradient_accumulation_steps} \
    --preprocessing_num_workers 8 \
    --max_seq_length 512 \
    --output_dir ${output_dir} \
    --overwrite_output_dir \
    --ddp_timeout 30000 \
    --logging_first_step True \
    --torch_dtype float16 \
    --validation_file ${validation_file} \
    --peft_path ${peft_model} \
    --gradient_checkpointing \
    --ddp_find_unused_parameters False

改为如上配置后,程序不报错,但是爆出来了 OOM的问题如下: image 这个问题让我非常奇怪,这个SFT明明是一个LoRa指令微调。为什么我单机4张4090都跑不起来,都爆出显存溢出的问题呢?

把之前的程序进程都清掉看看是否是这个原因

清理了,依然起不来。

xiaoqi25478 commented 11 months ago

老师,上面的问题我更改了 .sh 文件的配置文件如下: 也就是我把第一行的 nproc_per_node 从最初的1 改成 了 4 (因为我单机 4 卡)

#继续sft训练Chinese-Alpaca模型的LoRA权重,和训练全新的LoRa参数不一样,因为这种方案一些参数是取消掉了的 - 有验证数据
torchrun --nnodes 1 --nproc_per_node 4 run_clm_sft_with_peft.py \
    --deepspeed ${deepspeed_config_file} \
    --model_name_or_path ${pretrained_model} \
    --tokenizer_name_or_path ${chinese_tokenizer_path} \
    --dataset_dir ${dataset_dir} \
    --validation_split_percentage 0.001 \
    --per_device_train_batch_size ${per_device_train_batch_size} \
    --per_device_eval_batch_size ${per_device_eval_batch_size} \
    --do_train \
    --do_eval \
    --seed $RANDOM \
    --fp16 \
    --num_train_epochs 1 \
    --lr_scheduler_type cosine \
    --learning_rate ${lr} \
    --warmup_ratio 0.03 \
    --weight_decay 0 \
    --logging_strategy steps \
    --logging_steps 10 \
    --save_strategy steps \
    --save_total_limit 3 \
    --evaluation_strategy steps \
    --eval_steps 100 \
    --save_steps 200 \
    --gradient_accumulation_steps ${gradient_accumulation_steps} \
    --preprocessing_num_workers 8 \
    --max_seq_length 512 \
    --output_dir ${output_dir} \
    --overwrite_output_dir \
    --ddp_timeout 30000 \
    --logging_first_step True \
    --torch_dtype float16 \
    --validation_file ${validation_file} \
    --peft_path ${peft_model} \
    --gradient_checkpointing \
    --ddp_find_unused_parameters False

改为如上配置后,程序不报错,但是爆出来了 OOM的问题如下: image 这个问题让我非常奇怪,这个SFT明明是一个LoRa指令微调。为什么我单机4张4090都跑不起来,都爆出显存溢出的问题呢?

把之前的程序进程都清掉看看是否是这个原因

清理了,依然起不来。

1.方式1:看报错信息 if reserver_mem > allocated_mem ... 你的reserver_mem确实远远大于 allocated_mem image 可以试试按照报错建议的那样去做 2.开offload_optimizer

xiaoqi25478 commented 11 months ago

3.开zero3

zzisbeauty commented 11 months ago

3.开zero3

老师我有以下几个问题,请老师再指点一下我:

  1. 关于老师说的第一点方案,我找到了这样的一个参考给出了一些设置方法:连接 。但是我没看懂什么是保留内存远远大于已分配内存。也就是说报错日志里,哪个数字是个保留内存,哪个数字是个已分配内存,您才确认了我的保留内存确实远远大于已分配内存。
  2. 关于您说的 2 方案:开offload_optimizer,我不清楚这个参数是什么意思,但是我看到 deepspeed.config 好像是关于这个参数的设置的,这个配置文件的文件包含 *no_offload.json。但是我打开了这个文件,不清楚该如何设置您说的这个 offload_optimizer 参数。
  3. 关于您说的第三点方案:开zero3,又是在哪里配置呢?

我确实用不太好这些配置与代码。因此期待得到您的指点。感恩。 @xiaoqi25478

xiaoqi25478 commented 11 months ago

3.开zero3

老师我有以下几个问题,请老师再指点一下我:

  1. 关于老师说的第一点方案,我找到了这样的一个参考给出了一些设置方法:连接 。但是我没看懂什么是保留内存远远大于已分配内存。也就是说报错日志里,哪个数字是个保留内存,哪个数字是个已分配内存,您才确认了我的保留内存确实远远大于已分配内存。
  2. 关于您说的 2 方案:开offload_optimizer,我不清楚这个参数是什么意思,但是我看到 deepspeed.config 好像是关于这个参数的设置的,这个配置文件的文件包含 *no_offload.json。但是我打开了这个文件,不清楚该如何设置您说的这个 offload_optimizer 参数。
  3. 关于您说的第三点方案:开zero3,又是在哪里配置呢?

我确实用不太好这些配置与代码。因此期待得到您的指点。感恩。 @xiaoqi25478

zero2配置:https://gitee.com/xiaoqi25478/Chinese-LLaMA-Alpaca-1_mlu/blob/main/scripts/training/ds_zero2_no_offload.json zero3配置:https://gitee.com/xiaoqi25478/Chinese-LLaMA-Alpaca-1_mlu/blob/main/scripts/training/ds_zero3_no_offload.json

zzisbeauty commented 11 months ago

3.开zero3

老师我有以下几个问题,请老师再指点一下我:

  1. 关于老师说的第一点方案,我找到了这样的一个参考给出了一些设置方法:连接 。但是我没看懂什么是保留内存远远大于已分配内存。也就是说报错日志里,哪个数字是个保留内存,哪个数字是个已分配内存,您才确认了我的保留内存确实远远大于已分配内存。
  2. 关于您说的 2 方案:开offload_optimizer,我不清楚这个参数是什么意思,但是我看到 deepspeed.config 好像是关于这个参数的设置的,这个配置文件的文件包含 *no_offload.json。但是我打开了这个文件,不清楚该如何设置您说的这个 offload_optimizer 参数。
  3. 关于您说的第三点方案:开zero3,又是在哪里配置呢?

我确实用不太好这些配置与代码。因此期待得到您的指点。感恩。 @xiaoqi25478

zero2配置:https://gitee.com/xiaoqi25478/Chinese-LLaMA-Alpaca-1_mlu/blob/main/scripts/training/ds_zero2_no_offload.json zero3配置:https://gitee.com/xiaoqi25478/Chinese-LLaMA-Alpaca-1_mlu/blob/main/scripts/training/ds_zero3_no_offload.json

我copy了老师发给我的 zero3 的配置文件,然后让deepspeed的配置指向这个文件,就出来这个错误了: image

我找到了如下的参考:连接 但是我依然不清楚我该如何配置。:cry

或者说,我是单机四卡,我有没有办法我不使用 deepspeed框架呢? 这个框架它应该是对于多机训练更为有效。可我是单机。我不喜欢这个框架,觉得它好难使用很麻烦。

github-actions[bot] commented 10 months ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your consideration.

github-actions[bot] commented 10 months ago

Closing the issue, since no updates observed. Feel free to re-open if you need any further assistance.

lyccyl1 commented 3 weeks ago

这个错误需要设置low_cpu_mem_usage=False并且注释掉device_map=xxx