本篇文章给大家谈谈使用ORPO 微调Llama 3,以及对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
我们将使用ORPO 和TRL 库来微调新的Llama 3 8b 模型。
奥尔普
指令调整和偏好对齐是使大型语言模型(LLM) 适应特定任务的基本技术。这涉及到多阶段过程:1。监督微调(SFT)指令以使模型适应目标域; 2. 偏好校准,例如利用人类反馈的强化学习(RLHF) 或直接偏好优化(DPO),以增加产生偏好响应的可能性。
虽然SFT 有效地使模型适应所需的领域,但它无意中增加了生成不需要的和首选的答案的概率。这就是为什么需要第二阶段的偏好校准,通过该阶段可以扩大偏好输出和拒绝输出的可能性之间的差距。
ORPO 通过将指令调整和偏好对齐结合到单个整体训练过程中,为这个问题提供了一个优雅的解决方案。 ORPO 通过将负对数似然损失与优势比(OR) 项相结合来修改标准语言建模目标。这种OR 损失对拒绝的响应进行弱惩罚,对首选响应进行强烈奖励,从而使模型能够同时学习目标任务并与人类偏好保持一致。
关于ORPO更具体的介绍,可以阅读我们前几天发表的文章:
奥尔普
目前ORPO已经在各大微调库中实现,如TRL、Axolotl、LLaMA-Factory等,我们可以直接使用
ORPO 微调Llama 3
Llama 3 已发布两种模型大小:700 亿参数模型和较小的80 亿参数模型。 70B模型在MMLU基准中获得82分,在HumanEval基准中获得81.7分,可以说相当不错。
Llama 3 模型还将上下文长度增加到8,192 个标记(Llama 2 为4,096 个),并且可以使用RoPE 扩展到32k。该模型还使用128k 词汇量。参数从7B到8B的增加基本上就是词汇量的增加。
要使用ORPO 需要首选项数据集,包括提示、选定的答案和拒绝的答案。
我们将使用mlabonne/orpo-dpo-mix-40k,因为它是以下高质量DPO 数据集: 的组合
argilla/distilabel-capybara-dpo-7k-binarized: 高分选择答案=5(2,882 个样本)argilla/distilabel-intel-orca-dpo-pairs: 高分选择答案=9,不在GSM8K(2,299 个样本)argilla/ultrafeedback- binarized-preferences-cleaned: 高分选择答案=5 (22,799 个样本)argilla/distilabel-math-preference-dpo: 高分选择答案=9 (2,181 个样本) unalignment/token-dpo-v0.2 (541 个样本)M4-ai /prm_dpo_pairs_cleaned(7,958 个样本)jondurbin/truthy-dpo-v0.1(1,016 个样本)
首先我们安装依赖项
pip install -U Transformers 数据集加速Peft trl BitsandBytes wandb
安装完成后,我们可以导入必要的库并登录WB(可选):
导入gcimport osimport torchimport wandbfrom 数据集导入load_datasetfrom google.colab 导入userdatafrom peft 导入LoraConfig、PeftModel、prepare_model_for_kbit_trainingfrom Transformers 导入(AutoModelForCausalLM、AutoTokenizer、BitsAndBytesConfig、TrainingArguments、pipeline) from trl 导入ORPOConfig、ORPOTrainer、setup_chat_formatw b_token=userdata.get('wandb ' )wandb.login(key=wb_token)
如果你有最新的GPU,你可以使用Flash Attention库来替换默认的eager Attention。因为效率更高,所以我们直接用下面的代码来判断。如果支持,请使用Flash Attention。如果没有,请使用默认值。
if torch.cuda.get_device_capability()[0]=8:pip install -qqq flash-attnattn_implementation='flash_attention_2'torch_dtype=torch.bfloat16else:attn_implementation='eager'torch_dtype=torch.float16
然后,我们使用QLoRA 作为PEFT 方法,使用BitsandBytes 以4 位精度加载Llama 38 8B 模型。然后调用setup_chat_format() 函数修改模型和分词器以支持ChatML。此功能会自动应用聊天模板,添加特殊标记,并调整模型嵌入层的大小以匹配新的词汇量。
# Modelbase_model='Meta-Llama/Meta-Llama-3-8B'New_model=' ORPollama-3-8B'# qlora Configbnb_config=Bitsandbytesconfig (LOAD_IN_4bit=True, bnb_4bit_quant_type='nf4', bnb_4bit_compute_dtype=torch_dtype, bnb_4bit_use_quant=true,) # LoRA configpeft_config=LoraConfig(r=16, lora_alpha=32, lora_dropout=0.05, 偏差='none',task_type='CAUSAL_LM', target_modules=['up_proj', 'down_proj', 'gate_proj', 'k_proj', ' q_proj', 'v_proj', 'o_proj'])# 加载tokenizertokenizer=AutoTokenizer.from_pretrained(base_model)# 加载modelmodel=AutoModelForCausalLM.from_pretrained(base_model,quantization_config=bnb_config,device_map='auto',attn_implementation=attn_implementation)model, tokenizer=setup_chat_format(模型,分词器)模型=prepare_model_for_kbit_training(模型)
通过上述设置,模型已准备好进行训练。加载mlabonne/orpo-dpo-mix-40k 并使用apply_chat_template() 函数将“选定”和“拒绝”列转换为ChatML 格式。为了演示,仅使用1000 个样本,而不是整个数据集,因为运行它需要很长时间。
dataset_name='mlabonne/orpo-dpo-mix-40k'dataset=load_dataset(dataset_name, split='all')dataset=dataset.shuffle(seed=42).select(range(10))def format_chat_template(row):row[ 'chosen']=tokenizer.apply_chat_template(row['chosen'], tokenize=False)row['rejected']=tokenizer.apply_chat_template(row['rejected'], tokenize=False)return rowdataset=dataset.map(format_chat_template ,num_proc=os.cpu_count(),)dataset=dataset.train_test_split(test_size=0.01)
最后我们设置超参数:
max_length和batch size等其他参数设置为使用尽可能多的VRAM(我们当前配置中约为20 GB,如果您是4090,建议使用我们的配置)。
orpo_args=ORPOConfig(learning_rate=8e-6,beta=0.1,lr_scheduler_type='线性',max_length=1024,max_prompt_length=512,per_device_train_batch_size=2,per_device_eval_batch_size=2,gradient_accumulation_steps=4,optim='paged_adamw_8bit',num_train_ep ochs=1 ,evaluation_strategy='steps',eval_steps=0.2,logging_steps=1,warmup_steps=10,report_to='wandb',output_dir='./results/',)
最后使用ORPOTrainer训练模型
trainer=ORPOTrainer(model=model,args=orpo_args,train_dataset=dataset['train'],eval_dataset=dataset['test'],peft_config=peft_config,tokenizer=tokenizer,)trainer.train()trainer.save_model(new_model)
训练结果如下:
尽管损失减少了,但所选答案和拒绝答案之间的差异并不显着: 平均差异和准确度分别略高于零和0.5。
作为训练的最后一部分,QLoRA 适配器还需要与基础模型合并,
# 刷新内存删除训练器,modelgc.collect()torch.cuda.empty_cache()# 重新加载tokenizer 和modeltokenizer=AutoTokenizer.from_pretrained(base_model)model=AutoModelForCausalLM.from_pretrained(base_model,low_cpu_mem_usage=True,return_dict=True,torch_dtype=torch.float16 ,device_map='auto',)model, tokenizer=setup_chat_format(model, tokenizer)# 将适配器与基础模型合并model=PeftModel.from_pretrained(model, new_model)model=model.merge_and_unload()
至此,我们完成了对Llama 3 的快速微调,最后我使用LLM AutoEval 做了一些评估。
可以看到,虽然我们只使用了1000条数据并且只运行了一个epoch,但基础模型的性能在每次基准测试中都得到了提升。如果对整个40k 样本进行微调,应该会产生良好的结果。
总结
用户评论
这篇文章太棒了!我一直想尝试一下用 ORPO 微调 Llama 3,终于有人分享了经验!教程很清晰易懂,我也跟着试试看结果如何!
有5位网友表示赞同!
这个方法确实很有潜力,微调后的 Llama 3 效果显著提升,在文本生成方面简直飞跃进步!期待未来能看到更多基于 ORPO 微调的应用。
有16位网友表示赞同!
说真的,ORPO 微调的效果还真令人惊喜!之前用原版 Llama 3 的话,总觉得生出的文本有点单一乏味,现在变得活泼灵动多了,感觉就是跟自己聊天似的,太棒了!
有14位网友表示赞同!
虽然这个方法看起来还不错,但我个人还是更倾向于使用现成的模型库。微调起来太复杂了,而且我的硬件条件还不太好应对,希望能有更简单易用的解决方案。
有17位网友表示赞同!
ORPO 微调确实很强大,但是对于普通人来说,操作门槛还是相当高啊。希望将来能够出现更友好的工具和资源,方便更多人体验到 ORPO 的魅力。
有15位网友表示赞同!
这篇文章写的超级详细!我已经顺利跟着教程微调了 Llama 3 ,效果真的惊人!以前花那么长时间去训练模型,结果不如 ORPO 微调来的快而且有效率!佩服作者!
有17位网友表示赞同!
说实话,我对 ORPO 微调有点半信半疑的态度。虽然这篇博文解释的很清楚,但还是怕自己操作失误导致效果不理想,毕竟这涉及到训练和评估等复杂的过程。
有19位网友表示赞同!
想学习一下 ORPO 微调的技巧!感觉这个方法未来的发展潜力很大,可以应用在各个领域,比如聊天机器人、文本摘要等等。希望能有更多人分享他们的经验和案例。
有19位网友表示赞同!
我一直想学习微调大型语言模型,但是技术水平有限,一直没有成功。看到这篇文章让我很有启发,或许我可以尝试一下 ORPO 微调来提升自己的能力!
有12位网友表示赞同!
ORPO 微调确实是一个非常有用的工具,可以有效提高 Llama 3 的性能。我在做自然语言处理相关的项目时,也可以尝试一下使用这个方法来解决一些问题。
有15位网友表示赞同!
这篇文章写的真好!让我对 ORPO 微调有了更清晰的认识。我之前一直以为微调大型语言模型是一件很复杂的任务,现在看来只要掌握了正确的技巧还是很可行的。
有11位网友表示赞同!
学习 ORPO 真是不容易!操作步骤那么多,而且还需要了解很多相关的理论知识。不过还是非常佩服那些能搞定这个技术的人!
有9位网友表示赞同!
我觉得这篇文章写的虽然很专业,但是缺乏一些实际案例的讲解,可能会让新手读者难以理解ORPO微调的效果。
有14位网友表示赞同!
Llama模型是目前比较流行的语言模型之一吗?我之前一直都在用GPT-3,不知道Llama和GPT-3之间有什么区别呀?
有6位网友表示赞同!
看了这篇文章才知道原来 ORPO 微调是可以提高模型性能的啊!以前我是直接使用预训练好的模型,现在看来可以尝试一下微调看看效果怎么样。
有15位网友表示赞同!
ORPO 微调这个方法真的太棒了!我之前在做一些文本生成任务时遇到过瓶颈,现在可以用这个方法来解决问题,真是高兴坏了!
有9位网友表示赞同!
如果说 ORPO 微调 只能用于 Llama 3 模型的话,那么这篇文章的价值就比较低了。我希望作者能分享一下其他模型是否可以利用 ORPO 进行微调。
有12位网友表示赞同!