Vicuna-LoRA-RLHF-PyTorch
在消费者硬件上使用LoRA和RLHF对Vicuna LLM进行微调的完整流程
目录
环境设置
穷人卡:2080Ti 12G
torch==2.0.0
cuda==11.8
待办清单
- 下载Vicuna权重
- SFT: 监督微调
- 合并适配器到模型中
- RLHF
- 训练奖励模型
- 使用RL进行调整
运行
下载Vicuna权重
python apply_delta.py --base 'decapoda-research/llama-7b-hf' --target './weights/vicuna-7b' --delta lmsys/vicuna-7b-delta-v1.1
监督微调
先检查 src/peft/utils/save_and_load.py ,只需将第52行注释掉
# #to_return = {k: v for k, v in to_return.items() if (("lora_" in k and adapter_name in k) or ("bias" in k))}
然后运行
python supervised_finetune.py --data_path './data/merge_sample.json' --output_path 'lora-Vicuna' --model_path './weights/vicuna-7b' --eval_steps 200 --save_steps 200 --test_size 1
合并PEFT适配器到模型中
首先检查peft版本,如果不是0.2.0,则需安装peft==0.2.0
pip uninstall peft -y
pip install peft==0.2.0 # 0.3.0.dev0有很多错误
python merge_peft_adapter.py --model_name 'lora-Vicuna'
pip uninstall peft -y
pip install git+https://github.com/huggingface/peft.git # 然后注释掉 peft/utis/save_and_load.py 第52行。
训练奖励模型
python train_reward_model.py --model_name './weights/vicuna-7b' --gradient_accumulation_steps 32 --per_device_train_batch_size 1 --train_subset 100 --eval_subset 10 --local_rank 0 --bf16 False
合并奖励适配器到模型中
python merge_peft_adapter.py --model_name ./reward_model_vicuna-7b
使用PPO调整LM
python tuning_lm_with_rl.py --model_name './lora-Vicuna-adapter-merged' --reward_model_name './reward_model_vicuna-7b-adapter-merged' --adafactor False --tokenizer_name 'decapoda-research/llama-7b-hf' --save_freq 100 --output_max_length 128 --batch_size 1 --gradient_accumulation_steps 1 --batched_gen True --ppo_epochs 1 --seed 0 --learning_rate 1.4e-5 --early_stopping True --output_dir './tuning_llama_rl_checkpoints'
主题
- Vicuna模型权重不在HuggingFace hub上,因此你需要首先运行apply_delta.py脚本来下载。
- SFT之前,切记有个注意事项,需要检查安装的peft代码,src/peft/utils/save_and_load.py,如果第52行有这行代码 #to_return = {k: v for k, v in to_return.items() if (("lora_" in k and adapter_name in k) or ("bias" in k))},需要将其注释掉,否则在微调完之后,无法保存adapter模型的参数。切记!
- PEFT的版本,目前从git上安装的是0.3.0.dev0版本,在合并PEFT适配器的时候有问题,需要切换到peft==0.2.0 (0.3.0.dev0 没有 _get_submodules()这个函数)
- 训练奖励模型的时候会发生另一个问题:ValueError: weight is on the meta device, we need a
value
to put in on 0. 需要查看transformer在github上的最新代码,我在发现这个问题的时候,隔天发现在transformer的github上8小时前才刚刚修复了这个问题。 - 最后一步,代码上基本是ok的,但我只有2080Ti的显卡,加载完微调模型之后,再加载奖励模型时直接CUDA内存不足,因此未执行。
参考文献
requirements 主要是按照 alpaca-lora 来配置环境。
- https://github.com/lm-sys/FastChat
- https://github.com/tloen/alpaca-lora
- https://github.com/lvwerra/trl
- https://github.com/jasonvanf/llama-trl
Star历史
捐赠
如果这个项目帮助你减少开发时间,可以请我喝杯咖啡 :)
支付宝
微信支付
许可
MIT © Kun