🦙教程:如何微调 Llama-3 并在 Ollama 中使用
为创建可在 Ollama 本地运行的定制个人助手(如 ChatGPT)而准备的初学者指南
在本教程结束时,您将通过以下方式创建一个自定义聊天机器人, 微调 Llama-3 与 Unsloth 免费。它可以通过以下方式在本地运行, Ollama 在您的 PC 上,或通过免费 GPU 实例在以下平台上运行, Google Colab。您将能够像下面这样与聊天机器人进行交互:

Unsloth 使微调变得更容易,并且可以自动将微调后的模型导出到 Ollama 并集成自动化的 模型文件 创建!如果您需要帮助,您可以加入我们的 Discord 服务器: https://discord.com/invite/unsloth
如果您想复制或保存代码,所有内容都可以在我们的 Ollama Colab 笔记本中获得。您可以直接在那里使用它,或将其调整为本地设置: https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb
1. 什么是 Unsloth?
Unsloth 使像 Llama-3、Mistral、Phi-3 和 Gemma 这样的 LLM 微调快 2 倍,使用 70% 更少的内存,并且在准确性上没有下降!在本教程中我们将使用提供免费 GPU 的 Google Colab。您可以访问我们下面的免费笔记本:
Ollama Llama-3 Alpaca (我们将使用的笔记本)
您还需要登录您的 Google 账户!

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

3. 安装 Unsloth

如果您从未使用过 Colab 笔记本,这里是关于笔记本本身的快速入门:
每个“单元(cell)”的播放按钮。 点击此按钮可运行该单元的代码。您不能跳过任何单元,必须按时间顺序运行每个单元。如果遇到任何错误,只需重新运行之前未运行的单元。另一种选择是按 CTRL + ENTER,如果您不想点击播放按钮。
顶部工具栏的运行时按钮。 您也可以使用此按钮并点击“全部运行”以一次运行整个笔记本。这会跳过所有自定义步骤,对于第一次尝试是一个不错的选择。
连接 / 重新连接 T4 按钮。 您可以点击此处获取更高级的系统统计信息。
第一个安装单元如下所示:记得点击方括号 [ ] 中的播放按钮。我们获取开源的 Github 包,并安装其他一些包。

4. 选择要微调的模型
现在让我们为微调选择一个模型!我们默认使用来自 Meta / Facebook 的 Llama-3,它在惊人的 15 万亿“tokens”上进行了训练。假设一个 token 类似于 1 个英文单词。这大约相当于 350,000 本厚重的百科全书!其他流行的模型包括 Mistral、Phi-3(使用 GPT-4 输出训练)和来自 Google 的 Gemma(13000 亿 tokens!)。
Unsloth 支持这些模型及更多!实际上,只需键入 Hugging Face 模型中心的模型名称即可查看是否可用!如果不可用我们会报错。

还有另外 3 个可切换的设置:
这决定了模型的上下文长度。例如 Gemini 有超过一百万的上下文长度,而 Llama-3 的上下文长度为 8192。我们允许您选择任意数字——但建议将其设置为 2048 以便测试使用。Unsloth 还支持非常长的上下文微调,并且我们展示能提供比最好方案长 4 倍的上下文长度。
保持为 None,但对于较新的 GPU,您可以选择 torch.float16 或 torch.bfloat16。
我们在 4 位量化下进行微调。这将内存使用降低 4 倍,使我们能够在免费 16GB 内存的 GPU 上进行微调。4 位量化本质上将权重转换为一组有限的数值以减少内存使用。其缺点是会有大约 1-2% 的准确率下降。如果您在更大的 GPU(如 H100)上想要那一点点额外准确性,可将其设置为 False。

如果您运行该单元,您将看到一些关于 Unsloth 版本、您正在使用的模型、GPU 有多少内存以及其他一些统计信息的输出。暂时忽略这些信息。
5. 微调参数

现在要自定义您的微调,您可以编辑上面的数字,但也可以忽略它们,因为我们已经选择了相当合理的数值。
目标是更改这些数字以提高准确性,同时也要 对抗过拟合。过拟合是指您让语言模型记住数据集,而无法回答新的问题。我们希望最终模型能够回答看不见的问题,而不是做记忆式回答。
微调过程的秩。更大的数字使用更多内存且速度更慢,但可以在更难的任务上提高准确性。我们通常建议像 8(用于快速微调)这样的数字,最多到 128。过大的数字会导致过拟合,损害模型质量。
我们选择所有模块进行微调。您可以移除一些模块以减少内存使用并加快训练,但我们强烈不建议这样做。就全部模块一起训练即可!
微调的缩放因子。较大的数字会使微调更多地学习您的数据集,但可能促进过拟合。我们建议将其设为等于秩(rank)
r,或为其两倍。保留为 0 以加快训练!可以减少过拟合,但效果不大。
将其保留为 0 以便更快且更少过拟合的训练!
选项包括
True,False和"unsloth"。我们建议"unsloth"因为我们能额外减少约 30% 的内存使用并支持极长上下文的微调。您可以在此阅读: https://unsloth.ai/blog/long-context 了解更多细节。该数字用于确定确定性运行。训练和微调需要随机数,因此设置该数字可使实验可重现。
一个高级功能,用于设置
lora_alpha = 16自动化。您如果愿意可以使用它!一个高级功能,用于将 LoRA 矩阵初始化为权重的前 r 个奇异向量。可以在一定程度上提高准确性,但可能在开始时使内存使用暴涨。
6. Alpaca 数据集

我们现在将使用由调用 GPT-4 自身创建的 Alpaca 数据集。它是一个包含 52,000 条指令及输出的列表,当 Llama-1 发布时非常流行,因为它使基础 LLM 的微调在与 ChatGPT 竞争方面具有优势。
您可以在此访问 GPT4 版本的 Alpaca 数据集: https://huggingface.co/datasets/vicgalle/alpaca-gpt4。数据集的较早第一个版本在这里: https://github.com/tatsu-lab/stanford_alpaca。下面展示了数据集的一些示例:

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

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

这本质上意味着我们必须将多个列“合并”成 1 个大型提示,才能让微调真正起作用!
例如,非常著名的 Titanic(泰坦尼克号)数据集有许多列。您的任务是根据乘客的年龄、乘客等级、票价等预测乘客是幸存还是死亡。我们不能简单地将这些直接传入 ChatGPT,而是必须将这些信息“合并”成 1 个大型提示。

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

其他微调库要求您手动准备用于微调的数据集,通过将所有列合并为 1 个提示。在 Unsloth 中,我们只需提供名为 to_sharegpt 的函数,
它可以一次性完成此操作! 要访问 Titanic 微调笔记本或如果您想上传 CSV 或 Excel 文件,请访问:

https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing
这现在有点更复杂,因为我们允许大量自定义,但有几点需要注意:
{}您必须用花括号将所有列括起来。这些是实际 CSV / Excel 文件中的列名。
[[]]可选的文本组件必须用括起来。例如如果列“input”为空,合并函数将不显示该文本并跳过它。这对于存在缺失值的数据集非常有用。
在output_column_name中选择输出或目标 / 预测列。对于 Alpaca 数据集,这将是.
output

例如在 Titanic 数据集中,我们可以创建如下的大型合并提示格式,其中每一列 / 文本片段都变为可选。
票价(Fare)
23
18
7.25
S
那么,我们不希望结果是: 乘客从 S 登船。他们的年龄是 23。他们的票价是.
空(EMPTY) 乘客从 S 登船。他们的年龄是 23。他们的票价是乘客从
登船。他们的年龄是 18。他们的票价是 $7.25。 [[]]相反,通过可选地使用
将列括起来,我们可以完全排除该信息。 乘客从 S 登船。他们的年龄是 23。他们的票价是.]]
[[乘客从 S 登船。]] [[他们的年龄是 23。]] [[他们的票价是 乘客从 S 登船。他们的年龄是 23。他们的票价是[[乘客从
登船。]] [[他们的年龄是 18。]] [[他们的票价是 $7.25。]]
变为:
乘客从 S 登船。他们的年龄是 23。
他们的年龄是 18。他们的票价是 $7.25。
8. 多轮对话

如果您没有注意到,一个问题是 Alpaca 数据集是单轮的,而使用 ChatGPT 时是交互式的,您可以进行多轮对话。例如,左边是我们想要的,但右边的 Alpaca 数据集只提供单条对话。我们希望微调后的语言模型能够以某种方式学习如何像 ChatGPT 一样进行多轮对话。 所以我们引入了 conversation_extension

参数,该参数实际上会在您的单轮数据集中随机选择若干行,并将它们合并成一段对话!例如,如果您将其设置为 3,我们会随机选择 3 行并将它们合并为 1 条对话!设置得太长会使训练变慢,但可能会使您的聊天机器人和最终微调效果更好! 在 然后将
设置为预测 / 输出列。对于 Alpaca 数据集,它将是 output 列。 然后我们使用 standardize_sharegpt

函数来将数据集制成适合微调的正确格式!务必调用此函数!
9. 可自定义的聊天模板

我们现在可以为微调本身指定聊天模板。非常著名的 Alpaca 格式如下:

但请记住我们说过这是一个坏主意,因为 ChatGPT 风格的微调只需要 1 个提示?既然我们已经使用 Unsloth 成功地将所有数据列合并为 1 条提示,我们基本上可以创建下面这种带有 1 个输入列(instruction)和 1 个输出的聊天模板: 我们只要求您必须放置一个 {INPUT} 字段用于指令,和一个 {OUTPUT} 字段用于模型的输出字段。我们实际上还允许一个可选的 {SYSTEM}

字段,这对于像 ChatGPT 一样自定义系统提示非常有用。例如,下面是一些很酷的示例,您可以自定义聊天模板为:

对于 OpenAI 模型使用的 ChatML 格式: 字段用于模型的输出字段。我们实际上还允许一个可选的 或者您可以使用 Llama-3 自身的模板(仅在使用 Llama-3 的 instruct 版本时有效):我们实际上还允许一个可选的

字段,这对于像 ChatGPT 一样自定义系统提示非常有用。 要访问 Titanic 微调笔记本或如果您想上传 CSV 或 Excel 文件,请访问:

或者在 Titanic 预测任务中,您需要在此 Colab 笔记本中预测乘客是死亡还是幸存,该笔记本包含 CSV 和 Excel 上传功能:
10. 训练模型

现在让我们训练模型!我们通常建议人们不要编辑下面的内容,除非您想进行更长步骤的微调或想在更大的批次大小上训练。
per_device_train_batch_size = 2,
gradient_accumulation_steps如果您想更多地利用 GPU 的内存,请增加批量大小。还可以增加此值以使训练更平滑并减少过拟合。我们通常不建议这样做,因为这可能由于填充问题使训练实际上变慢。我们通常建议您增加,它只是对数据集进行更多遍历。
max_steps = 60,# num_train_epochs = 1,
我们将步骤设置为 60 以加快训练速度。对于可能需要数小时的完整训练运行,请注释掉max_steps,并用num_train_epochs = 1learning_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. 保存模型 https://huggingface.co/settings/tokens 并添加您的令牌!

保存模型后,我们可以再次使用 Unsloth 来运行模型本身!使用 FastLanguageModel 再次调用它进行推理!

我们现在可以将微调后的模型保存为一个小的约 100MB 的文件,称为 LoRA 适配器,如下所示。如果您想上传模型,也可以推送到 Hugging Face hub!记得通过以下方式获取 Hugging Face 令牌:
最后我们可以将微调后的模型导出到 Ollama 本身!首先我们必须在 Colab 笔记本中安装 Ollama:

然后我们将微调后的模型导出为 llama.cpp 的 GGUF 格式,如下所示:

提醒将 False 为 True 对第一行进行设置,而不是将每一行都改为 True,否则您将等待很长时间!我们通常建议将第一行设置为 True,以便我们可以快速将微调后的模型导出为 Q8_0 格式(8 位量化)。我们也允许您导出为多种量化方法,其中一种流行的方法是 q4_k_m.
前往 https://github.com/ggerganov/llama.cpp 了解有关 GGUF 的更多信息。如果您愿意,我们也有一些关于如何导出到 GGUF 的手动说明,见: https://github.com/unslothai/unsloth/wiki#manually-saving-to-gguf
您将看到一长串如下的文本——请等待 5 到 10 分钟!!

最后在最末尾,它会像下面这样:

然后,我们必须在后台运行 Ollama 本身。我们使用 subprocess 因为 Colab 不太喜欢异步调用,但通常只需在终端/命令提示符中运行 ollama serve 。

13. 导出到 Ollama 模型文件 创建
模型文件 创建Unsloth 提供的技巧是我们会自动创建一个 模型文件 这是 Ollama 所需要的!这只是一个设置列表,并包含我们在微调过程中使用的聊天模板!您还可以打印出生成的 模型文件 如下:

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

14. 自动化
如果您想调用正在您本地机器/免费 Colab 笔记本后台运行的 Ollama 服务器,我们现在可以进行推理了。记住您可以编辑黄色下划线部分。

15. Ollama 推理
16. 交互式 ChatGPT 风格
但要像 ChatGPT 一样实际运行微调模型,我们还需要做一些额外操作!首先点击终端图标

,一个终端将弹出。它位于左侧边栏。 然后,您可能需要按两次 ENTER 以清除终端窗口中的一些奇怪输出。等待几秒钟并输入 ollama run unsloth_model

然后按 ENTER。

最后,您就可以像与真正的 ChatGPT 一样与微调模型互动了!按 CTRL + D 退出系统,按 ENTER 与聊天机器人对话!
您做到了!
您已成功微调了一个语言模型,并通过 Unsloth 以 2 倍更快且使用 70% 更少显存的方式将其导出到 Ollama!而且这一切都是在 Google Colab 笔记本中免费完成的! 如果您想学习如何做奖励建模、继续预训练、导出到 vLLM 或 GGUF、做文本补全,或了解更多微调技巧,请前往我们的.
Github 如果您在微调方面需要任何帮助,您也可以加入我们的 Discord 服务器这里 如果您在微调方面需要任何帮助,您也可以加入我们的 Discord 服务器.
。如果您想要 Ollama 的帮助,您也可以加入他们的服务器
最后,我们要感谢您读到这里并一路跟随!我们希望这能帮助您理解微调语言模型背后的一些关键原理,并且希望这对您有用! 如果您在微调方面需要任何帮助,您也可以加入我们的 Discord 服务器要访问我们的 Alpaca 数据集示例,请点击 如果您在微调方面需要任何帮助,您也可以加入我们的 Discord 服务器.
最后更新于
这有帮助吗?

