同时提供了LoRA微调和全量参数微调代码,关于LoRA的详细介绍可以参考论文“[LoRA: Low-Rank Adaptation of Large Language Models](https://arxiv.org/abs/2106.09685)”以及微软Github仓库[LoRA](https://github.com/microsoft/LoRA)。
Step1: 环境准备
根据requirements.txt 安装对应的环境依赖。
Step2: 数据准备
在data目录下提供了一份用于模型sft的数据样例:
训练数据:data/train_sft.csv
验证数据:data/dev_sft.csv
每个csv文件中包含一列“text”,每一行为一个训练样例,每个训练样例按照以下格式将问题和答案组织为模型输入,您可以按照以下格式自定义训练和验证数据集:
"<s>Human: "+问题+"\n</s><s>Assistant: "+答案
例如,
<s>Human: 用一句话描述地球为什么是独一无二的。</s><s>Assistant: 因为地球是目前为止唯一已知存在生命的行星。</s>
Step3: 微调脚本
LoRA微调
LoRA微调脚本见:train/sft/finetune_lora.sh,关于LoRA微调的具体实现代码见train/sft/finetune_clm_lora.py,单机多卡的微调可以通过修改脚本中的--include
localhost
:0
来实现。
全量参数微调
全量参数微调脚本见:train/sft/finetune.sh,关于全量参数微调的具体实现代码见train/sft/finetune_clm.py。
Step4: 加载微调模型
LoRA微调
基于LoRA微调的模型参数见:基于Llama2的中文微调模型,LoRA参数需要和基础模型参数结合使用。
通过PEFT加载预训练模型参数和微调模型参数,以下示例代码中,base_model_name_or_path为预训练模型参数保存路径,finetune_model_path为微调模型参数保存路径。
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel,PeftConfig
# 例如: finetune_model_path='FlagAlpha/Llama2-Chinese-7b-Chat-LoRA'
finetune_model_path=''
config = PeftConfig.from_pretrained(finetune_model_path)
# 例如: base_model_name_or_path='meta-llama/Llama-2-7b-chat'
tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path,use_fast=False)
tokenizer.pad_token = tokenizer.eos_token
device_map = "cuda:0" if torch.cuda.is_available() else "auto"
model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path,device_map=device_map,torch_dtype=torch.float16,load_in_8bit=True,trust_remote_code=True,use_flash_attention_2=True)
model = PeftModel.from_pretrained(model, finetune_model_path, device_map={"": 0})
model =model.eval()
input_ids = tokenizer(['<s>Human: 介绍一下北京\n</s><s>Assistant: '], return_tensors="pt",add_special_tokens=False).input_ids
if torch.cuda.is_available():
input_ids = input_ids.to('cuda')
generate_input = {
"input_ids":input_ids,
"max_new_tokens":512,
"do_sample":True,
"top_k":50,
"top_p":0.95,
"temperature":0.3,
"repetition_penalty":1.3,
"eos_token_id":tokenizer.eos_token_id,
"bos_token_id":tokenizer.bos_token_id,
"pad_token_id":tokenizer.pad_token_id
}
generate_ids = model.generate(**generate_input)
text = tokenizer.decode(generate_ids[0])
print(text)
全量参数微调
对于全量参数微调的模型,调用方式同模型调用代码示例,只需要修改其中的模型名称或者保存路径即可。
总结
### 文章总结本文介绍了如何使用LoRA(Low-Rank Adaptation)和全量参数微调方法对大语言模型进行适应训练。具体步骤及要点如下:
#### 1. 环境准备
- 根据`requirements.txt`文件安装项目依赖。
#### 2. 数据准备
- **训练数据**:提供位于`data/train_sft.csv`的训练样例。
- **验证数据**:提供位于`data/dev_sft.csv`的验证样例。
- 数据格式要求每行格式为`"
#### 3. 微调脚本
##### LoRA微调
- **脚本**:位于`train/sft/finetune_lora.sh`。
- **实现代码**:`train/sft/finetune_clm_lora.py`。
- **单机多卡**:可通过修改脚本中的`--include localhost:0`参数来实现。
##### 全量参数微调
- **脚本**:位于`train/sft/finetune.sh`。
- **实现代码**:`train/sft/finetune_clm.py`。
#### 4. 加载微调模型
##### LoRA微调
- **模型参数**:需结合基础模型参数使用,位置如`FlagAlpha/Llama2-Chinese-7b-Chat-LoRA`。
- **加载示例**:
- 使用`transformers`库和`peft`库加载预训练模型和微调模型的参数。
- 示例代码展示了如何设置参数、处理输入,并最终生成回答。
##### 全量参数微调
- 加载方式与LoRA微调相同,但需修改模型名称或保存路径。
#### 注意事项
- 在加载和使用微调模型时,确保`torch`和`Transformers`库环境配置正确。
- 微调模型质量的提升依赖于高质量的训练数据和合理的超参数设置。
通过本文提供的完整流程,用户可以方便地对大语言模型使用LoRA或全量参数微调方法进行调整,以适应特定应用场景的需求。