行业知识
Llama中文大模型-模型微调
同���提供了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”,每一行为一个训练样例,每个训练样例按照以下格式将问题和答案组织为模型输入,您可以按照以下格式自定义训练和验证数据集:
"Human: "+问题+"\nAssistant: "+答案
例如,
Human: 用一句话描述地球为什么是独一无二的。Assistant: 因为地球是目前为止唯一已知存在生命的行星。
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 torchfrom transformers import AutoTokenizer, AutoModelForCausalLMfrom 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_tokendevice_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(['Human: 介绍一下北京\nAssistant: '], return_tensors="pt",add_special_tokens=False).input_idsif 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)全量参数微调
对于全量参数微调的模型,调用方式同模型调用代码示例,只需要修改其中的模型名称或者保存路径即可。
下一篇:机房承重架哪里做?