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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

【Shiro】Shiro 的学习教程(三)之 SpringBoot 集成 Shiro

目录 1、环境准备2、引入 Shiro3、实现认证、退出3.1、使用死数据实现3.2、引入数据库,添加注册功能后端代码前端代码 3.3、MD5、Salt 的认证流程 4.、实现授权4.1、基于角色授权4.2、基于资源授权 5、引入缓存5.1、EhCache 实现缓存5.2、集成 Redis 实现 Shiro 缓存 1、环境准备 新建一个 SpringBoot 工程,引入依赖:

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

MySQL使用mysqldump导出数据

mysql mysqldump只导出表结构或只导出数据的实现方法 备份数据库: #mysqldump 数据库名 >数据库备份名 #mysqldump -A -u用户名 -p密码 数据库名>数据库备份名 #mysqldump -d -A --add-drop-table -uroot -p >xxx.sql 1.导出结构不导出数据 mysqldump --opt -d 数据库名 -u

PHP APC缓存函数使用教程

APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”。它为我们提供了缓存和优化PHP的中间代码的框架。 APC的缓存分两部分:系统缓存和用户数据缓存。(Linux APC扩展安装) 系统缓存 它是指APC把PHP文件源码的编译结果缓存起来,然后在每次调用时先对比时间标记。如果未过期,则使用缓存的中间代码运行。默认缓存 3600s(一小时)。但是这样仍会浪费大量C