Unsloth 教程 - 如何微调 Llama-3并导出到 Ollama

2024-08-25 02:12

本文主要是介绍Unsloth 教程 - 如何微调 Llama-3并导出到 Ollama,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文翻译整理自:🦙 How to Finetune Llama-3 and Export to Ollama
https://docs.unsloth.ai/tutorials/how-to-finetune-llama-3-and-export-to-ollama


文章目录

      • 1、什么是Unsloth?
      • 2、什么是Ollama?
      • 3、安装Unsloth
      • 4、选择要微调的模型
      • 5、微调参数
      • 6、Alpaca 数据集
      • 7、多列微调
      • 8、多轮对话
      • 9、可定制的聊天模板
      • 10、训练模型
      • 11、推理/运行模型
      • 12、保存模型
      • 13、导出到 Ollama
      • 14、自动创建`Modelfile`
      • 15、Ollama 推理
      • 16、交互式ChatGPT风格
      • 你做到了!


创建自定义个人助理(如ChatGPT)以在Ollama上本地运行的初学者指南

在本教程结束时,您将通过微调Llama-3和Unsloth 免费创建一个自定义聊天机器人。
它可以通过PC上的Ollama在本地运行,也可以通过Google Colab在免费的GPU实例中运行。
您将能够像下面这样与聊天机器人交互:

在这里插入图片描述


Unsloth使微调变得更加容易,并且可以通过集成的自动Modelfile 创建自动将微调模型 导出到Ollama

如果您需要帮助,您可以加入我们的 discord :https://discord.com/invite/unsloth


1、什么是Unsloth?

Unsloth使Llama-3、Mistral、Phi-3和Gemma等微调LLM的速度提高了2倍,使用的内存减少了70%,并且精度没有下降!在本教程中,我们将使用提供免费GPU的Google Colab。
您可以访问下面的免费笔记本:

  • Ollama Llama-3 Alpaca(笔记本,我们将使用)
  • CSV/Excel Ollama指南

您还需要登录您的Google帐户!

在这里插入图片描述


2、什么是Ollama?

Ollama允许您以快速简单的方式从自己的计算机运行语言模型!它悄悄地启动了一个程序,可以在后台运行语言模型,如Llama-3。
如果你突然想问语言模型一个问题,你可以简单地向Ollama提交一个请求,它会很快把结果返回给你!我们将使用Ollama作为我们的推理引擎!

在这里插入图片描述


3、安装Unsloth

在这里插入图片描述


如果您从未使用过Colab笔记本,请快速了解笔记本本身:

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

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

3、连接/重新连接T4按钮。
您可以单击此处获取更高级的系统统计信息。

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

在这里插入图片描述


4、选择要微调的模型

现在让我们选择一个模型进行微调!我们默认使用 Meta/Facebook的 Llama-3,它被训练在一个巨大的15万亿“令牌”上。

假设一个令牌就像一个英语单词。这大约相当于35万厚的百科全书!

其他流行的模型包括米斯特拉尔、Phi-3(使用GPT-4输出训练)和谷歌的 Gemma(13万亿令牌!)。

Unsloth支持这些模型以及更多!事实上,只需从HugingFace model hub 中键入一个模型,看看它是否有效!如果它不起作用,我们会出错。

在这里插入图片描述


您可以切换其他3个设置:

  1. max_seq_length = 2048
    

    这决定了模型的上下文长度。
    例如,双子座有超过100万的上下文长度,而骆驼-3有8192个上下文长度。
    我们允许您选择任何数字——但我们建议将其设置为2048以供测试。
    Unsloth还支持非常长的上下文微调,我们展示了我们可以提供比最好的上下文长度长4倍的上下文长度。

  2. dtype = None
    

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

  3. load_in_4bit = True
    

    我们在4位量化中进行微调。
    这将内存使用量减少了4倍,使我们能够在免费的16GB内存GPU中进行微调。
    4位量化本质上是将权重转换为一组有限的数字,以减少内存使用。
    这样做的一个缺点是精度下降了1-2%。
    如果您想要微小的额外精度,请在H100s等更大的GPU上将其设置为False。

在这里插入图片描述


如果您运行单元格,您将获得一些Unsloth版本的打印输出、您使用的模型、您的GPU有多少内存以及一些其他统计信息。
暂时忽略这个。


5、微调参数

在这里插入图片描述


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

目标是改变这些数字以提高准确性,但也抵消过度拟合。
过度拟合是指你让语言模型记住一个数据集,而不能回答新的问题。
我们想要一个最终的模型来回答看不见的问题,而不是记忆。

  1. r = 16, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128
    

    微调过程的等级。
    较大的数字会使用更多的内存,并且会更慢,但可以提高更困难任务的准确性。
    我们通常建议使用8(用于快速微调)和128这样的数字。
    太大的数字会导致过度拟合,损害模型的质量。

  2. target_modules = ["q_proj", "k_proj", "v_proj", "o_proj","gate_proj", "up_proj", "down_proj",],
    

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

  3. lora_alpha = 16,
    

    微调的缩放因子。
    较大的数字将使微调了解更多关于您的数据集,但可能会促进过度拟合。
    我们建议这等于秩r,或者加倍。

  4. lora_dropout = 0, # Supports any, but = 0 is optimized
    

    将此保留为0以进行更快的训练!可以减少过度拟合,但没那么多。

  5. bias = "none",    # Supports any, but = "none" is optimized
    

    将此保留为0,以获得更快、更少的过度健身训练!

  6. use_gradient_checkpointing = "unsloth", # True or "unsloth" for very long context
    

    选项包括TrueFalse "unsloth"
    我们建议"unsloth",因为我们额外减少了30%的内存使用,并支持极长的上下文finetunes.You可以在这里阅读:https://unsloth.ai/blog/long-context了解更多细节。

  7. random_state = 3407,
    

    确定确定性运行的数字。
    训练和微调需要随机数,因此设置这个数字可以使实验重现。

  8. use_rslora = False,  # We support rank stabilized LoRA
    

    自动设置lora_alpha = 16的高级功能。
    如果你愿意,你可以使用这个!

  9. loftq_config = None, # And LoftQ
    

    将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列——一条指令,输入和输出。
我们基本上把每一行组合成一个大提示符,如下所示。
然后我们用它来微调语言模型,这使得它非常类似于ChatGPT。
我们称之为监督指令微调。

在这里插入图片描述


7、多列微调

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

在这里插入图片描述


这本质上意味着我们必须将多个列“合并”成一个大提示,以便微调才能真正发挥作用!

例如,非常著名的泰坦尼克号数据集有许多列。
你的工作是根据乘客的年龄、乘客等级、票价等来预测乘客是幸存还是死亡。
我们不能简单地将其传递到ChatGPT,而是必须将这些信息“合并”到一个大提示中。

在这里插入图片描述


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

在这里插入图片描述


其他微调库要求您通过将所有列合并到1个提示符中来手动准备微调数据集。
在Unsloth中,我们简单地提供了名为to_sharegpt的函数,它可以一次完成!

要访问泰坦尼克号微调笔记本,或者如果您想上传CSV或Excel文件,请访问此处:https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing

在这里插入图片描述


现在这有点复杂,因为我们允许很多定制,但有几点:

  • 必须将所有列用花括号{}括起来。
    这些是实际CSV/Excel文件中的列名。

  • 可选的文本组件必须括在[[]]中。
    例如,如果列“输入”为空,合并函数将不显示文本并跳过此。
    这对于缺失值的数据集很有用。

  • 选择output_column_name中的输出或目标/预测列。
    对于 Alpaca 数据集,这将是output


例如,在Titanic数据集中,我们可以创建一个大型合并提示格式,如下所示,其中每一列/一段文本都是可选的。

在这里插入图片描述


例如,假设数据集看起来像这样,有很多缺失的数据:

上船年龄票价
S23
18岁7.25

那么,我们不希望结果是:

1、The passenger embarked from S. Their age is 23. Their fare is EMPTY.

2、The passenger embarked from EMPTY. Their age is 18. Their fare is $7.25.


相反,通过使用[[]]可选地包围列,我们可以完全排除此信息。

1、[[The passenger embarked from S.]] [[Their age is 23.]] [[Their fare is EMPTY.]]

2、[[[The passenger embarked from EMPTY.]] [[Their age is 18.]] [[Their fare is $7.25.]]


变成:

1、The passenger embarked from S. Their age is 23.

2、Their age is 18. Their fare is $7.25.


8、多轮对话

如果你没有注意到,一个小问题是 Alpaca 数据集是单轮的,而记住使用ChatGPT是交互式的,你可以多轮与之交谈。
例如,左边是我们想要的,但是右边是 Alpaca 数据集,只提供单数对话。
我们希望微调语言模型以某种方式学习如何像ChatGPT一样进行多轮对话。

在这里插入图片描述


所以我们引入了conversation_extension参数,它本质上是在你的单回合数据集中选择一些随机行,并将它们合并成1个对话!

例如,如果你设置为3,我们随机选择3行并将它们合并成1!

设置太长会使训练变慢,但会使你的聊天机器人和最终的微调变得更好!

在这里插入图片描述


然后将output_column_name设置为预测/输出列。对于 Alpaca 数据集,它将是输出列。

然后我们使用standardize_sharegpt函数使数据集以正确的格式进行微调!总是这样称呼!

在这里插入图片描述


9、可定制的聊天模板

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

在这里插入图片描述


但还记得我们说过这是一个坏主意,因为ChatGPT样式的finetunes只需要1个提示吗?

由于我们成功地将所有数据集列合并为1个,因此我们基本上可以创建以下样式的聊天模板,其中包含1个输入列(指令)和1个输出:

在这里插入图片描述


我们只要求您必须为指令输入{INPUT}字段,为模型输出字段输入{OUTPUT}字段。
事实上,我们还允许一个可选的{SYSTEM}字段,这对于自定义系统提示很有用,就像ChatGPT中一样。
例如,下面是一些很酷的例子,您可以将聊天模板自定义为:

在这里插入图片描述


对于OpenAI模型中使用的ChatML格式:

在这里插入图片描述


或者您可以使用Llama-3模板本身(它仅通过使用Llama-3的说明版本来运行):我们实际上还允许一个可选的{SYSTEM}字段,这对于自定义系统提示很有用,就像在ChatGPT中一样。

在这里插入图片描述


或者在泰坦尼克号预测任务中,您必须在这个Colab笔记本中预测乘客是否死亡或幸存,其中包括CSV和Excel上传:https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing

在这里插入图片描述


10、训练模型

让我们现在训练模型!我们通常建议人们不要编辑下面的内容,除非您想微调更长的步骤或想在大批量上进行训练。

在这里插入图片描述


我们通常不建议更改上述参数,但对其中一些进行详细说明:

  1. per_device_train_batch_size = 2,
    

    如果您想更多地利用GPU的内存,请增加批处理大小。
    还要增加批处理大小,以使训练更加流畅,并使过程不会过度拟合。
    我们通常不建议这样做,因为由于填充问题,这可能会使训练实际上变慢。
    我们通常会要求您增加gradient_accumulation_steps,这只会对数据集进行更多的传递。

  2. gradient_accumulation_steps = 4,
    

    相当于增加批处理大小,但不会影响内存消耗!如果您想要更平滑的训练损失曲线,我们通常建议人们增加这一点。

  3. max_steps = 60, # num_train_epochs = 1,
    

    我们将步骤设置为60以加快训练速度。
    对于可能需要数小时的完整训练运行,请将其注释掉max_steps,并将其替换为num_train_epochs = 1
    将其设置为1意味着在您的数据集上进行1次完整通过。
    我们通常建议1到3次通过,不能更多,否则您将过度拟合您的finetune。

  4. learning_rate = 2e-4,
    

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

在这里插入图片描述


你会看到一些数字的日志!这是训练损失,你的工作是设置参数,使其尽可能接近0.5!如果你的微调没有达到1、0.8或0.5,你可能不得不调整一些数字。
如果你的损失为0,这可能也不是一个好兆头!


11、推理/运行模型

在这里插入图片描述


现在让我们在完成训练过程后运行模型!您可以编辑黄色下划线部分!

事实上,因为我们创建了一个多圈聊天机器人,我们现在也可以调用模型,就好像它看到了过去的一些对话,如下所示:

在这里插入图片描述


提醒Unsloth本身也提供了2倍更快的推理,所以永远不要忘记调用 FastLanguageModel.for_inference(model)
如果您希望模型输出更长的响应,请将max_new_tokens = 128设置为更大的数字,如256或1024。
请注意,您也必须等待更长的结果!


12、保存模型

我们现在可以将微调模型保存为一个100MB的小文件,称为 LoRA adapter ,如下所示。
如果你想上传你的模型,你也可以推送到 Hugging Face 中心!记得通过 https://huggingface.co/settings/tokens 获取 Hugging Face 令牌并添加你的令牌!

在这里插入图片描述


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

在这里插入图片描述


13、导出到 Ollama

最后,我们可以将微调模型导出到Ollama本身!首先,我们必须在Colab笔记本中安装Ollama:

在这里插入图片描述


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

在这里插入图片描述


提醒1行要将False转换为True,不要将每一行都更改为True,否则您将等待很长时间!我们通常建议将第一行设置为True,因此我们可以将finetuned模型快速导出为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

在这里插入图片描述


14、自动创建Modelfile

Unsloth提供的技巧是我们自动创建Ollama需要的Modelfile

这只是一个设置列表,包括我们用于finetune过程的聊天模板!您还可以打印生成的Modelfile,如下所示:

在这里插入图片描述


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

在这里插入图片描述


15、Ollama 推理

如果您想调用在您自己的本地机器上运行的Ollama服务器本身/在后台的免费Colab笔记本中,我们现在可以调用模型进行推理。
请记住,您可以编辑黄色下划线部分。

在这里插入图片描述


16、交互式ChatGPT风格

但是要像ChatGPT一样运行finetuned模型,我们必须做得更多!首先单击终端图,然后会弹出一个终端。它在左侧边栏上。

在这里插入图片描述


然后,您可能需要按两次ENTER来删除终端窗口中的一些奇怪输出。
等待几秒钟,键入ollama run unsloth_model然后按ENTER。

在这里插入图片描述


最后,您可以像实际ChatGPT一样与微调模型交互!点击 CTRL+D 退出系统,点击ENTER与聊天机器人交谈!

在这里插入图片描述


你做到了!

您已经成功微调了一个语言模型并将其导出到Ollama,速度提高了2倍,VRAM减少了70%!所有这些都在Google Colab笔记本中免费提供!

如果你想学习如何做奖励建模、继续预训练、导出到vLLM或GGUF、完成文本或了解更多关于微调技巧和窍门的信息,请访问我们的Github。

如果您在微调方面需要任何帮助,您也可以在这里加入我们的Discordserver。
如果您需要Ollama方面的帮助,您也可以在这里加入他们的服务器。

最后,我们要感谢您阅读并关注到这里!我们希望这让您理解了微调语言模型背后的一些细节,我们希望这是有用的!

要访问我们的 Alpaca 数据集示例,请单击此处,我们的CSV/Excel微调指南就在这里。


2024-08-24(六)

这篇关于Unsloth 教程 - 如何微调 Llama-3并导出到 Ollama的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104253

相关文章

全网最全Tomcat完全卸载重装教程小结

《全网最全Tomcat完全卸载重装教程小结》windows系统卸载Tomcat重新通过ZIP方式安装Tomcat,优点是灵活可控,适合开发者自定义配置,手动配置环境变量后,可通过命令行快速启动和管理... 目录一、完全卸载Tomcat1. 停止Tomcat服务2. 通过控制面板卸载3. 手动删除残留文件4.

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

python依赖管理工具UV的安装和使用教程

《python依赖管理工具UV的安装和使用教程》UV是一个用Rust编写的Python包安装和依赖管理工具,比传统工具(如pip)有着更快、更高效的体验,:本文主要介绍python依赖管理工具UV... 目录前言一、命令安装uv二、手动编译安装2.1在archlinux安装uv的依赖工具2.2从github

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了