LoRA微调和模型量化

提供LoRA微调和全量参数微调代码,训练数据data/train_sft.csv,验证数据为data/dev_sft.csv数据格式"<s>Human: "+问题+"\n</s><s>Assistant: "+答案。本文主要介绍Llama-2-7b模型LoRA微调以及4bit量化的实践过程。
1.LoRA微调脚本
  LoRA微调脚本train/sft/finetune_lora.sh如下所示:
2.LoRA微调代码
  LoRA微调具体实现代码train/sft/finetune_clm_lora.py参考文献[3]。这里要说明下HuggingFace开源的一个高效微调大模型的PEFT库,目前支持很多方法和模型,详见参考文献[4][5]。LoRA(Low-Rank Adaptation)的本质就是奇异值分解,使用包含矩阵能量的秩来近似和还原原始矩阵,这样就可以将平方复杂度转换为线性复杂度了。本人读研期间做了很长时间的概率矩阵分解,对此有所理解。核心代码如下所示:
3.加载LoRA微调模型
  加载LoRA微调模型需要通过PEFT加载预训练模型参数和微调模型参数,base_model_name_or_path为预训练模型参数保存路径,finetune_model_path为微调模型参数保存路径。核心代码如下所示:
4.模型量化和加载方式
  模型量化和LoRA微调具体实现代码train/sft/finetune_clm_lora.py参考文献[3]。修改ModelArguments类中的load_in_bits: Optional[int] = field(default=4)。本质上就是先对模型做量化,然后再LoRA微调。核心代码如下所示:
  虽然LoRA微调和模型量化代码走通了,但是里面涉及到很多细节知识点需要深挖,比如LoRA具体代码实现[4][5][6],peft库支持微调方法(LoRA|Prefix Tuning|P-Tuning v1|P-Tuning v2|Prompt Tuning|AdaLoRA|LLaMA-Adapter|IA3)和模型(Causal Language Modeling|Conditional Generation|Sequence Classification|Token Classification|Text-to-Image Generation|Image Classification|Image to text (Multi-modal models)|Semantic Segmentation)的具体代码实现[4][5],模型量化(混合精度训练、4bit、8bit、fp16、fp32、bf16、AutoGPTQ库和bitsandbytes库)等。不管怎样先实践起来,更高一层的实践才能够理解低一层的理论。
参考文献