🧬微调 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)这样的较小的指令型模型开始并从那里进行试验。您还需要在常规微调、强化学习、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;对于较新的 GPU,请使用torch.float16

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

  • load_in_16bit = True 来启用 16 位 LoRA。要启用完全微调 (FFT),将 full_finetuning = True.

  • 设置为 True 。对于 8 位微调,请设置 load_in_8bit = True

circle-info

注意:

一次只能将一种训练方法设置为 True, , 视觉, 一个常见错误是直接跳到完全微调 (FFT),这会消耗大量计算资源。首先用 LoRA 或 QLoRA 测试,如果在那里行不通,几乎可以肯定在 FFT 中也行不通。如果 LoRA 失败,也不要认为 FFT 会神奇地解决问题。 您也可以进行 文本到语音 (TTS)推理(GRPO)

继续预训练

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

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

  • 关于各模型的个人教程: 3. 您的数据集 对于大语言模型,数据集是可用于训练我们模型的数据集合。为了对训练有用,文本数据需要是可被分词器处理的格式。

  • 您通常需要创建一个具有两列的数据集——问题和答案。质量和数量将在很大程度上反映微调的最终效果,因此将此部分做好至关重要。 您可以arrow-up-right

  • 以合成方式生成数据

  • 并使用 ChatGPT 或本地大模型将数据结构化为问答对。

您还可以使用我们新的合成数据集笔记本,它会自动解析文档(PDF、视频等)、生成问答对并使用像 Llama 3.2 这样的本地模型自动清理数据。

📈数据集指南chevron-right

在此处访问该笔记本。 微调可以从现有的文档库中学习并持续扩展其知识库,但仅仅堆砌数据的效果不会那么好。为获得最佳结果,请策划一个结构良好的数据集,理想情况下为问答对。这将增强学习、理解和响应的准确性。arrow-up-right 但情况并非总是如此,例如如果您在为代码进行微调,将所有代码数据直接堆砌实际上也可能使模型显著提升性能,即使没有结构化格式。因此这确实取决于您的用例。

阅读有关创建数据集的更多内容:

在我们的大多数笔记本示例中,我们使用了 Alpaca 数据集 ,但像视觉类的其他笔记本将使用不同的数据集,答案输出中可能也需要包含图像。

4. 理解训练超参数

🧠Hyperparameters Guidechevron-right

学习如何使用研究和真实世界实验的最佳实践来选择正确的

超参数

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

关于超参数如何影响训练的完整指南,请参见: 笔记本 5. 安装 + 要求

您可以通过两种主要方式使用 Unsloth,我们的免费笔记本或在本地。 文本到语音, 嵌入,GRPO、RL、 视觉Unsloth 笔记本

我们建议初学者首先使用我们预先制作的

,因为这是开始的最简单方式并有分步引导。您以后可以导出笔记本以在本地使用。 DockerUnsloth 提供针对 、多模态、不同用例等的逐步笔记本。 本地安装您也可以通过以下方式在本地安装 Unsloth:

pip install unsloth

(适用于 Linux、WSL 或

Windows

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

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

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-4

5e-5 ,或.

2e-5

评估

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

evaluation_steps = 100 用于测试,您也可以拿出 20% 的训练数据并将其用于测试。如果您已经使用了所有训练数据,那么就必须手动评估。您也可以使用自动评估工具,但请记住自动化工具可能无法完全符合您的评估标准。 7. 运行与部署模型 现在在完成训练过程后让我们运行模型吧!您可以编辑黄色下划线部分!事实上,因为我们创建了多轮聊天机器人,我们现在也可以像模型曾经看到过一些过去的对话那样调用它,如下所示:提醒:Unsloth 本身也提供 2 倍更快的推理速度 原生支持,所以别忘了调用

FastLanguageModel.for_inference(model)

。如果您希望模型输出更长的回答,将

🖥️推理与部署chevron-right

max_new_tokens = 128

GGUF & llama.cppchevron-right

设置为更大的数值,例如 256 或 1024。注意,您也需要等待更久才能得到结果!

vLLMchevron-right

保存与部署 要将模型保存并部署到所需的推理引擎(如 Ollama、vLLM、Open WebUI),您需要在基础模型之上使用 LoRA 适配器。我们为每个框架提供了专门的指南:arrow-up-right 如果您在单个设备(如笔记本或 Mac)上运行推理,请使用 llama.cpp 将模型转换为 GGUF 格式以供 Ollama、llama.cpp、LM Studio 等使用:

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

并添加您的令牌!

保存模型后,我们可以再次使用 Unsloth 来运行模型本身!再次使用

FastLanguageModel 来调用它进行推理!arrow-up-right

8. 我们完成了! 在此arrow-up-right您已成功使用 Unsloth 微调了一个语言模型并将其导出到您选择的推理引擎!arrow-up-right要了解更多关于微调的技巧与窍门,请访问我们的博客,其中提供大量有价值的教育内容:

最后更新于

这有帮助吗?