低代码大型语言模型对齐
在本教程中,我们将主要使用UI工具,无需编写任何复杂的代码,即可微调一个语言模型。我们将使用`autotrain-advanced`库在一个自定义数据集上微调一个小型语言模型。我们将使用Argilla的UI来创建和审查数据集。本教程将遵循以下核心步骤:
- 使用Argilla的UI创建数据集
- 将数据集导出到Hub
- 使用AutoTrain UI训练语言模型
- 使用lighteval评估模型
创建数据集
首先,我们将在Argilla中基于一个现有数据集创建数据集。我们将采取一种通用方法,但在实际场景中,您会希望根据您的具体用例创建数据集。例如,您可以筛选数据集,使其只包含某些类别或主题。
从开源数据集开始
我们将使用Maxime Labonne的4万个样本数据集,其中包含已选择和已拒绝的完成。该数据集可在Hub上找到,地址为`mlabonne/orpo-dpo-mix-40k`。以下是该数据集的预览。
将数据集导入Argilla
要将数据集导入Argilla,我们将使用UI中的“创建数据集”功能。有关如何在Argilla中创建数据集的更详细指南,请查看这篇博客文章。
下面的视频展示了如何将数据集仓库ID粘贴到“创建数据集”表单中,从而将数据集导入Argilla。在我们的例子中,仓库ID是`mlabonne/orpo-dpo-mix-40k`。
Argilla将根据数据集建议一个配置。然后我们可以在UI中添加问题,比如关于相关性的评级问题。这将允许我们根据类别或主题过滤数据集。
数据集配置器允许您定义用于审查的字段和问题。字段可以是文本、对话或图像。问题可以是标签、评级、排名或文本。
筛选数据集
导入数据集后,我们可以根据添加的相关性问题进行筛选。在我们的案例中,我们将筛选数据集,使其只包含与提示相关的完成。我们还将筛选数据集,使其只包含至少10个标记长的完成。
将数据集导出到Hub
筛选数据集后,我们可以将其导出到Hub。这将使我们能够在AutoTrain中访问数据集。不幸的是,导出功能尚未在UI中提供,因此我们必须使用Python库来导出数据集。
import argilla as rg
from datasets import Dataset
client = rg.Argilla(api_key="<argilla_api_key>", api_url="<argilla_api_url>")
dataset = client.datasets("dataset_path")
# Process Argilla records by dealing with multiple responses
dataset_rows = []
for record in dataset.records(with_suggestions=True, with_responses=True):
row = record.fields
if len(record.responses) == 0:
answer = record.suggestions["correct_answer"].value
row["correct_answer"] = answer
else:
for response in record.responses:
if response.question_name == "correct_answer":
row["correct_answer"] = response.value
dataset_rows.append(row)
# Create Hugging Face dataset and push to Hub
hf_dataset = Dataset.from_list(dataset_rows)
hf_dataset.push_to_hub(repo_id=args.dataset_repo_id)
微调
有了Hub上的数据集,我们现在可以使用autotrain UI微调语言模型。此外,您也可以使用`autotrain-advanced` 库来微调语言模型。如果您想使用CLI命令微调模型,可以查看该库。
选择算法
有无数的LLM微调算法可供选择,其中许多都受AutoTrain支持。我们将使用ORPO算法,因为它易于使用且能显著改善基础模型性能。
ORPO(在线奖励策略优化)是一种简化的微调技术,它将监督微调(SFT)和偏好对齐两个阶段合并为一个。这种整合减少了计算负载和训练时间。传统上,针对特定任务微调大型语言模型(LLM)需要SFT来调整模型的领域知识,然后进行偏好对齐(如RLHF或直接偏好优化)以优先处理偏好的响应而不是不希望的响应。ORPO解决了传统方法中SFT无意中增加了期望和不期望输出概率的问题,从而无需额外的对齐阶段。
ORPO由Hong和Lee于2024年开发,通过修改模型的目标函数以包含一个奖励偏好响应同时惩罚拒绝响应的损失项来结合这些过程。这种方法已显示出在不同模型大小和任务上优于其他对齐方法。ORPO的效率和改进的对齐使其成为微调Llama 3等LLM的一个有前景的替代方案。
在AutoTrain UI中,您可以从左侧的下拉菜单中选择ORPO算法。如下图所示,您还可以调整算法的超参数。
选择基础模型
Hugging Face Hub包含数千种语言模型,我们可以将它们用作微调的基础模型。其中许多模型在通用基准上进行了评估,可以用作微调的起点。要获取模型的基准分数,您可以使用Open LLM排行榜。
我们将使用 SmolLM2 模型作为基础模型,因为它只有17亿参数,这意味着它可以在各种硬件上运行。它在通用基准测试中也表现良好,因此我们可以期待它在多种用例中都有合理的表现。
训练模型
我们可以使用AutoTrain UI训练模型。AutoTrain主页允许您选择用于训练的硬件,然后它会在Hugging Face上创建一个空间。
您需要选择用于训练的硬件。您选择的硬件将决定您可以使用的GPU数量和可访问的VRAM量。我们建议从可用的Nvidia L40开始。
几分钟后,AutoTrain UI将准备就绪,您可以开始训练模型。您可以通过选择要使用的数据集、要微调的模型以及要使用的训练参数来开始训练。
首先从默认参数开始,并根据需要进行调整。下面列出了您可以调整的参数。
参数 | 示例 | 描述 |
---|---|---|
模型 | HuggingFaceTB/SmolLM2-135M | 用于微调的基础模型 |
项目名称 | my-autotrain-llm | 您的微调模型的名称 |
数据路径 | autotrain_data | 数据集仓库ID |
训练器 | orpo | 要使用的训练算法 |
学习率 | 2e-5 | 学习率 |
批次大小 | 4 | 训练和评估的批次大小 |
世代数 | 1 | 训练的世代数 |
块大小 | 512 | 最大输入令牌长度 |
预热比率 | 0.1 | 学习率预热比率 |
lora-r | 16 | LoRA 等级 |
lora-alpha | 32 | LoRA alpha |
lora-dropout | 0.05 | LoRA dropout 率 |
权重衰减 | 0.01 | 用于正则化的权重衰减 |
梯度累积 | 4 | 梯度累积步数 |
混合精度 | bf16 | 混合精度格式(例如,bf16、fp16) |
最大提示长度 | 256 | 提示的最大长度 |
最大完成长度 | 256 | 完成的最大长度 |
日志记录步数 | 10 | 记录日志的步长间隔 |
保存总数限制 | 2 | 保存检查点的总数限制 |
种子 | 42 | 用于复现性的随机种子 |
- 如果您的硬件有限,请考虑减小batch_size和block_size。
- 如果您的显存大于 40GB,您应该增加您的批次大小。
- 一旦您评估了模型的检查点,您可能希望调整 epoch、权重衰减和 LoRa 参数。
评估模型
现在您可以评估训练好的模型了。这里我们将使用一些通用基准,它们可以帮助确定我们的模型性能是否与之前训练相比有所改变。
lighteval accelerate \
--model_args "pretrained=HuggingFaceTB/SmolLM2-135M" \
--tasks "leaderboard|truthfulqa:mc|0|0" \
--override_batch_size 1 \
--output_dir="./evals/"
对于实际用例,您需要根据您计划使用的任务来评估模型。在这篇关于自定义评估的指南中,我们展示了如何做到这一点。