使用Axolotl和DPO技术微调开源大语言模型的完整指南

本文详细介绍了如何使用Axolotl工具和直接偏好优化(DPO)技术微调Qwen2.5 3B Instruct模型,涵盖DPO数据集创建、云环境配置、训练步骤和模型评估等完整流程。

使用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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
base_model: Qwen/Qwen2.5-3B-Instruct
strict: false

# Axolotl会自动将HuggingFace的数据集映射到Qwen 2.5的提示模板
chat_template: qwen_25
rl: dpo
datasets:
  - path: olivermolenschot/alpaca_messages_dpo_test
    type: chat_template.default
    field_messages: conversation
    field_chosen: chosen
    field_rejected: rejected
    message_field_role: role
    message_field_content: content

# 选择/workspace内的目录,因为云主机通常在那里挂载卷
output_dir: /workspace/dpo-output

# Qwen 2.5支持最多32768个token,最大生成为8192个token
sequence_len: 8192

# 样本打包目前不适用于DPO。添加填充到序列长度以避免Torch错误
sample_packing: false
pad_to_sequence_len: true

# 添加你的WanDB账户如果你想获得训练性能的详细报告
wandb_project:
wandb_entity:
wandb_watch:
wandb_name:
wandb_log_model:

# 通过将多行批处理在一起可以提高训练效率
gradient_accumulation_steps: 1
micro_batch_size: 1

# 对数据集进行一次遍历。可以设置为更高的数字如2或3进行多次
num_epochs: 1

# 优化器在训练LLM时影响不大。Adam是标准选择
optimizer: adamw_torch

# DPO需要比常规SFT更小的学习率
lr_scheduler: constant
learning_rate: 0.00005

# 使用bf16精度训练,因为基础模型也是bf16
bf16: auto

# 减少内存需求
gradient_checkpointing: true

# 使训练更快(仅支持Ampere、Ada或Hopper GPU)
flash_attention: true

# 可以在每个epoch中保存多次以获得多个检查点候选进行比较
saves_per_epoch: 1

logging_steps: 1
warmup_steps: 0

设置云环境

要运行训练,我们将使用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,但这很少见。

开始训练的步骤

  1. 设置HuggingFace缓存目录
1
export HF_HOME=/workspace/hf

这确保原始模型下载到我们的持久卷存储中。

  1. 创建配置文件:将之前创建的config.yml文件保存到/workspace/config.yml

  2. 开始训练

1
python -m axolotl.cli.train /workspace/config.yml

完成!你的训练应该开始了。在Axolotl下载模型和训练数据后,你应该看到类似这样的输出:

1
2
3
[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:

  1. 安装HuggingFace Hub CLI
1
pip install huggingface_hub[cli]
  1. 上传模型
1
huggingface-cli upload /workspace/dpo-output yourname/yourrepo

将yourname/yourrepo替换为实际的HuggingFace用户名和仓库名称。

评估微调后的模型

对于评估,建议使用文本生成推理(TGI)等工具同时托管原始模型和微调模型。然后,在两个模型上使用温度设置为0(确保确定性输出)进行推理,并手动比较两个模型的响应。

这种实践方法比仅仅依赖训练评估损失指标提供更好的洞察,后者可能无法捕捉LLM语言生成的细微差别。

结论

使用DPO微调LLM让你能够定制模型以更好地满足应用需求,同时保持成本可控。通过遵循本文概述的步骤,你可以利用开源工具和数据集的力量创建符合特定要求的模型。无论你是想调整响应风格还是实施安全措施,DPO都提供了一种实用的方法来改进你的LLM。

祝你微调愉快!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计