使用Axolotl和直接偏好优化(DPO)微调开源大语言模型
Komninos Chatzipapas
发表于AI·Web·2024年12月6日·更新于2024年12月10日
大语言模型(LLM)为AI应用开启了无数新机遇。如果您曾想微调自己的模型,本指南将展示如何轻松实现且无需编写任何代码。使用Axolotl和DPO等工具,我们将逐步完成整个过程。
什么是LLM?
大语言模型(LLM)是一种强大的AI模型,通过训练海量文本数据(数万亿字符)来预测序列中的下一组词汇。这仅在过去2-3年随着GPU计算能力的进步才成为可能,使得如此庞大的模型能在几周内完成训练。
您可能已经通过ChatGPT或Claude等产品与LLM互动过,并亲身体验了它们理解和生成类人响应的能力。
为什么要微调LLM?
难道我们不能在所有场景都使用GPT-4o吗?虽然它是本文撰写时最强大的模型,但并不总是最实用的选择。微调一个30亿到140亿参数的小型模型,能以极低成本获得相当的结果。此外,微调让您拥有自己的知识产权,并减少对第三方的依赖。
理解基础模型、指令模型和聊天模型
在深入微调之前,有必要了解不同类型的LLM:
- 基础模型:这些模型在大量非结构化文本(如书籍或互联网数据)上进行预训练。虽然它们对语言有内在理解,但未针对推理优化,会产生不连贯的输出。基础模型作为开发更专业化模型的起点。
- 指令模型:基于基础模型构建,使用结构化数据(如提示-响应对)进行微调。它们设计用于遵循特定指令或回答问题。
- 聊天模型:同样基于基础模型,但与指令模型不同,聊天模型在对话数据上训练,使其能够进行来回对话。
什么是强化学习和DPO?
强化学习(RL)是一种模型通过接收对其行为的反馈来学习的技术。它应用于指令或聊天模型,以进一步提高输出质量。通常,RL不在基础模型上进行,因为它使用较低的学习率,效果不明显。
DPO是RL的一种形式,模型使用同一提示/对话的好答案和坏答案对进行训练。通过呈现这些配对,模型学会偏好好例子并避免坏例子。
何时使用DPO
当您想调整模型的风格或行为时,DPO特别有用,例如:
- 风格调整:修改响应长度、细节水平或模型表达的置信度。
- 安全措施:训练模型拒绝回答可能不安全或不适当的提示。
然而,DPO不适合教模型新知识或事实。为此,监督微调(SFT)或检索增强生成(RAG)技术更合适。
创建DPO数据集
在生产环境中,通常使用用户反馈生成DPO数据集,例如:
- 用户反馈:在响应上实施点赞/点踩机制。
- 比较选择:向用户呈现两个不同输出,要求选择更好的一个。
如果缺乏用户数据,也可以利用更大、更强大的LLM创建合成数据集。例如,可以使用较小模型生成坏答案,然后用GPT-4o纠正它们。
为简化,我们将使用HuggingFace的现成数据集:olivermolenschot/alpaca_messages_dpo_test。检查数据集会发现,它包含带有选中和拒绝答案的提示——这些是好坏例子。该数据使用GPT-3.5-turbo和GPT-4合成创建。
通常需要至少500到1000对数据才能有效训练而不过度拟合。最大的DPO数据集包含多达15000-20000对。
使用Axolotl微调Qwen2.5 3B Instruct
我们将使用Axolotl微调Qwen2.5 3B Instruct模型,该模型目前在其尺寸类别中位居OpenLLM排行榜首位。使用Axolotl,您可以无需编写一行代码——只需一个YAML配置文件——即可微调模型。以下是我们将使用的config.yml:
|
|
设置云环境
要运行训练,我们将使用Runpod或Vultr等云托管服务。您需要:
- Docker镜像:克隆Axolotl团队提供的winglian/axolotl-cloud:main Docker镜像。
- 硬件要求:80GB VRAM GPU(如1×A100 PCIe节点)对此尺寸模型绰绰有余。
- 存储:200GB卷存储将容纳我们需要的所有文件。
- CUDA版本:您的CUDA版本应至少为12.1。
*此类训练被视为LLM的完整微调,因此非常消耗VRAM。如果您想在本地运行训练而不依赖云主机,可以尝试使用QLoRA,这是一种监督微调形式。尽管理论上可以结合DPO和QLoRA,但这很少实施。
开始训练的步骤
-
设置HuggingFace缓存目录:
1export HF_HOME=/workspace/hf这确保原始模型下载到我们的持久卷存储。
-
创建配置文件:将之前创建的config.yml文件保存到/workspace/config.yml。
-
开始训练:
1python -m axolotl.cli.train /workspace/config.yml完成!您的训练应开始。在Axolotl下载模型和训练数据后,您应看到类似输出:
1 2[2024-12-02 11:22:34,798] [DEBUG] [axolotl.train.train:98] [PID:3813] [RANK:0] loading model [2024-12-02 11:23:17,925] [INFO] [axolotl.train.train:178] [PID:3813] [RANK:0] Starting trainer...训练只需几分钟即可完成,因为这是一个仅264行的小数据集。微调模型将保存到/workspace/dpo-output。
上传模型到HuggingFace
您可以使用CLI将模型上传到HuggingFace:
-
安装HuggingFace Hub CLI:
1pip install huggingface_hub[cli] -
上传模型:
1huggingface-cli upload /workspace/dpo-output yourname/yourrepo将yourname/yourrepo替换为您的实际HuggingFace用户名和仓库名称。
评估微调模型
对于评估,建议使用文本生成推理(TGI)等工具托管原始模型和微调模型。然后,对两个模型进行温度设置为0的推理(确保确定性输出),并手动比较两个模型的响应。
这种实践方法比仅依赖训练评估损失指标提供更好的洞察,后者可能无法捕捉LLM语言生成的细微差别。
结论
使用DPO微调LLM允许您定制模型以更好地满足应用需求,同时保持成本可控。通过遵循本文概述的步骤,您可以利用开源工具和数据集创建符合特定要求的模型。无论您是想调整响应风格还是实施安全措施,DPO都提供了一种实用的方法来优化您的LLM。
祝您微调愉快!
Komninos Chatzipapas是AI和新兴技术专家,拥有软件开发和业务领导的多元化背景。您可以在他的个人博客上关注他。