🧬微调 LLM 指南

学习微调的所有基础知识和最佳实践。适合初学者。

1. 什么是微调?

微调 / 训练 / 后训练模型可定制其行为、增强并注入知识,以及针对特定领域和任务优化性能。例如:

  • OpenAI 的 GPT-5 经过后训练以改善指令遵循和有用的聊天行为。

  • 标准的后训练方法称为监督式微调(SFT)。其他方法包括偏好优化(DPO、ORPO)、蒸馏和 强化学习(RL) (GRPO、GSPO),其中“智能体”通过与环境交互并接收 反馈奖励惩罚.

使用 Unslotharrow-up-right,你可以在 Colab、Kaggle 或本地免费进行微调或强化学习,只需 3GB 显存,通过使用我们的 笔记本arrow-up-right。通过在数据集上对预训练模型进行微调,你可以:

  • 更新并学习新知识:注入并学习新的领域专有信息。

  • 定制行为:调整模型的语气、个性或响应风格。

  • 为任务优化:提高在特定用例上的准确性和相关性。

示例微调或强化学习用例:

  • 使大模型能够预测新闻标题对公司是正面还是负面影响。

  • 可以使用历史客户交互来提供更准确和定制的响应。

  • 对法律文本进行微调以用于合同分析、判例研究和合规性检查。

你可以把微调后的模型看作是为更有效、更高效地执行特定任务而设计的专门智能体。 微调可以复现 RAG 的所有能力,但反之则不然。

什么是 LoRA/QLoRA?

在大模型中,我们有模型权重。Llama 70B 有 700 亿个数值。与其改变所有 700 亿个数值,我们改为向每个权重添加薄矩阵 A 和 B 并优化它们。这意味着我们只优化 1% 的权重。LoRA 是当原始模型为 16 位未量化时使用的,而 QLoRA 则量化到 4 位以节省 75% 的内存。

我们不是优化模型权重(黄色),而是优化两个薄矩阵 A 和 B。

关于微调的误解:

你可能听说过微调不会让模型学习新知识或 RAG 比微调表现更好。这是 错误的。你可以通过微调和强化学习训练出专门的编码模型,而 RAG 无法改变模型的权重,只能在推理时增强模型所看到的信息。阅读更多常见问题与误解 这里:

🤔常见问题 + 微调适合我吗?chevron-right

2. 选择合适的模型与方法

如果你是初学者,最好从小型的指令模型开始,例如 Llama 3.1 (8B) 并从那里进行试验。你还需要在普通微调、RL、QLoRA 或 LoRA 训练之间做出选择:

  • 强化学习(RL) 当你需要模型在特定行为(例如调用工具)上表现出色,并使用环境和奖励函数而非有标签数据时会使用。我们有若干 笔记本示例,但对于大多数用例,标准的 SFT 就足够了。

  • LoRA 是一种参数高效的训练方法,通常保持基础模型权重冻结,并训练一小组附加的低秩适配权重(以 16 位精度)。

  • QLoRA 将 LoRA 与 4 位精度结合,以最小资源处理非常大的模型。

  • Unsloth 还支持完整微调(FFT)和预训练,这些通常需要更多资源,但通常不必进行 FFT。正确实施时,LoRA 可以与 FFT 相匹配。

  • Unsloth 所有类型的模型: 文本到语音, 嵌入、GRPO、RL、 视觉、多模态等更多类型。

circle-info

研究表明, 以相同精度进行训练和服务 有助于保持准确性。这意味着如果你想以 4 位提供服务,就在 4 位进行训练,反之亦然。

我们建议从 QLoRA 开始,因为它是最易获取且有效的训练方法之一。我们的 动态 4 位arrow-up-right 量化后,QLoRA 相对于 LoRA 的精度损失现在在很大程度上得到恢复。

你可以通过将模型名称与 Hugging Face 上的模型名称匹配来更改为你喜欢的模型,例如 'unsloth/llama-3.1-8b-unsloth-bnb-4bit'.

我们建议从 指令模型开始,因为它们允许使用对话聊天模板(ChatML、ShareGPT 等)直接进行微调,并且相比 基础模型 (例如 Alpaca、Vicuna 等)需要更少的数据。了解更多关于 指令模型与基础模型之间的差异.

  • 模型名称以 unsloth-bnb-4bit 结尾 表示它们是arrow-up-right Unsloth 动态 4 位量化模型

  • 。这些模型比标准 BitsAndBytes 4 位模型消耗略多的显存,但提供显著更高的准确性。 如果模型名称仅以bnb-4bit

  • 结尾,且没有 “unsloth”,则指标准的 BitsAndBytes 4 位量化。 没有后缀的模型 处于其原始的 16 位或 8 位格式。尽管它们来自官方模型创建者的原始模型,我们有时会包括重要修复——例如聊天模板或分词器修复。因此建议在可用时使用我们的版本。

还有其他设置你可以切换:

  • max_seq_length = 2048 – 控制上下文长度。虽然 Llama-3 支持 8192,我们建议测试时使用 2048。Unsloth 使得微调时上下文长度可达 4× 更长。

  • dtype = None – 默认为 None;使用 torch.float16torch.bfloat16 用于较新的 GPU。

  • load_in_4bit = True – 启用 4 位量化,可将微调时的内存使用减少 4 倍。禁用它可启用 LoRA 的 16 位微调。你也可以通过设置 load_in_16bit = True

  • 来启用 16 位 LoRA。 要启用完整微调(FFT),设置full_finetuning = True 。对于 8 位微调,设置.

  • load_in_8bit = True 注意: 一次只能将一种训练方法设置为 True

circle-info

一个常见的错误是直接跳到完整微调(FFT),这很耗算力。先用 LoRA 或 QLoRA 测试,如果在那里行不通,几乎可以肯定在 FFT 下也行不通。如果 LoRA 失败,不要假设 FFT 会神奇地修复它。 你也可以进行, 文本到语音(TTS), 视觉, 推理(GRPO) 强化学习 (GRPO、DPO)、持续预训练

、文本补全和其他使用 Unsloth 的训练方法。

What Model Should I Use?chevron-right

阅读我们关于选择模型的指南:

🚀LLM Tutorials Directorychevron-right

关于各模型的单独教程:

3. 你的数据集

但情况并非总是如此,例如如果你在为代码微调大模型,仅仅堆放所有代码数据实际上也能使模型产生显著的性能提升,即使没有结构化格式。因此这确实取决于你的用例。

📈数据集指南chevron-right

阅读有关创建数据集的更多内容: 在我们的大多数笔记本示例中,我们使用arrow-up-right Alpaca 数据集

,但像视觉等其他笔记本将使用不同的数据集,答案输出中可能也需要包含图像。

4. 理解训练超参数 学习如何使用来自研究和真实世界实验的最佳实践来选择合适的 超参数

——并了解每个参数如何影响你模型的性能。

🧠Hyperparameters Guidechevron-right

有关超参数如何影响训练的完整指南,请参见:

5. 安装与需求

你可以通过两种主要方式使用 Unsloth:我们的免费笔记本或本地运行。

Unsloth 笔记本 笔记本 我们建议初学者先使用我们预制的

作为开始,因为这是以引导步骤入门的最简单方式。你之后可以将笔记本导出到本地使用。 文本到语音, 嵌入、GRPO、RL、 视觉Unsloth 有循序渐进的笔记本,适用于

、多模态、不同用例等。

本地安装 Docker你也可以通过以下方式在本地安装 Unsloth: pip install unsloth (在 Linux、WSL 或Windows

上)。此外,根据你使用的模型,你需要足够的显存和资源。

安装 Unsloth 需要 Windows 或 Linux 设备。安装完成后,你可以复制并粘贴我们的笔记本并在自己的本地环境中使用。参见:

6. 训练与评估

一旦你准备就绪,就可以开始训练!如果有问题,记住你可以随时更改超参数、数据集等。

在训练过程中你会看到一串数字日志。这是训练损失,显示模型从你的数据集中学习得如何。在很多情况下,损失在 0.5 到 1.0 左右是个好兆头,但这取决于你的数据集和任务。如果损失没有下降,你可能需要调整设置。如果损失降到 0,可能意味着过拟合,因此检查验证也很重要。

训练损失将以数字形式显示

  • 我们通常建议保持默认设置,除非你需要更长的训练或更大的批量大小。 per_device_train_batch_size = 2 – 增大以更好地利用 GPU,但要注意由于填充导致训练变慢。相反,可增加 gradient_accumulation_steps

  • 以获得更平滑的训练。 gradient_accumulation_steps = 4

  • – 在不增加内存使用的情况下模拟更大的批量大小。 max_steps = 60 – 加速训练。对于完整运行,可替换为 num_train_epochs = 1

  • (建议 1–3 个 epoch 以避免过拟合)。 learning_rate = 2e-4 – 较低的学习率用于更慢但更精确的微调。尝试如下值:, 1e-45e-5 ,或.

2e-5

评估 为了评估,你可以通过与模型对话手动评估,看看是否符合你的期望。你也可以为 Unsloth 启用评估,但请记住这可能会根据数据集大小耗费较多时间。为加快评估,你可以:减少评估数据集大小或设置.

evaluation_steps = 100

在测试时,你也可以拿出 20% 的训练数据用于测试。如果你已经使用了所有训练数据,那么你必须手动评估。你也可以使用自动评估工具,但请记住自动工具可能并不完全符合你的评估标准。

7. 运行与部署模型

现在在完成训练过程后让我们运行模型!你可以编辑黄色下划线部分!事实上,因为我们创建了一个多轮聊天机器人,我们现在也可以像模型以前看到过一些对话那样调用它,如下所示: 提示:Unsloth 本身也原生提供 2 倍更快的推理 ,所以别忘了调用FastLanguageModel.for_inference(model) 。如果你希望模型输出更长的回应,请将 max_new_tokens = 128

设置为更大的数值,例如 256 或 1024。注意你也需要为结果等待更长时间!

保存与部署

🖥️推理与部署chevron-right

要在 Ollama、vLLM、Open WebUI 等目标推理引擎中保存并部署你的模型,你需要在基础模型之上使用 LoRA 适配器。我们为每个框架提供了专门的指南:

GGUF & llama.cppchevron-right

如果你在单个设备(如笔记本或 Mac)上运行推理,请使用 llama.cpp 将其转换为 GGUF 格式以用于 Ollama、llama.cpp、LM Studio 等:

vLLMchevron-right

如果你要将 LLM 部署用于企业或多用户推理并使用 FP8、AWQ,请使用 vLLM: 我们现在可以将微调后的模型保存为一个小约 100MB 的文件,称为 LoRA 适配器,如下所示。你也可以将其推送到 Hugging Face hub 上传模型!记得获取 Hugging Face 的arrow-up-right 令牌

并添加你的令牌! 保存模型后,我们可以再次使用 Unsloth 来运行该模型本身!再次使用 FastLanguageModel

来调用它进行推理!

8. 我们完成了!

你已成功使用 Unsloth 对语言模型进行微调并将其导出到你想要的推理引擎! 要了解更多微调技巧与窍门,请访问我们的博客,博客提供大量有价值的教学内容:arrow-up-right

https://unsloth.ai/blog/ 这里arrow-up-right如果你在微调上需要任何帮助,你也可以加入我们的 Discord 服务器arrow-up-rightReddit r/unsloth(Reddit 社区)

最后更新于

这有帮助吗?