🦙教程:如何微调 Llama-3 并在 Ollama 中使用

为在本地 Ollama 上运行的定制个人助理(类似 ChatGPT)创建的初学者指南

在本教程结束时,您将通过以下方式创建一个自定义聊天机器人, 微调 Llama-3 使用 Unslotharrow-up-right 免费。它可以通过本地运行 Ollamaarrow-up-right 在您的电脑上,或通过 Google Colabarrow-up-right的免费 GPU 实例运行。您将能够像下面这样交互式地与聊天机器人互动:

Unsloth 使微调更加容易,并且可以自动将微调后的模型导出到 Ollama 并集成自动 Model 文件 创建!如果您需要帮助,可以加入我们的 Discord 服务器: https://discord.com/invite/unslotharrow-up-right

circle-exclamation

1. 什么是 Unsloth?

Unslotharrow-up-right 使得微调诸如 Llama-3、Mistral、Phi-3 和 Gemma 等大型模型快 2 倍,使用 70% 更少的内存,并且精度没有下降!在本教程中我们将使用提供免费 GPU 的 Google Colab。您可以访问我们下面的免费笔记本:

您还需要登录到您的 Google 账号!

2. 什么是 Ollama?

Ollama arrow-up-right允许您在自己的电脑上以快速且简单的方式运行语言模型!它会在后台安静地启动一个程序,可以运行像 Llama-3 这样的语言模型。如果您突然想问语言模型一个问题,只需向 Ollama 提交请求,它就会快速返回结果!我们将使用 Ollama 作为推理引擎!

3. 安装 Unsloth

如果您从未使用过 Colab 笔记本,下面是关于笔记本本身的快速简介:

  1. 每个“单元格”上的播放按钮。 点击此按钮以运行该单元格的代码。您不得跳过任何单元格,必须按时间顺序运行每个单元格。如果遇到错误,只需重新运行之前未运行的单元格。另一种选择是按 CTRL + ENTER,如果您不想点击播放按钮的话。

  2. 顶部工具栏的运行时按钮。 您也可以使用此按钮并点击“全部运行”一次性运行整个笔记本。这会跳过所有自定义步骤,是一个不错的首次尝试。

  3. 连接 / 重新连接 T4 按钮。 您可以点击此处查看更高级的系统统计信息。

第一个安装单元格如下所示:记得点击括号 [ ] 中的播放按钮。我们获取开源的 Github 包,并安装其他一些包。

4. 选择一个要微调的模型

现在让我们选择一个用于微调的模型!我们默认选择来自 Meta / Facebook 的 Llama-3,该模型在惊人的 15 万亿“tokens”上训练。假设一个 token 类似于 1 个英文单词。这大约相当于 350,000 本厚重百科全书!其他流行模型包括 Mistral、基于 GPT-4 输出训练的 Phi-3 和 Google 的 Gemma(13 万亿 tokens)。

Unsloth 支持这些模型及更多!事实上,只需在 Hugging Face 模型中心输入一个模型即可查看是否可用!如果不可用我们会报错。

还有 3 个其他设置可供切换:

  1. 这决定了模型的上下文长度。例如 Gemini 的上下文长度超过 100 万,而 Llama-3 的上下文长度为 8192。我们允许您选择任意数字——但建议为测试目的将其设为 2048。Unsloth 也支持非常长的上下文微调,我们展示了比最佳方案提供 4 倍更长的上下文长度。

  2. 保持为 None,但您可以为较新的 GPU 选择 torch.float16 或 torch.bfloat16。

  3. 我们在 4 位量化下进行微调。这将内存使用量减少 4 倍,使我们能够在免费 16GB 内存的 GPU 上进行微调。4 位量化本质上将权重转换为有限集合的数字以减少内存使用。其缺点是大约有 1-2% 的精度下降。如果在更大的 GPU(如 H100)上希望获得那一点额外精度,请将其设为 False。

如果您运行该单元格,您将看到一些关于 Unsloth 版本、您使用的模型、GPU 内存及其他统计信息的打印输出。现在忽略这些即可。

5. 微调参数

现在要自定义您的微调,您可以编辑上面的数字,不过您也可以忽略它,因为我们已经选择了相当合理的数值。

目标是更改这些数字以提高精度,但同时也要 对抗过拟合。过拟合是指让语言模型记住一个数据集,而无法回答新的问题。我们希望最终模型能够回答未见过的问题,而不是进行记忆式输出。

  1. 微调过程的秩。较大的数字使用更多内存并且会更慢,但可以在更困难的任务上提高精度。我们通常建议像 8(用于快速微调)这样的数值,最大可到 128。过大的数值可能导致过拟合,损害模型质量。

  2. 我们选择所有模块进行微调。您可以删除一些以减少内存使用并加快训练,但我们强烈不建议这样做。请对所有模块进行训练!

  3. 微调的缩放因子。较大的数值会使微调更深入地学习您的数据集,但也可能促使过拟合。我们建议将其设置为等于秩 r,或者为其两倍。

  4. 将其保留为 0 以加快训练!可以减少过拟合,但效果不大。

  5. 将其保留为 0 以获得更快且更少过拟合的训练!

  6. 选项包括 True, False"unsloth"。我们建议 "unsloth" ,因为我们额外减少了 30% 的内存使用并支持极长上下文微调。您可以在这里阅读: https://unsloth.ai/blog/long-contextarrow-up-right 以获取更多细节。

  7. 用于确定确定性运行的数字。训练和微调需要随机数,因此设置此数字可以使实验可复现。

  8. 高级特性用于自动设置 lora_alpha = 16 。如果您愿意可以使用它!

  9. 高级功能用于将 LoRA 矩阵初始化为权重的前 r 个奇异向量。可以在某种程度上提高精度,但可能导致启动时内存激增。

6. Alpaca 数据集

我们现在将使用由 GPT-4 自己生成的 Alpaca 数据集。它包含 52,000 条指令与输出的列表,在 Llama-1 发布时非常流行,因为它使微调基础 LLM 在竞争中接近 ChatGPT 本身的表现。

您可以在这里访问 GPT4 版本的 Alpaca 数据集: https://huggingface.co/datasets/vicgalle/alpaca-gpt4arrow-up-right。该数据集的较早初版在这里: https://github.com/tatsu-lab/stanford_alpacaarrow-up-right。下面显示了数据集的一些示例:

您可以看到每一行有 3 列——一条指令、一个输入和一个输出。我们本质上将每一行合并为如下的大提示。然后使用此来微调语言模型,这使其非常类似于 ChatGPT。我们称这个过程为 监督指令微调.

7. 用于微调的多列

但一个大问题是对于 ChatGPT 风格的助手,我们只允许 1 条指令 / 1 个提示,而不是多列 / 多输入。例如在 ChatGPT 中,您必须提交 1 个提示,而不是多个提示。

这本质上意味着我们必须将多个列“合并”成 1 个大提示,才能让微调实际起作用!

例如非常著名的 Titanic 数据集有很多列。您的任务是根据乘客的年龄、客舱等级、票价等来预测乘客是生存还是死亡。我们不能简单地将这些直接传入 ChatGPT,而是必须将这些信息“合并”成 1 个大提示。

例如,如果我们用包含该乘客所有信息的“合并”单一提示询问 ChatGPT,我们就可以让它猜测或预测该乘客是生还还是死亡。

其他微调库要求您手动准备用于微调的数据集,将所有列合并成 1 个提示。在 Unsloth 中,我们只需提供名为 to_sharegpt 的函数,

它可以一次性完成此操作! 要访问 Titanic 微调笔记本或如果您想上传 CSV 或 Excel 文件,请访问:arrow-up-right

https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing

  • 现在这有点更复杂,因为我们允许很多自定义,但有几点须知: {}您必须用大括号将所有列括起来

  • 。这些是实际 CSV / Excel 文件中的列名。 [[]]可选的文本组件必须用

  • 括起来。例如如果列 "input" 为空,合并函数将不会显示该文本并跳过它。这对于存在缺失值的数据集很有用。 output_column_name 中选择输出或目标 / 预测列。.

对于 Alpaca 数据集,这将是

output

例如在 Titanic 数据集中,我们可以创建如下的合并大提示格式,其中每一列 / 文本片段都变为可选。
例如,假设数据集看起来像下面这样并有很多缺失数据:
登船港口

年龄

23

18

7.25

票价

  1. S 然后,我们不希望结果是:.

  2. 该乘客从 S 登船。他们的年龄是 23。他们的票价是 然后,我们不希望结果是:

该乘客从 [[]]登船。他们的年龄是 18。他们的票价是 $7.25。

  1. 相反,通过使用可选地将列用 然后,我们不希望结果是:.]]

  2. 括起来,我们可以完全排除此信息。 然后,我们不希望结果是:[[该乘客从 S 登船。]] [[他们的年龄是 23。]] [[他们的票价是

[[该乘客从

  1. 登船。]] [[他们的年龄是 18。]] [[他们的票价是 $7.25。]]

  2. 变为:

该乘客从 S 登船。他们的年龄是 23。

他们的年龄是 18。他们的票价是 $7.25。

8. 多轮对话 如果您没有注意到,一个问题是 Alpaca 数据集是单轮的,而使用 ChatGPT 是交互式的,可以进行多轮对话。例如,左侧是我们想要的,但右侧(即 Alpaca 数据集)仅提供单一对话。我们希望微调后的语言模型能以某种方式学会像 ChatGPT 一样进行多轮对话。 因此我们引入了

conversation_extension 参数,该参数本质上会在您的单轮数据集中随机选择若干行并将它们合并为 1 个对话!例如,如果将其设置为 3,我们会随机选择 3 行并将它们合并为 1 个对话!设置得太长会使训练变慢,但可能使您的聊天机器人和最终微调效果更好!

然后将 设置为预测 / 输出列。对于 Alpaca 数据集,这将是 output 列。 然后我们使用

standardize_sharegpt

函数来将数据集整理成适合微调的正确格式!务必调用此函数!

9. 可定制的聊天模板

现在我们可以为微调本身指定聊天模板。非常著名的 Alpaca 格式如下: 但请记住我们之前说过这是个坏主意,因为 ChatGPT 风格的微调只需要 1 个提示?由于我们成功地使用 Unsloth 将所有数据集列合并为 1 个,因此我们本质上可以创建如下样式的聊天模板,只有 1 个输入列(instruction)和 1 个输出: 我们只要求您必须放置一个 {INPUT} 字段用于指令,以及一个 {OUTPUT} 字段用于模型的输出字段。我们实际上也允许一个可选的

{SYSTEM}

字段,这对于像在 ChatGPT 中一样自定义系统提示非常有用。例如,下面是一些很酷的示例,您可以自定义聊天模板为: {OUTPUT} 对于 OpenAI 模型中使用的 ChatML 格式:

或者您也可以使用 Llama-3 本身的模板(仅通过使用 Llama-3 的 instruct 版本才有效):我们实际上也允许一个可选的 要访问 Titanic 微调笔记本或如果您想上传 CSV 或 Excel 文件,请访问:arrow-up-right

字段,这对于像在 ChatGPT 中一样自定义系统提示非常有用。

或者在 Titanic 预测任务中,您需要预测乘客在这个包含 CSV 和 Excel 上传的 Colab 笔记本中是死亡还是生存:

10. 训练模型

  1. 我们通常不建议更改上面的参数,但在此对其中一些进行详细说明: per_device_train_batch_size = 2, 如果您想更多地利用 GPU 内存,请增加批量大小。增加此值还可以使训练更平稳并减少过拟合。我们通常不建议这样做,因为这可能由于填充问题反而使训练变慢。我们通常建议您增加

  2. ,它只是对数据集做更多次遍历。

  3. 等同于增加上述批量大小,但不会影响内存消耗!如果您想要更平滑的训练损失曲线,通常建议增加此值。 max_steps = 60, # num_train_epochs = 1,我们将步骤设置为 60 以加快训练。对于可能需要数小时的完整训练,改为注释掉 max_steps,并将其替换为

  4. 。将其设置为 1 意味着对数据集进行 1 次完整遍历。我们通常建议 1 到 3 次遍历,不要超过,否则您会使微调过拟合。

learning_rate = 2e-4,

如果您想让微调过程更慢但更有可能收敛到更高精度的结果,请降低学习率。我们通常建议尝试 2e-4、1e-4、5e-5、2e-5 等数值。

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

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

max_new_tokens = 128

设置为更大的数字,例如 256 或 1024。注意您也需要等待更长时间才能得到结果! 12. 保存模型arrow-up-right 我们现在可以将微调后的模型保存为一个大约 100MB 的小文件,称为 LoRA 适配器,如下所示。如果您想上传模型,也可以将其推送到 Hugging Face hub!记得通过以下地址获取 Hugging Face 令牌:

https://huggingface.co/settings/tokens 并添加您的令牌! 保存模型后,我们可以再次使用 Unsloth 来运行模型本身!再次使用

FastLanguageModel

来调用它进行推理!

13. 导出到 Ollama

最后我们可以将微调后的模型导出到 Ollama!首先我们必须在 Colab 笔记本中安装 Ollama: False 然后我们将微调后的模型导出为 llama.cpp 的 GGUF 格式,如下所示: True 提醒将 True转换为 True仅对第 1 行进行转换,而不是将每一行都改为 ,否则您将等待很长时间!我们通常建议将第一行设置为 ,这样我们就可以快速将微调后的模型导出为 Q8_0.

格式(8 位量化)。我们还允许您导出到一整套量化方法,其中一个流行的为 q4_k_marrow-up-right 。前往 https://github.com/ggerganov/llama.cpparrow-up-right

以了解有关 GGUF 的更多信息。如果您愿意,我们也提供了一些如何手动导出到 GGUF 的说明,见:

https://github.com/unslothai/unsloth/wiki#manually-saving-to-gguf

您会看到如下的长列表文本——请等待 5 到 10 分钟!! 最后在最末尾,它会显示如下: 然后,我们必须在后台运行 Ollama 本身。我们使用 subprocess 因为 Colab 不喜欢异步调用,但通常在终端 / 命令提示符中只需运行

ollama serve Model 文件

14. 自动 Model 文件 创建 Model 文件 Unsloth 提供的技巧是我们会自动创建一个

,这是 Ollama 所需的!这只是一个设置列表,包括我们用于微调过程的聊天模板!您还可以像下面这样打印出 Model 文件

生成的内容:

然后我们请求 Ollama 创建一个与 Ollama 兼容的模型,使用

15. Ollama 推理

如果您想调用在您本地机器 / 在后台运行的免费 Colab 笔记本中的 Ollama 服务器,我们现在可以进行推理调用。记住您可以编辑黄色下划线部分。 16. 交互式 ChatGPT 风格

但要像 ChatGPT 那样真正运行微调模型,我们还需要做一些额外操作!首先点击终端图标 ,一个终端窗口会弹出。它位于左侧边栏。 然后,您可能需要按两次 ENTER 以清除终端窗口中的一些奇怪输出。等待几秒钟并输入

ollama run unsloth_model

然后按 ENTER。

最后,您可以像实际的 ChatGPT 一样与微调后的模型互动!按 CTRL + D 退出系统,按 ENTER 与聊天机器人对话!

您做到了! 您已成功使用 Unsloth 以 2 倍速度并减少 70% VRAM 地微调了一个语言模型并将其导出到 Ollama!并且这一切都是在 Google Colab 笔记本中免费完成的!arrow-up-right.

如果您想学习如何进行奖励建模、继续预训练、导出到 vLLM 或 GGUF、进行文本补全,或了解更多关于微调的技巧和窍门,请前往我们的 Githubarrow-up-right如果您在微调方面需要任何帮助,您也可以加入我们的 Discord 服务器 Githubarrow-up-right.

此处

。如果您想要 Ollama 的帮助,您也可以加入他们的服务器 Githubarrow-up-right最后,我们要感谢您读到此处并一路跟随!我们希望这能让您理解微调语言模型背后的一些原理,并希望这对您有用! Githubarrow-up-right.

最后更新于

这有帮助吗?