通过ORPO技术微调 llama3大模型(Fine-tune Llama 3 with ORPO)

这篇具有很好参考价值的文章主要介绍了通过ORPO技术微调 llama3大模型(Fine-tune Llama 3 with ORPO)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通过ORPO技术微调 llama3大模型(Fine-tune Llama 3 with ORPO)1f45bd1e8577af66a05f5e3fadb0b29

通过ORPO对llama进行微调

前言

ORPO是一种新颖的微调技术,它将传统的监督微调和偏好对齐阶段整合到一个过程中。这减少了训练所需的计算资源和时间。此外,经验结果表明,ORPO在各种模型大小和基准测试中都超过了其他对齐方法。 在本文中,我们将使用ORPO和TRL库来微调新的Llama 3 8B模型。代码可以在Google Colab(https://colab.research.google.com/drive/1eHNWg9gnaXErdAa8_mcvjMupbSS6rDvi?usp=sharing)和GitHub上的LLM(https://github.com/mlabonne/llm-course)课程中找到。

⚖️ ORPO

指令调整和偏好对齐是将大型语言模型(LLMs)适应特定任务的关键技术。传统上,这涉及到一个多阶段的过程:

  • 对指令进行监督式微调(SFT)以使模型适应目标领域
  • 像人类反馈的强化学习(RLHF)或直接优选优化(DPO)这样的偏好对齐方法,以增加生成优选响应而非被拒绝响应的可能性。
通过ORPO技术微调 llama3大模型(Fine-tune Llama 3 with ORPO)微信图片_20240423001958

然而,研究人员发现这种方法的一个局限性。就是监督微调(SFT)可以有效地让模型适应特定领域,这也就是为什么需要偏好对齐阶段RLHF,扩大受欢迎输出和不受欢迎输出之间概率的差距。

通过ORPO技术微调 llama3大模型(Fine-tune Llama 3 with ORPO)image

SFT过程中,不受欢迎概率增加实证 from ORPO论文

2024年Hong和Lee提出的ORPO通过将SFT和RLHF统一为一个完整训练过程,为这个问题提供了一个优雅的解决方案。ORPO修改了标准language model的训练目标,将负对数似然损失与odds ratio(OR)项结合起来。这种OR损失对不受欢迎的输出施加了轻微的惩罚,同时加大奖励受欢迎的输出,允许模型同时学习目标任务并与人类偏好对齐。

通过ORPO技术微调 llama3大模型(Fine-tune Llama 3 with ORPO)91e1091deacae95fb17f1b6995b94c2

ORPO已经在主要的微调库中得到实现,比如TRL、Axolotl和LLaMA-Factory。在下一节中,我们将看到如何使用TRL进行操作。

💻 开始通过ORPO进行微调

Llama3是Meta开发的最新一代大型语言模型(LLM)。这些模型是在15万亿token的广泛数据集上训练的(相比之下,Llama2的训练数据集为2万亿token)。发布了两种模型尺寸:一个700亿参数的模型和一个更小的80亿参数的模型。700亿参数的模型已经展示了令人印象深刻的性能,在MMLU基准测试中得分为82,在HumanEval基准测试中得分为81.7。

Llama3模型还增加了上下文长度,最多可达8192个token(Llama2为4096个token),并且可能通过RoPE扩展到32k。此外,这些模型使用了一个带有128K-token词汇表的新分词器,减少了编码文本所需token数量的15%。这个词汇表也解释了从70亿到80亿参数的增长。

通过ORPO技术微调 llama3大模型(Fine-tune Llama 3 with ORPO)image

ORPO需要一个偏好数据集,包括一个提示、一个被选择的答案和一个被拒绝的答案。在这个例子中,我们将使用mlabonne/orpo-dpo- mix-40k,这是一个由以下高质量DPO数据集组合而成的数据集:

  • argilla/distilabel-capybara-dpo-7k-binarized : 高分选择的答案 >=5(2,882个样本) https://huggingface.co/datasets/argilla/distilabel-capybara-dpo-7k-binarized
  • argilla/distilabel-intel-orca-dpo-pairs : 高分选择的答案 >=9,不在GSM8K中(2,299个样本) https://huggingface.co/datasets/argilla/distilabel-intel-orca-dpo-pairs
  • argilla/ultrafeedback-binarized-preferences-cleaned : 高分选择的答案 >=5(22,799个样本) https://huggingface.co/datasets/argilla/ultrafeedback-binarized-preferences-cleaned
  • argilla/distilabel-math-preference-dpo : 高分选择的答案 >=9(2,181个样本) https://huggingface.co/datasets/argilla/distilabel-math-preference-dpo
  • unalignment/toxic-dpo-v0.2 (541个样本) https://huggingface.co/datasets/unalignment/toxic-dpo-v0.2
  • M4-ai/prm_dpo_pairs_cleaned (7,958个样本) https://huggingface.co/datasets/M4-ai/prm_dpo_pairs_cleaned
  • jondurbin/truthy-dpo-v0.1 (1,016个样本) https://huggingface.co/datasets/jondurbin/truthy-dpo-v0.1 感谢argilla、unalignment、M4-ai和jondurbin提供了源数据集。

开始安装所需的库:

  pip install -U transformers datasets accelerate peft trl bitsandbytes wandb  

一旦安装完成,我们可以导入必要的库,并登录到W&B(可选):

    import gc  
    import os  
      
    import torch  
    import wandb  
    from datasets import load_dataset  
    from google.colab import userdata  
    from peft import LoraConfig, PeftModel, prepare_model_for_kbit_training  
    from transformers import (  
        AutoModelForCausalLM,  
        AutoTokenizer,  
        BitsAndBytesConfig,  
        TrainingArguments,  
        pipeline,  
    )  
    from trl import ORPOConfig, ORPOTrainer, setup_chat_format  
      
    wb_token = userdata.get('wandb')  
    wandb.login(key=wb_token)  

如果你有一块较新的GPU,你还应该能够使用Flash Attention库来替换默认的热切关注实现,以一个更有效的方式来实现。

    if torch.cuda.get_device_capability()[0] >= 8:  
        !pip install -qqq flash-attn  
        attn_implementation = "flash_attention_2"  
        torch_dtype = torch.bfloat16  
    else:  
        attn_implementation = "eager"  
        torch_dtype = torch.float16  

接下来,我们将使用bitsandbytes以4位精度加载Llama 3 8B模型。然后,我们使用PEFT为QLoRA设置LoRA配置。我还使用了方便的setup_chat_format()函数来修改模型和为ChatML支持的分词器。它会自动应用这个聊天模板,添加特殊的令牌,并调整模型的嵌入层的大小以匹配新的词汇表大小。 请注意,你需要提交请求才能访问meta-llama/Meta-Llama-3-8B,并且要登录到你的Hugging Face账户。或者,你可以加载未封闭的模型副本,如NousResearch/Meta--Llama-3-8B。

    # Model  
    base_model = "meta-llama/Meta-Llama-3-8B"  
    new_model = "OrpoLlama-3-8B"  
      
    # QLoRA config  
    bnb_config = BitsAndBytesConfig(  
        load_in_4bit=True,  
        bnb_4bit_quant_type="nf4",  
        bnb_4bit_compute_dtype=torch_dtype,  
        bnb_4bit_use_double_quant=True,  
    )  
      
    # LoRA config  
    peft_config = LoraConfig(  
        r=16,  
        lora_alpha=32,  
        lora_dropout=0.05,  
        bias="none",  
        task_type="CAUSAL_LM",  
        target_modules=['up_proj', 'down_proj', 'gate_proj', 'k_proj', 'q_proj', 'v_proj', 'o_proj']  
    )  
      
    # Load tokenizer  
    tokenizer = AutoTokenizer.from_pretrained(base_model)  
      
    # Load model  
    model = AutoModelForCausalLM.from_pretrained(  
        base_model,  
        quantization_config=bnb_config,  
        device_map="auto",  
        attn_implementation=attn_implementation  
    )  
    model, tokenizer = setup_chat_format(model, tokenizer)  
    model = prepare_model_for_kbit_training(model)  

现在模型已经准备好进行训练,我们可以处理数据集。我们加载mlabonne/orpo-dpo-mix-40k,并使用apply_chat_template()函数将“chosen”和“rejected”列转换为ChatML格式。请注意,我只使用了1,000个样本,而不是整个数据集,因为运行起来会花费太长时间。

    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 row  
      
    dataset = dataset.map(  
        format_chat_template,  
        num_proc= os.cpu_count(),  
    )  
    dataset = dataset.train_test_split(test_size=0.01)  

首先,我们需要设置一些超参数: 学习率:与传统的SFT或者DPO相比,ORPO使用的学习率非常低。这个值8e-6来自原始论文,大致对应于SFT的学习率1e-5和DPO的学习率5e-6。我建议在真正的微调中将其增加到大约1e-6。 beta:它是论文中的参数,其默认值为0.1。来自原始论文的一个附录显示了如何通过消融研究选择它。 其他参数,如最大长度和批量大小,都设置为尽可能多地使用VRAM(在此配置中约为20 GB)。理想情况下,我们将对模型进行3-5个周期的训练,但这里我们将坚持1个周期。 最后,我们可以使用ORPOTrainer来训练模型,它充当一个包装器。

    orpo_args = ORPOConfig(  
        learning_rate=8e-6,  
        beta=0.1,  
        lr_scheduler_type="linear",  
        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_epochs=1,  
        evaluation_strategy="steps",  
        eval_steps=0.2,  
        logging_steps=1,  
        warmup_steps=10,  
        report_to="wandb",  
        output_dir="./results/",  
    )  
      
    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)  

在L4 GPU上对这1000个样本进行模型训练大约需要2个小时。让我们查看W&B的图:

通过ORPO技术微调 llama3大模型(Fine-tune Llama 3 with ORPO)image

当loss降低时,受欢迎输出和不受欢迎输出之间的差异并不明显:平均边界和准确度分别仅略高于0和0.5。

在原始论文中,作者们在 Anthropic/hh-rlhf 数据集(161k个样本)上训练模型进行了10个epochs,这比我们现在运行的时间要长得多。他们还对Llama3进行了实验,并且友好地与我分享了他们的日志(感谢Jiwoo Hong)。

在本教程的结尾,让我们将QLoRA适配器与基础模型合并,并将其推送到Hugging Face Hub。

    # Flush memory  
    del trainer, model  
    gc.collect()  
    torch.cuda.empty_cache()  
      
    # Reload tokenizer and model  
    tokenizer = 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)  
      
    # Merge adapter with base model  
    model = PeftModel.from_pretrained(model, new_model)  
    model = model.merge_and_unload()  
      
    model.push_to_hub(new_model, use_temp_dir=False)  
    tokenizer.push_to_hub(new_model, use_temp_dir=False)  

恭喜,我们完成了Llama3:mlabonne/OrpoLlama-3-8B的快速微调。你可以使用这个Hugging Face Space(这里有一个notebook,让你自己来实践)来使用它。尽管模型训练不足,正如W&B曲线所强调的那样,我还是使用LLM AutoEval在Nous的基准测试套件上进行了一些评估。

通过ORPO技术微调 llama3大模型(Fine-tune Llama 3 with ORPO)image

我们的ORPO微调实际上相当不错,并且提高了基础模型在每个基准测试上的性能。这是令人鼓舞的,并且很可能意味着在整个40k样本上进行微调将带来很好的结果。

对于开源社区来说,这是一个激动人心的时刻,越来越多的高质量开放权重模型被发布。闭源和开放权重模型之间的差距正在逐渐缩小,而微调是获取您用例最佳性能的重要工具。

通过ORPO技术微调 llama3大模型(Fine-tune Llama 3 with ORPO)image

结论

在这篇教程中,我们介绍了ORPO算法,并解释了它如何将SFT(监督式微调)和RLHF统一为单一的过程。然后,我们使用TRL(Transformer Reinforcement Learning)对一个定制的偏好数据集上的Llama3-8B进行微调。最终模型展示了令人鼓舞的结果,并突显了ORPO作为新的微调范式的潜力。

我希望这很有帮助,并推荐你运行Colab笔记本来微调你自己的Llama3模型。在将来的文章中,我们将看到如何创建高质量的数据集——这是一个经常被忽视的点。

最后文章参考自:https://huggingface.co/blog/mlabonne/orpo-llama-3文章来源地址https://www.toymoban.com/news/detail-856186.html

到了这里,关于通过ORPO技术微调 llama3大模型(Fine-tune Llama 3 with ORPO)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Windows10上使用llama-recipes(LoRA)来对llama-2-7b做fine-tune

    刚刚在Windows10上搭建环境来对llama2做finetune,里面坑还是挺多的,这里把印象中的坑整理了一下以作备忘。 llama-recipes是meta的开源项目,Github地址为:GitHub - facebookresearch/llama-recipes: Examples and recipes for Llama 2 model llama2同样也是meta的开源LLM模型,因此用此项目做finetune应该是正确

    2024年02月10日
    浏览(37)
  • 【论文解读】(如何微调BERT?) How to Fine-Tune BERT for Text Classification?

    论文地址:https://arxiv.org/pdf/1905.05583.pdf 论文年份:2019年05月 论文代码: https://github.com/xuyige/BERT4doc-Classification 论文引用量:1191 (截止2023-04-28) 论文阅读前提:熟悉NLP、深度学习、Transformer、BERT、多任务学习等。 现在NLP任务方式大多都是对BERT进行微调。例如:我们要做一个

    2024年02月07日
    浏览(41)
  • Llama3-8B+ LLaMA-Factory 中文微调

    Llama3是目前开源大模型中最优秀的模型之一,但是原生的Llama3模型训练的中文语料占比非常低,因此在中文的表现方便略微欠佳! 本教程就以Llama3-8B-Instruct开源模型为模型基座,通过开源程序LLaMA-Factory来进行中文的微调,提高Llama3的中文能力!LLaMA-Factory是一个开源的模型训

    2024年04月27日
    浏览(47)
  • 微调 LLaMA 2 模型:通过 QLoRA 充分利用单 GPU 效率 Meta LLaMA 2 微调过程综合指南

    科技巨头 Meta 于 2023 年 7 月 18 日发布了 LLaMA 2,这是他们最新版本的大型语言模型 (LLM),成为头条新闻。我相信 Llama2 在进一步推动人工智能技术方面取得了巨大飞跃,人们将关注私人领域未来对聊天机器人的微调将超过一般聊天机器人。1 这些尖端模型从 2023 年 1 月到 2023

    2024年02月10日
    浏览(49)
  • 训练自己的Llama 2!大模型微调技术介绍

    趋动云 趋动云是面向 AI 算法工程师的开发平台,为工程师提供模型开发、模型训练、数据和代码管理等功能。 近期有不少粉丝问算力君,趋动云是否支持大模型的训练?当然支持! 最近大火的Llama 2一出来,算力君身边的小伙伴就已经跑过了,本文将介绍Llama 2和相关的大模

    2024年02月12日
    浏览(39)
  • 使用 LoRA 技术对 LLaMA 65B 大模型进行微调及推理

    前几天,Meta 发布了 LIMA 大模型,在LLaMA-65B的基础上,无需使用 RLHF,只用了 1000 个精心准备的样本数据进行微调,就达到了和 GPT-4 相媲美的程度。这激发了我探索 LLaMA 65B 大模型的兴趣。 之前的一系列大模型相关文章都是在LLaMA 7B/13B模型参数上面进行微调,文本使用 LoRA 技

    2024年02月08日
    浏览(48)
  • 在Windows电脑上快速运行AI大语言模型-Llama3

    近期 Meta 发布了最新的 Llama3 模型,并开源了开源代码。Meta Llama 3 现已推出 8B 和 70B 预训练和指令调整版本,可支持广泛的应用程序。 并且 Llama 3 在语言细微差别、上下文理解和翻译和对话生成等复杂任务方面表现出色。 我们可以在 Windows 上快速运行 Llama3 8B 模型。 📝 No

    2024年04月22日
    浏览(38)
  • 如何拥有自己的专属GPT-本地部署目前最强大模型llama3

    你是不是苦于没法使用ChatGPT?或者访问了ChatGPT却没法使用GPT4?现在一切问题都可以解决了! 4月18日,Meta发布两款开源Llama 3 8B与Llama 3 70B模型,供外部开发者免费使用。这个消息轰动了全球开发者。按照Meta的说法,Llama 3 8B和Llama 3 70B是目前同体量下,性能最好的开源模型。

    2024年04月26日
    浏览(49)
  • LLaMA3-70B: Meta AI 的最新自然语言处理模型

    近期,Meta AI 发布了其最新的自然语言处理模型 LLaMA-70B,这是一个基于 transformer 结构的语言模型,具有70亿个参数。LLaMA-70B 的发布标志着 Meta AI 在自然语言处理领域的又一重大突破。作为自然语言处理领域的最新成果,LLaMA-70B 具有许多特点和优势,本文将对其进行详细介绍

    2024年04月29日
    浏览(72)
  • Elasticsearch:RAG vs Fine-tunning (大语言模型微调)

    如果你对 RAG 还不是很熟悉的话,请阅读之前的文章 “Elasticsearch:什么是检索增强生成 - RAG?”。你可以阅读文章 “Elasticsearch:在你的数据上训练大型语言模型 (LLM)” 来了解更多关于如何训练你的模型。在今天的文章中,我们来讲述 RAG 及 大语言模型的优缺点。这篇文章旨

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包