# LLM 微调指南

## 1. 什么是微调？

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

* OpenAI 的 **GPT-5** 被后训练以改进遵循指令和有帮助的对话行为。
* 标准的后训练方法称为监督微调（SFT）。其他方法包括偏好优化（DPO、ORPO）、蒸馏和 [强化学习（RL）](https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide) （GRPO、GSPO），在这些方法中，“智能体”通过与环境交互并接收 **反馈** 以 **奖励** 或 **或**.

惩罚 [Unsloth](https://github.com/unslothai/unsloth)借助 [笔记本](https://docs.unsloth.ai/get-started/unsloth-notebooks)，你可以在 Colab、Kaggle 或本地仅用 3GB 显存免费进行微调或 RL。通过在数据集上微调预训练模型，你可以：

* **更新并学习新知识**：注入并学习新的领域专有信息。
* **定制行为**：调整模型的语气、个性或响应风格。
* **针对任务优化**：提高特定用例的准确性和相关性。

**微调或 RL 的示例用例**:

* 使大型语言模型能够预测某个标题会对公司产生正面还是负面影响。
* 可以使用历史客户交互来提供更准确和定制的回复。
* 在法律文本上微调大型语言模型，用于合同分析、判例研究和合规性检查。

你可以把微调后的模型视为为特定任务设计的专用智能体，能够更有效、更高效地完成这些任务。 **微调可以复制所有 RAG 的能力**，但反之不然。

{% columns %}
{% column %}

#### :question:什么是 LoRA/QLoRA？

在大型语言模型中，我们有模型权重。Llama 70B 有 700 亿个数字。与更改所有 700 亿个数字不同，我们改为在每个权重上添加薄矩阵 A 和 B 并优化它们。这意味着我们只优化 1% 的权重。LoRA 指原始模型为 16 位未量化，而 QLoRA 将其量化为 4 位以节省 75% 的内存。
{% endcolumn %}

{% column %}

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-715b6260aae497f160d7f9a1019bcfa472675dcf%2Fimage%20(7)%20(1)%20(1).png?alt=media" alt=""><figcaption><p>我们不是优化模型权重（黄色），而是优化两个薄矩阵 A 和 B。</p></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

#### 关于微调的误解：

你可能听说微调不能让模型学习新知识或 RAG 比微调更好。那是 **' 和 '**&#x9519;误的。你可以用微调和强化学习训练一个专门的编程模型，而 RAG 无法改变模型的权重，只能在推理时扩充模型看到的内容。更多常见问题和误解请阅读 [这里](https://unsloth.ai/docs/zh/fine-tuning-for-beginners/faq-+-is-fine-tuning-right-for-me#fine-tuning-vs.-rag-whats-the-difference):

{% content-ref url="fine-tuning-for-beginners/faq-+-is-fine-tuning-right-for-me" %}
[faq-+-is-fine-tuning-right-for-me](https://unsloth.ai/docs/zh/kai-shi-shi-yong/fine-tuning-for-beginners/faq-+-is-fine-tuning-right-for-me)
{% endcontent-ref %}

> [**介绍 Unsloth Studio：** ](https://unsloth.ai/docs/zh/xin-zeng/studio) 我们新的开源 Web 界面用于训练和运行模型。这意味着你现在可以无代码地微调模型，并拥有可观测性和自动数据集创建功能。

<div data-with-frame="true"><figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2FxV1PO5DbF3ksB51nE2Tw%2Fmore%20cropped%20ui%20for%20homepage.png?alt=media&#x26;token=f75942c9-3d8d-4b59-8ba2-1a4a38de1b86" alt="" width="563"><figcaption></figcaption></figure></div>

## 2. 选择合适的模型和方法

如果你是初学者，最好从像 Llama 3.1 (8B) 这样的较小指令模型开始并从那里进行实验。你还需要在普通微调、RL、QLoRA 或 LoRA 训练之间做出决定：

* **强化学习（RL）** 当你需要模型在特定行为（例如调用工具）上表现出色时使用，这种方法使用环境和奖励函数而不是标注数据。我们有多个 [笔记本示例](https://unsloth.ai/docs/zh/unsloth-notebooks#grpo-reasoning-rl-notebooks)，但对于大多数用例，标准的 SFT 已经足够。
* **LoRA** 是一种参数高效的训练方法，通常保持基础模型的权重冻结，仅训练一小部分添加的低秩适配器权重（以 16 位精度）。
* **QLoRA** 将 LoRA 与 4 位精度相结合，以在极少资源下处理非常大的模型。
* Unsloth 还支持全量微调（FFT）和预训练，这些通常需要显著更多资源，但通常无需进行 FFT。如果操作得当，LoRA 可以匹配 FFT 的效果。
* Unsloth **所有类型的模型**: [文本转语音](https://unsloth.ai/docs/zh/ji-chu/text-to-speech-tts-fine-tuning), [嵌入](https://unsloth.ai/docs/zh/ji-chu/embedding-finetuning)、GRPO、RL、 [视觉](https://unsloth.ai/docs/zh/ji-chu/vision-fine-tuning)、多模态等。

{% hint style="info" %}
研究表明， **以相同精度进行训练和推理** 有助于保持准确性。这意味着如果你想以 4 位进行部署，就应以 4 位进行训练，反之亦然。
{% endhint %}

我们建议从 QLoRA 开始，因为它是最易接近且有效的训练方法之一。我们的 [动态 4 位](https://unsloth.ai/blog/dynamic-4bit) 量化方法使得 QLoRA 相比 LoRA 的准确性损失在很大程度上被恢复。

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-cfc51c261e6d24df3aa967d9b9a482313465cbc1%2Fmodel%20name%20change.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

你可以通过在 Hugging Face 上匹配模型名称来更改模型名称，例如： '`unsloth/llama-3.1-8b-unsloth-bnb-4bit`'.

我们建议从 **指令模型**开始，因为它们允许使用对话聊天模板（ChatML、ShareGPT 等）直接微调，并且相比 **基础模型** （如使用 Alpaca、Vicuna 等）需要更少的数据。关于 [指令模型与基础模型之间的差异，更多信息请见此处](https://unsloth.ai/docs/zh/kai-shi-shi-yong/what-model-should-i-use#instruct-or-base-model).

* 以 **`unsloth-bnb-4bit`** 结尾的模型名称 [**表示它们是**](https://unsloth.ai/blog/dynamic-4bit) **Unsloth 动态 4 位**量化模型
* 。这些模型比标准 BitsAndBytes 4 位模型消耗略多的显存，但提供显著更高的准确性。 **`如果模型名称仅以`**&#x62;nb-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 倍。禁用它将启用 16 位 LoRA 微调。你也可以启用 16 位 LoRA，设置`
* load\_in\_16bit = True `要启用全量微调（FFT），设置`full\_finetuning = True `。对于 8 位微调，设置`.
* **load\_in\_8bit = True** 注意： `一次只能将一种训练方法设置为` True

{% hint style="info" %}
。
{% endhint %}

一个常见错误是直接跳到全量微调（FFT），这非常耗算力。先用 LoRA 或 QLoRA 测试，如果在那里行不通，那么使用 FFT 几乎肯定也行不通。如果 LoRA 失败，也不要认为 FFT 会神奇地修复问题。 [你也可以进行](https://unsloth.ai/docs/zh/ji-chu/text-to-speech-tts-fine-tuning), [文本转语音（TTS）](https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide), [视觉](https://unsloth.ai/docs/zh/ji-chu/vision-fine-tuning), [推理（GRPO）](https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide/preference-dpo-orpo-and-kto) RL [（GRPO、DPO）、](https://unsloth.ai/docs/zh/ji-chu/continued-pretraining)继续预训练

{% columns %}
{% column %}
、文本补全和其他训练方法，均可使用 Unsloth。

{% content-ref url="fine-tuning-llms-guide/what-model-should-i-use" %}
[what-model-should-i-use](https://unsloth.ai/docs/zh/kai-shi-shi-yong/fine-tuning-llms-guide/what-model-should-i-use)
{% endcontent-ref %}
{% endcolumn %}

{% column %}
阅读我们关于选择模型的指南：

{% content-ref url="../mo-xing/tutorials" %}
[tutorials](https://unsloth.ai/docs/zh/mo-xing/tutorials)
{% endcontent-ref %}
{% endcolumn %}
{% endcolumns %}

## 关于单个模型的教程：

3\. 你的数据集

* 对于大型语言模型，数据集是可以用于训练模型的数据集合。为了用于训练，文本数据需要是可以被分词器处理的格式。
* 你通常需要创建一个包含两列的问题和答案数据集。数据的质量和数量在很大程度上决定微调的最终效果，因此务必把这部分做好。 [你可以](https://unsloth.ai/docs/zh/kai-shi-shi-yong/datasets-guide#synthetic-data-generation) 合成生成数据
* 并使用 ChatGPT 或本地大型模型将数据结构化（为问答对）。 [你也可以使用我们新的合成数据集笔记本，它会自动解析文档（PDF、视频等），生成问答对并使用像 Llama 3.2 这样的本地模型自动清理数据。](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Meta_Synthetic_Data_Llama3_2_\(3B\).ipynb)
* 在此处访问该笔记本。
* 微调可以从现有的文档库中学习并持续扩展其知识库，但单纯堆砌数据效果不会那么好。为了获得最佳结果，请策划一个结构良好的数据集，理想状况下为问答对。这有助于增强学习、理解和响应的准确性。

***但情况并非总是如此，例如，如果你正在为代码微调大型语言模型，直接堆放所有代码数据实际上也可能显著提升模型性能，即使没有结构化格式。因此这真的取决于你的用例。***

{% content-ref url="fine-tuning-llms-guide/datasets-guide" %}
[datasets-guide](https://unsloth.ai/docs/zh/kai-shi-shi-yong/fine-tuning-llms-guide/datasets-guide)
{% endcontent-ref %}

阅读更多关于创建数据集的内容： [在我们大多数笔记本示例中，我们使用](https://docs.unsloth.ai/basics/tutorial-how-to-finetune-llama-3-and-use-in-ollama#id-6.-alpaca-dataset) Alpaca 数据集

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

4\. 理解训练超参数 [了解如何使用研究和实际实验中的最佳实践来选择正确的](https://unsloth.ai/docs/zh/kai-shi-shi-yong/fine-tuning-llms-guide/lora-hyperparameters-guide) 超参数

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

{% content-ref url="fine-tuning-llms-guide/lora-hyperparameters-guide" %}
[lora-hyperparameters-guide](https://unsloth.ai/docs/zh/kai-shi-shi-yong/fine-tuning-llms-guide/lora-hyperparameters-guide)
{% endcontent-ref %}

## 有关超参数如何影响训练的完整指南，请参见：

5\. 安装与需求

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

Unsloth 笔记本 [笔记本](https://unsloth.ai/docs/zh/kai-shi-shi-yong/unsloth-notebooks) 我们建议初学者优先使用我们预先制作的

，因为它是开始的最简便方式，带有引导步骤。你以后可以将笔记本导出并在本地使用。 [文本转语音](https://unsloth.ai/docs/zh/ji-chu/text-to-speech-tts-fine-tuning), [嵌入](https://unsloth.ai/docs/zh/ji-chu/embedding-finetuning)、GRPO、RL、 [视觉](https://unsloth.ai/docs/zh/ji-chu/vision-fine-tuning)Unsloth 提供逐步的笔记本，适用于

### 、多模态、不同用例等。

本地安装 [docker](https://unsloth.ai/docs/zh/kai-shi-shi-yong/install/docker "mention") 或 `pip install unsloth` 你也可以通过 [Windows](https://unsloth.ai/docs/zh/kai-shi-shi-yong/install/windows-installation)在本地安装 Unsloth（在 Linux、WSL 或

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

{% columns %}
{% column %}
{% content-ref url="fine-tuning-for-beginners/unsloth-requirements" %}
[unsloth-requirements](https://unsloth.ai/docs/zh/kai-shi-shi-yong/fine-tuning-for-beginners/unsloth-requirements)
{% endcontent-ref %}
{% endcolumn %}

{% column %}
{% content-ref url="install" %}
[install](https://unsloth.ai/docs/zh/kai-shi-shi-yong/install)
{% endcontent-ref %}
{% endcolumn %}
{% endcolumns %}

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

6\. 训练与评估

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

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-feb9b0f5763d41cecaec9a3a9cd227ad918f0ca7%2Fimage.png?alt=media" alt="" width="375"><figcaption><p>训练过程中你会看到一串数字日志。这是训练损失，显示模型从你的数据集中学习得如何。对于许多情况，损失在 0.5 到 1.0 左右是个好迹象，但这取决于你的数据集和任务。如果损失没有下降，你可能需要调整设置。如果损失降为 0，则可能意味着过拟合，因此也应检查验证集。</p></figcaption></figure>

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

* **`我们通常建议保持默认设置，除非你需要更长的训练或更大的批量大小。`** 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\. 运行与部署模型

<div><figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-f2d5f23fa62ec89e06bf20fea433f9a1e42a2fe3%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure> <figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-cdf5d779635901dce7793df92531dbf3caf0fb0a%2Fimage%20(47).png?alt=media" alt=""><figcaption></figcaption></figure></div>

现在在完成训练过程后让我们运行模型吧！你可以编辑黄色下划线部分！事实上，因为我们创建了一个多轮聊天机器人，我们现在也可以像模型以前见过某些对话那样调用模型，如下所示： **提示：Unsloth 本身也原生提供** 2 倍更快的推理 `，所以别忘了调用`FastLanguageModel.for\_inference(model) `。如果你希望模型输出更长的回复，将` max\_new\_tokens = 128

### 设置为更大的数值，如 256 或 1024。注意你也需要为更长的结果等待更久！

保存与部署

{% content-ref url="../ji-chu/inference-and-deployment" %}
[inference-and-deployment](https://unsloth.ai/docs/zh/ji-chu/inference-and-deployment)
{% endcontent-ref %}

{% columns %}
{% column %}
要在你希望的推理引擎（如 Ollama、vLLM、Open WebUI）中保存和部署模型，你需要在基础模型之上使用 LoRA 适配器。我们为每个框架提供了专门的指南：

{% content-ref url="../ji-chu/inference-and-deployment/saving-to-gguf" %}
[saving-to-gguf](https://unsloth.ai/docs/zh/ji-chu/inference-and-deployment/saving-to-gguf)
{% endcontent-ref %}
{% endcolumn %}

{% column %}
如果你在单设备（如笔记本或 Mac）上运行推理，使用 llama.cpp 将模型转换为 GGUF 格式以在 Ollama、llama.cpp、LM Studio 等中使用：

{% content-ref url="../ji-chu/inference-and-deployment/vllm-guide" %}
[vllm-guide](https://unsloth.ai/docs/zh/ji-chu/inference-and-deployment/vllm-guide)
{% endcontent-ref %}
{% endcolumn %}
{% endcolumns %}

如果你要为企业或多用户推理部署 LLM，使用 FP8、AWQ，请使用 vLLM： [我们现在可以将微调后的模型保存为一个大约 100MB 的小文件，称为 LoRA 适配器，如下所示。你也可以将模型推送到 Hugging Face hub，如果你想上传模型的话！记得获取一个 Hugging Face](https://huggingface.co/settings/tokens) 令牌

<div><figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-8c577103f7c4fe883cabaf35c8437307c6501686%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure> <figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-1a1be852ca551240bdce47cf99e6ccd7d31c1326%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure></div>

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

## 来调用它进行推理！

8\. 我们完成了！

你已成功微调了一个语言模型，并使用 Unsloth 将其导出到你想要的推理引擎！ [要了解更多微调技巧和窍门，请前往我们的博客，那里提供大量有价值且教育性的内容：](https://unsloth.ai/blog/)

<https://unsloth.ai/blog/> [这里](https://discord.gg/unsloth) 或 [如果你在微调方面需要任何帮助，也可以加入我们的 Discord 服务器](https://www.reddit.com/r/unsloth/)Reddit r/unsloth

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-69482ba90d417f7bf98dddaf83795cdd3eb20efc%2Fsloth%20sparkling%20square.png?alt=media" alt="" width="188"><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://unsloth.ai/docs/zh/kai-shi-shi-yong/fine-tuning-llms-guide.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
