使用Axolotl和直接偏好优化(DPO)微调开源大语言模型
大语言模型(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。
祝你微调愉快!