ymcui / Chinese-LLaMA-Alpaca

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

为啥自己训练的Chinese-Alpaca-Pro-33B的SFT的LoRA权重只有1.3G大小?本项目里是2.1G。 #811

Closed xuexidi closed 1 year ago

xuexidi commented 1 year ago

提交前必须检查以下项目

问题类型

模型训练与精调

基础模型

LLaMA-33B

操作系统

Linux

详细描述问题

您好,非常感谢您的开源! 我按照您的流程走了一遍33B的模型PT和SFT。我发现我最终得到的SFT的LoRA权重只有1.3G左右,且能正常推理,但是我发现您项目里Chinese-Alpaca-Pro-33B的LoRA权重有2.1G大小,不知道造成LoRA大小差别这么大的原因在哪里,担心是不是哪个环节没搞对。想请教一下您。 硬件:2 * A800 80G 我的流程如下: 1、下载Meta原版LLaMA-33B 2、把LLaMA-33B转换成HF格式,得到HF格式的LLaMA-33B,即LLaMA-33B-HF 3、LLaMA-33B-HF与chinese_llama_plus_lora_33b合并,得到chinese_llama_plus_merged模型(HF格式) 4、基于chinese_llama_plus_merged模型进行PT训练(deepspeed stage2, offload),训练全新的LoRA权重。得到PT模式下的LoRA权重。 5、把chinese_llama_plus_merged模型与PT模式下的LoRA权重合并,得到chinese_llama_plus_pt_merged模型。 6、基于chinese_llama_plus_pt_merged模型进行SFT训练(deepspeed stage2, offload),tokenizer用的是您项目里Chinese-Alpaca-Pro-33B的LoRA权重文件夹下的tokennizer。训练完毕得到SFT模式下的LoRA权重,此时发现该SFT的adapter_model.bin大小只有1.3G左右,虽然只训练了500 steps,拟合的也是比较简单的指令对话,但是推理测试发现确实会按照指令微调格式进行回复了。

问题:为啥我得到的SFT的LoRA权重只有1.3G左右,而您项目里Chinese-Alpaca-Pro-33B的LoRA权重有2.1G大小呢?

如下是我的run_sft.sh内容:

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

pretrained_model=/home/xue/codes/Chinese-LLaMA-Alpaca-main/scripts/training/merged_models/Chinese-llama_pyPT_33B_merge_HF
chinese_tokenizer_path=/home/xue/codes/Chinese-LLaMA-Alpaca-main/scripts/training/chinese_alpaca_pro_lora_33b
dataset_dir=/home/xue/codes/Chinese-LLaMA-Alpaca-main/data/robotqa-data
per_device_train_batch_size=1
per_device_eval_batch_size=1
training_steps=2000
gradient_accumulation_steps=1
output_dir=output_sft_0803
peft_model=path/to/peft/model/dir
validation_file=/home/xue/codes/Chinese-LLaMA-Alpaca-main/data/robotqa-data/glm_robot_datasets.json

deepspeed_config_file=ds_zero2_offload_sft.json

torchrun --nnodes 1 --nproc_per_node 2 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 \
    --seed ${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 \
    --save_steps 500 \
    --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 \
    --lora_rank ${lora_rank} \
    --lora_alpha ${lora_alpha} \
    --trainable ${lora_trainable} \
    --modules_to_save ${modules_to_save} \
    --lora_dropout ${lora_dropout} \
    --torch_dtype float16 \
    --gradient_checkpointing \
    --ddp_find_unused_parameters False

deepspeed的json配置如下:

{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 100,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1e-10
    },

    "zero_optimization": {
        "stage": 2,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "allgather_partitions": true,
        "allgather_bucket_size": 1e8,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": 1e8,
        "contiguous_gradients": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 2000,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}

期待您的解答,谢谢您!

依赖情况(代码类问题务必提供)

# 请在此处粘贴依赖情况

运行日志或截图

# 请在此处粘贴运行日志
ymcui commented 1 year ago

可能是因为你用FP16存储的?

xuexidi commented 1 year ago

可能是因为你用FP16存储的?

我看您代码里写的都是fp16类型的,关于数据类型我没有做其他修改,那么按理来说应该跟您的LoRA权重大小是一样的吧? 或者,您在训练和保存的时候用的不是fp16吗?

我PT阶段的LoRA权重大小跟您的Chinese-LLaMA-Plus-33B的LoRA权重大小一样,都是1.3G左右。 SFT阶段权重大小差距有点大

iMountTai commented 1 year ago

Plus阶段的SFT训练我们增大了RANK=64,所以对于33B模型来讲可训参数增加的较多(约426M),最终模型的大小也会受此影响变大,您的模型的大小和llama-plus的大小相同,是因为都是rank=8训练的。

xuexidi commented 1 year ago

Plus阶段的SFT训练我们增大了RANK=64,所以对于33B模型来讲可训参数增加的较多(约426M),最终模型的大小也会受此影响变大,您的模型的大小和llama-plus的大小相同,是因为都是rank=8训练的。

原来如此,那就解释得通了,非常感谢您的开源和解答!!!

github-actions[bot] commented 1 year 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.

XuJianzhi commented 1 year ago

提交前必须检查以下项目

  • [x] 请确保使用的是仓库最新代码(git pull),一些问题已被解决和修复。
  • [x] 由于相关依赖频繁更新,请确保按照Wiki中的相关步骤执行
  • [x] 我已阅读FAQ章节并且已在Issue中对问题进行了搜索,没有找到相似问题和解决方案
  • [x] 第三方插件问题:例如llama.cpptext-generation-webuiLlamaChat等,同时建议到对应的项目中查找解决方案
  • [x] 模型正确性检查:务必检查模型的SHA256.md,模型不对的情况下无法保证效果和正常运行

问题类型

模型训练与精调

基础模型

LLaMA-33B

操作系统

Linux

详细描述问题

您好,非常感谢您的开源! 我按照您的流程走了一遍33B的模型PT和SFT。我发现我最终得到的SFT的LoRA权重只有1.3G左右,且能正常推理,但是我发现您项目里Chinese-Alpaca-Pro-33B的LoRA权重有2.1G大小,不知道造成LoRA大小差别这么大的原因在哪里,担心是不是哪个环节没搞对。想请教一下您。 硬件:2 * A800 80G 我的流程如下: 1、下载Meta原版LLaMA-33B 2、把LLaMA-33B转换成HF格式,得到HF格式的LLaMA-33B,即LLaMA-33B-HF 3、LLaMA-33B-HF与chinese_llama_plus_lora_33b合并,得到chinese_llama_plus_merged模型(HF格式) 4、基于chinese_llama_plus_merged模型进行PT训练(deepspeed stage2, offload),训练全新的LoRA权重。得到PT模式下的LoRA权重。 5、把chinese_llama_plus_merged模型与PT模式下的LoRA权重合并,得到chinese_llama_plus_pt_merged模型。 6、基于chinese_llama_plus_pt_merged模型进行SFT训练(deepspeed stage2, offload),tokenizer用的是您项目里Chinese-Alpaca-Pro-33B的LoRA权重文件夹下的tokennizer。训练完毕得到SFT模式下的LoRA权重,此时发现该SFT的adapter_model.bin大小只有1.3G左右,虽然只训练了500 steps,拟合的也是比较简单的指令对话,但是推理测试发现确实会按照指令微调格式进行回复了。

问题:为啥我得到的SFT的LoRA权重只有1.3G左右,而您项目里Chinese-Alpaca-Pro-33B的LoRA权重有2.1G大小呢?

如下是我的run_sft.sh内容:

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

pretrained_model=/home/xue/codes/Chinese-LLaMA-Alpaca-main/scripts/training/merged_models/Chinese-llama_pyPT_33B_merge_HF
chinese_tokenizer_path=/home/xue/codes/Chinese-LLaMA-Alpaca-main/scripts/training/chinese_alpaca_pro_lora_33b
dataset_dir=/home/xue/codes/Chinese-LLaMA-Alpaca-main/data/robotqa-data
per_device_train_batch_size=1
per_device_eval_batch_size=1
training_steps=2000
gradient_accumulation_steps=1
output_dir=output_sft_0803
peft_model=path/to/peft/model/dir
validation_file=/home/xue/codes/Chinese-LLaMA-Alpaca-main/data/robotqa-data/glm_robot_datasets.json

deepspeed_config_file=ds_zero2_offload_sft.json

torchrun --nnodes 1 --nproc_per_node 2 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 \
    --seed ${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 \
    --save_steps 500 \
    --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 \
    --lora_rank ${lora_rank} \
    --lora_alpha ${lora_alpha} \
    --trainable ${lora_trainable} \
    --modules_to_save ${modules_to_save} \
    --lora_dropout ${lora_dropout} \
    --torch_dtype float16 \
    --gradient_checkpointing \
    --ddp_find_unused_parameters False

deepspeed的json配置如下:

{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 100,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1e-10
    },

    "zero_optimization": {
        "stage": 2,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "allgather_partitions": true,
        "allgather_bucket_size": 1e8,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": 1e8,
        "contiguous_gradients": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 2000,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}

期待您的解答,谢谢您!

依赖情况(代码类问题务必提供)

# 请在此处粘贴依赖情况

运行日志或截图

# 请在此处粘贴运行日志

老哥,你好,请问一张a800(80g)能训起来33b吗?你试过吗?参数调小也可以 我试着貌似不行