大语言模型微调和PEFT高效微调

1 解释说明

  • 预训练语言模型的成功,证明了我们可以从海量的无标注文本中学到潜在的语义信息,而无需为每一项下游NLP任务单独标注大量训练数据。此外,预训练语言模型的成功也开创了NLP研究的新范式,即首先使用大量无监督语料进行语言模型预训练(Pre-training),再使用少量标注语料进行微调(Fine-tuning)来完成具体NLP任务。

1.1 预训练阶段

  • 大模型首先在大量的无标签数据上进行训练,预训练的最终目的是让模型学习到语言的统计规律和一般知识。在这个过程中模型能够学习到词语的语义、句子的语法结构、以及文本的一般知识和上下文信息。需要注意的是,预训练本质上是一个无监督学习过程。

1.2 微调阶段

  • 预训练好的模型然后在特定任务的数据上进行进一步的训练。这个过程通常涉及对模型的权重进行微小的调整,以使其更好地适应特定的任务。不同于模型预训练过程可以代入无标签样本,深度学习模型微调过程需要代入有标签的样本来进行训练,微调的本质是一个有监督学习过程。

2 几种微调算法

  • 伴随着大模型技术的蓬勃发展,微调技术一跃成为大模型工程师必须要掌握的核心技术,越来越多的微调技术也在不断涌现。大模型微调重要性不言而喻,那么到底有哪些微调方法呢?

2.1 在线微调

  • 借助OpenAl提供的在线微调工具进行微调;
  • 在线微调API地址
  • 按照格式要求,准备并上传数据集;
  • 排队、支付费用并等待微调模型训练完成;
  • 赋予微调模型API单独编号,调用API即可使用。

2.2 高效微调

  • 高效微调State-of-the-art Parameter-Efficient Fine-Tuning (SOTA PEFT)特指部分参数的微调方法,这种方法算力功耗比更高,也是目前最为常见的微调方法;
  • 除此之外,Fine-Tuning也可以代指全部微调方法,同时OpenAl中模型微调API的名称也是Fine-Tuning,需要注意的是,OpenAI提供的在线微调方法也是一种高效微调方法,并不是全量微调。
  • 主流高效微调方法包括LoRAPrefix TuningP-TuningPrompt TuningAdaLoRA等;
  • 目前这些方法的实现均已集成至Hugging Face项目的库中,我们可以通过安装和调用Hugging Face的PEFT(高效微调)库,来快速使用这些方法;
  • 高效微调仓库

2.2.1 RLHF

  • RLHF: Reinforcement Learning from Human Feedback,即基于人工反馈机制的强化学习。最早与2022年4月,由OpenAl研究团队系统总结并提出,并在GPT模型的对话类任务微调中大放异彩,被称为ChatGPT“背后的功臣”;
  • 最早由OpenAl研究团队提出,并用于训练OpenAl的InstructGPT模型,根据OpenAl相关论文说明,基于RLHF训练的InstructGPT模型,在仅拥有1.3B参数量的情况下,输出效果已经和GPT-3 175B模型媲美。这充分说明了RLHF方法的实践效果;
  • RLHF也是目前为止常用的、最为复杂的基于强化学习的大语言模型微调方法,目前最好的端到端RLHF实现是DeepSpeedChat库,由微软开源并维护。
  • 步骤1:监督微调(SFT)——使用精选的人类回答来微调预训练的语言模型以应对各种查询;
  • 步骤2:奖励模型微调——使用一个包含人类对同一查询的多个答案打分的数据集来训练一个独立的(通常比SFT小的)奖励模型(RW);
  • 步骤3:RLHF训练——利用 Proximal Policy Optimization(PPO)算法,根据RW模型的奖励反馈进一步微调SFT模型。

2.2.2 LoRA

  • LoRA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS (2021)基于低阶自适应的大语言模型微调方法
  • 原理简述:基于大模型的内在低秩特性,增加旁路矩阵来模拟全参数微调。简而言之,是通过修改模型结构进行微调,是一种四两拨千斤的微调方法,是目前最通用、同时也是效果最好的微调方法之一;
  • LoRA最早是由微软研究院发布的一项微调技术,LoRA除了可以用于微调大语言模型(LLM)外,目前还有一个非常火爆的应用场景:围绕diffusion models(扩散模型)进行微调,并在图片生成任务中表现惊艳。

2.2.3 Prefix Tuning

  • Prefix-Tuning: Optimizing Continuous Prompts for Generation (2021)基于提示词前缀优化的微调方法,来源于斯坦福大学的一种高效微调方法;
  • 原理简述:在原始模型基础上,增加一个可被训练的Embedding层,用于给提示词增加前缀,从而让模型更好的理解提示词意图,并在训练过程中不断优化这些参数
  • Prefix Tuning既能够在模型结构上增加一些新的灵活性,又能够在模型使用上提供一种自动的、能够改进模型表现的提示机制。

2.2.4 Prompt Tuning

  • The Power of Scale for Parameter-Efficient Prompt Tuning (2021),由谷歌提出的一种轻量级的优化方法;
  • 原理简述:该方法相当于是Prefix Tuning的简化版本,即无需调整模型参数,而是在已有的参数中,选择一部分参数作为可学习参数,用于创建每个Prompt的前缀,从而帮助模型更好地理解和处理特定的任务;
  • 不同于Prefix方法,Prompt Tuning训练得到的前缀是具备可解释性的,我们可以通过查看这些前缀,来查看模型是如何帮我们优化prompt的;
  • 该方法在参数规模非常大的模型微调时效果很好,当参数规模达到100亿时和全量微调效果一致。

2.2.5 P-Tuning v2

  • P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks (2022),来源于清华大学团队提出的高效微调方法;
  • 原理简述:可以理解为Prefix tuning的改进版本,即P-Tuning v2不仅在输入层添加了连续的prompts(可被训练的Embedding层),而且还在预训练模型的每一层都添加了连续的prompts
  • 这种深度的prompt tuning增加了连续prompts的容量,出于某些原因,P-Tuning v2会非常适合GLM这种双向预训练大模型微调。
<think>好的,我现在需要帮助一个Python新手理解如何本地微调大模型,特别是DeepSeek模型。用户希望得到分步骤的指导,包括Python库安装、微调代码框架、模型保存以及基础模型与微调后的合并方法。我需要确保回答清晰、结构合理,并且适合新手理解。 首先,用户是Python新手,所以安装库的命令需要明确,可能还需要简要说明每个库的作用。比如,transformers、torch、peft、bitsandbytes、trl这些库,用户可能不熟悉,需要简单解释。 接下来,微调的代码框架部分。用户需要具体的代码示例,但作为新手,可能需要更详细的注释。我需要确保代码结构简单,避免复杂参数,同时覆盖数据加载、模型设置、训练参数训练循环。可能还需要提到数据格式,比如JSON的结构,因为用户可能有自己的数据集需要准备。 模型保存部分,要说明如何保存微调后的模型,可能包括保存整个模型或者仅保存适配器部分。这里可能需要区分不同的微调方法,比如全参数微调LoRA,但用户可能使用的是LoRA,所以保存合并的方法需要对应。 基础模型与微调模型的合并是关键步骤,用户可能需要知道如何将LoRA适配器合并回基础模型,以便后续推理。这部分需要提供代码示例,并说明合并后的保存方式。 另外,注意事项部分需要考虑新手常见的问题,比如路径错误、依赖版本冲突、硬件要求等。需要提醒用户检查CUDA版本、库的兼容性,以及显存不足时的应对措施。 在组织回答时,应该分步骤进行,每个部分都有明确的标题,如安装库、代码框架、模型保存、合并模型等。代码块需要用正确的格式显示,并添加注释帮助理解。同时,要使用简单的中文,避免技术术语过多,或在必要时进行解释。 需要验证代码示例是否正确,比如检查是否有拼写错误,是否正确使用Hugging Face的API,比如SFTTrainer的参数是否正确。例如,dataset_text_field是否对应数据中的字段,以及peft_config是否正确配置。还要确保示例中的超参数适合新手使用,比如较小的batch size合理的学习率。 可能还需要提到数据准备的具体例子,比如如何将CSV或文本数据转换成所需的JSON格式,指导用户如何构建自己的数据集。但用户的问题中没有提到数据准备的具体步骤,所以可能不需要展开,但可以简要提及数据格式要求。 最后,确保所有步骤都覆盖了用户的需求:安装、微调代码、保存、合并。并在注意事项中提醒资源监控版本兼容性,帮助用户避免常见陷阱。</think>以下是针对Python新手的本地大模型微调分步指南,包含完整的代码框架操作流程: --- ### 一、Python库安装及命令 ```bash # 基础环境(建议使用Python 3.10) pip install torch==2.0.1+cu117 --extra-index-url https://download.pytorch.org/whl/cu117 pip install transformers==4.37.0 pip install peft==0.6.0 # 参数高效微调库 pip install bitsandbytes==0.41.1 # 量化支持 pip install trl==0.7.4 # 强化学习库 pip install accelerate==0.24.1 # 分布式训练 ``` --- ### 二、微调代码框架(以QLoRA为例) ```python from transformers import ( AutoModelForCausalLM, AutoTokenizer, TrainingArguments, BitsAndBytesConfig ) from peft import LoraConfig from trl import SFTTrainer import json # 1. 加载基础模型分词器 model_name = "deepseek-ai/deepseek-llm-7b-chat" tokenizer = AutoTokenizer.from_pretrained(model_name) # 2. 配置4位量化 bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16 ) model = AutoModelForCausalLM.from_pretrained( model_name, quantization_config=bnb_config, device_map="auto" ) # 3. 配置LoRA参数 peft_config = LoraConfig( r=16, # 秩维度 lora_alpha=32, # 缩放系数 target_modules=["q_proj", "v_proj"], # 修改的注意力层 lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) # 4. 加载训练数据(示例格式) with open("train_data.json", "r") as f: train_data = json.load(f) # 5. 配置训练参数 training_args = TrainingArguments( output_dir="./results", num_train_epochs=3, per_device_train_batch_size=2, # 根据显存调整 gradient_accumulation_steps=4, # 梯度累积 learning_rate=2e-4, fp16=True, logging_steps=10, optim="paged_adamw_8bit" ) # 6. 创建训练器 trainer = SFTTrainer( model=model, train_dataset=train_data, peft_config=peft_config, dataset_text_field="text", # 数据字段名 max_seq_length=1024, tokenizer=tokenizer, args=training_args ) # 7. 开始训练 trainer.train() ``` --- ### 三、模型保存方法 ```python # 保存完整微调模型(适配器+基础模型) trainer.model.save_pretrained("./full_fine_tuned_model") # 仅保存适配器(推荐方式) trainer.model.save_pretrained("./lora_adapter") # 保存分词器 tokenizer.save_pretrained("./lora_adapter") ``` --- ### 四、模型合并操作 ```python from peft import PeftModel # 1. 加载基础模型 base_model = AutoModelForCausalLM.from_pretrained( "deepseek-ai/deepseek-llm-7b-chat", device_map="auto" ) # 2. 加载适配器 merged_model = PeftModel.from_pretrained( base_model, "./lora_adapter" ) # 3. 合并模型 merged_model = merged_model.merge_and_unload() # 4. 保存最终模型 merged_model.save_pretrained("./merged_model") tokenizer.save_pretrained("./merged_model") ``` --- ### 五、使用示例 ```python # 加载合并后的模型 model = AutoModelForCausalLM.from_pretrained("./merged_model") tokenizer = AutoTokenizer.from_pretrained("./merged_model") # 生成文本 inputs = tokenizer("请写一首关于春天的诗:", return_tensors="pt") outputs = model.generate( inputs.input_ids, max_length=200, temperature=0.7 ) print(tokenizer.decode(outputs[0])) ``` --- ### 六、注意事项 1. **数据格式要求**: ```json [ { "text": "Instruction: 写邮件\nInput: 请假三天\nOutput: 尊敬的领导,因身体不适..." }, // 更多数据... ] ``` 2. **硬件建议**: - 最低配置:RTX 3090 (24GB显存) - 推荐配置:A100 40GB 3. **常见问题**: - 遇到CUDA内存不足时:减小`per_device_batch_size` - 确保所有库版本严格匹配 - 训练前运行`nvidia-smi`监控显存使用 4. **学习资源**: - Hugging Face文档:https://huggingface.co/docs - PEFT官方示例:https://github.com/huggingface/peft 建议从官方提供的示例数据集开始实验,成功运行后再替换为自己的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SaN-V

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值