当前位置: 代码网 > 科技>人工智能>aigc > 10 分钟,教你如何用 LLama-Factory 训练和微调 LLama3 模型

10 分钟,教你如何用 LLama-Factory 训练和微调 LLama3 模型

2024年07月31日 aigc 我要评论
在本文中,我们将了解如何使用 LLama Index 对 LLama3 进行微调。更重要的是,你只需要通过非常简单的步骤和几行代码,就能实现这一点。

本文将探讨于2024年3月21日发布的llama-factory,并学习如何使用 digitalocean 旗下的 paperspace平台对 llama 3 进行微调。为了完成我们的任务,我们将使用 nvidia a4000 gpu,它被认为是功能最强大的单插槽 gpu 之一,能够无缝集成到各种工作站中。

rtx a4000 采用了 nvidia ampere 架构,集成了 48 个第二代 rt core、192 个第三代 tensor core 和 6144 个cuda 核心,以及带有错误校正码(ecc)的 16gb 图形内存。这些配置确保了它能为创新项目提供精确可靠的计算能力。

一直以来,微调大语言模型一直是一项复杂的任务,主要由深谙机器学习和人工智能的工程师完成。然而,随着人工智能领域的不断发展,这一观念正在迅速改变。类似 llama-factory 等新工具的出现,使得微调过程更加便捷和高效。此外,现在还可以使用 dpo、orpo、ppo 和 sft 等技术进行微调和模型优化。更进一步说,大家现在可以有效地训练和微调如 llama、mistral、falcon 等模型。

什么是模型的微调?

微调模型涉及调整预训练模型或基础模型的参数,这些参数可用于特定任务或数据集,可以提高模型的性能和准确性。这个过程涉及向模型提供新数据并修改其权重、偏差和某些参数。通过这种方式,可以让这个新模型可以在新任务或数据集上获得更好的表现,而无需为了新任务或数据从头开始开发一个模型,从而节省时间和资源。

通常,当创建新的大语言模型(llm)时,它会在大量文本数据上进行训练,这些数据可能包含潜在的有害的数据。在预训练或初始训练阶段之后,该模型会被进行微调,并采取一些安全措施,以确保其避免生成有害或有毒的响应。然而,这种方法仍有改进的空间。不过,微调解决了需要让模型适应特定需求的问题。

为什么要用 llama-factory?

llama factory,这个工具能够高效且低成本地支持对 100 多个模型进行微调。llama factory 简化了模型微调的过程,并且易于访问,使用体验友好。此外,它还提供了由 hiyouga 提供的 hugging face 空间,可用于对模型进行微调。


图:llama board(huggingface 空间)

这个空间还支持 lora 和 galore 配置,以减少 gpu 的使用。用户可以通过简单的滑块轻松更改参数,如 dropout、epochs、批次大小等。同时,也有多个数据集选项可供选择以微调你的模型。正如本文所述,llama factory支持许多模型,包括不同版本的 llama、mistral 和 falcon。它还支持像 galore、badm 和 lora 这样的高级算法,提供诸如flash attention、位置编码和缩放等各种功能。

此外,你还可以集成像 tensorboard、vandb 和 mlflow 这样的监控工具。为了更快地进行推理,你还可以使用gradio 和 cli。本质上,llama factory 提供了一系列多样化的选项,以增强模型性能并简化微调过程。

llama board:llama factory 的统一用户界面

llama board 可以帮助人们调整和改进语言模型(llm)的性能,而无需了解如何编写代码。它就像一个仪表板,让你可以轻松地自定义语言模型如何学习和处理信息。

以下是它的一些关键特性:

  • 易于定制:你可以通过在网页上调整设置来改变模型的学习方式。默认设置适用于大多数情况。你还可以在开始之前查看模型将如何查看你的数据。

  • 进度监控:随着模型的学习,你可以看到更新和图表,显示它的表现如何。这有助于你了解它是否正在改进。

  • 灵活的测试:你可以通过将模型与已知答案进行比较,或自己与其交流,来检查模型理解文本的程度。这有助于你观察模型是否在理解语言方面变得越来越好。

  • 支持多种语言:llama board 支持英语、俄语和中文,对于说不同语言的人来说很有用。它也被设置为在未来添加更多语言。

使用 paperspac 微调 llama3

我们此前也介绍过如何在 paperspace 上跑 llama3 demo。我们这次来对 llama3 进行微调。如果你还对目前digitalocean 的 paperspace gpu 云服务不熟悉,可以参考paperspace 的账户设置教程,或 digitalocean 英文官网的更多文档。另外,digitalocean 提供多种 gpu 可供选择,包括 h100、a100 等,按秒计费,能合理控制成本。

你也可以点击这个链接,直接在 paperspace 上开始运行这个项目,如下图所示。

让我们登录到 paperspace 平台,选择你希望使用的 gpu,并开始使用 notebook(paperspace 上的 ide)。你还可以点击上面的链接来帮助你启动 notebook。

1、首先,我们将克隆仓库并安装必要的库

!git clone https://github.com/hiyouga/llama-factory.git
%cd llama-factory
%ls

2、接下来,我们将安装 unsloth,它允许我们有效地对模型进行微调。此外,我们还会安装 xformers 和 bitsandbytes。

# install necessary packages
!pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
!pip install --no-deps xformers==0.0.25
!pip install .[bitsandbytes]
!pip install 'urllib3<2'

3、一旦所有东西都安装好了,我们将检查 gpu 规格

!nvidia-smi

4、接下来,我们将导入torch并检查我们 的cuda,因为我们正在使用 gpu,

import torch
try:
    assert torch.cuda.is_available() is true
except assertionerror:
    print("your gpu is not setup!")

5、我们现在将导入我们克隆的 github仓库附带的数据集。我们也可以创建一个自定义数据集并使用它。

import json

%cd /notebooks/llama-factory
model_name = "llama-3"


with open("/notebooks/llama-factory/data/identity.json", "r", encoding="utf-8") as f:
    dataset = json.load(f)

for sample in dataset:
    sample["output"] = sample["output"].replace("model_name", model_name).replace("author", "llama factory")

with open("/notebooks/llama-factory/data/identity.json", "w", encoding="utf-8") as f:
    json.dump(dataset, f, indent=2, ensure_ascii=false)

6、完成上一步后,我们将执行下面的代码,为 llama factory 生成 gradio 网络应用链接。

#generates the web app link 
%cd /notebooks/llama-factory
!gradio_share=1 llamafactory-cli webui

你可以单击生成的链接并按照说明进行操作,也可以使用你的方法。

型号选择:

  • 你可以选择任何模型;在这里,我们选择具有80亿个参数的llama 3。

适配器配置:

  • 你可以选择指定适配器路径。

  • 可用的适配器包括lora、qlora、freeze或full。

  • 如果需要,你可以刷新适配器列表。

培训选项:

  • 你可以使用监督微调来训练模型。

  • 或者,你可以选择dpu(数据处理单元)或ppu(并行处理单元)。

数据集选择:

  • 所选数据集用于监督微调(sft)。

  • 你也可以选择自己的数据集。

超参数配置:

  • 你可以调整超参数,例如迭代次数、最大梯度范数和最大样本大小。

laura配置:

  • lora型号提供详细的配置选项。

开始培训:

  • 设置完所有配置后,你可以通过单击“开始”按钮启动训练过程。

下面将开始训练。我们还将使用 cli 命令开始训练和微调。你可以使用以下代码指定参数。

args = dict(
  stage="sft",                        # specifies the stage of training. here, it's set to "sft" for supervised fine-tuning
  do_train=true,
  model_name_or_path="unsloth/llama-3-8b-instruct-bnb-4bit", # use bnb-4bit-quantized llama-3-8b-instruct model
  dataset="identity,alpaca_gpt4_en",             # use the alpaca and identity datasets
  template="llama3",                     # use llama3 for prompt template
  finetuning_type="lora",                   # use the lora adapters which saves up memory
  lora_target="all",                     # attach lora adapters to all linear layers
  output_dir="llama3_lora",                  # path to save lora adapters
  per_device_train_batch_size=2,               # specify the batch size
  gradient_accumulation_steps=4,               # the gradient accumulation steps
  lr_scheduler_type="cosine",                 # use the learning rate as cosine learning rate scheduler
  logging_steps=10,                      # log every 10 steps
  warmup_ratio=0.1,                      # use warmup scheduler
  save_steps=1000,                      # save checkpoint every 1000 steps
  learning_rate=5e-5,                     # the learning rate
  num_train_epochs=3.0,                    # the epochs of training
  max_samples=500,                      # use 500 examples in each dataset
  max_grad_norm=1.0,                     # clip gradient norm to 1.0
  quantization_bit=4,                     # use 4-bit qlora
  loraplus_lr_ratio=16.0,                   # use lora+ with lambda=16.0
  use_unsloth=true,                      # use unslothai's lora optimization for 2x faster training
  fp16=true,                         # use float16 mixed precision training
)

json.dump(args, open("train_llama3.json", "w", encoding="utf-8"), indent=2)

接下来,打开一个终端并运行以下命令

!llamafactory-cli train train_llama3.json

下面的代码会开启训练

7、一旦模型训练完成,我们就可以使用该模型进行推断。让我们试着这样做并检查模型是如何工作的。

args = dict(
  model_name_or_path="unsloth/llama-3-8b-instruct-bnb-4bit", # specifies the name or path of the pre-trained model to be used for inference. in this case, it's set to "unsloth/llama-3-8b-instruct-bnb-4bit".
  #adapter_name_or_path="llama3_lora",            # load the saved lora adapters
  finetuning_type="lora",                  # specifies the type of fine-tuning. here, it's set to "lora" for lora adapters.
  template="llama3",                     # specifies the prompt template to be used for inference. here, it's set to "llama3"
  quantization_bit=4,                    # specifies the number of bits for quantization. in this case, it's set to 4
  use_unsloth=true,                     # use unslothai's lora optimization for 2x faster generation
)

json.dump(args, open("infer_llama3.json", "w", encoding="utf-8"), indent=2)

在这里,我们使用保存的适配器定义我们的模型,选择聊天模板,并指定用户与助手的交互。

接下来,使用你的终端运行以下代码,

!llamafactory-cli chat infer_llama3.json

建议你可以使用 llama-factory 与其它模型做做尝试,调整参数。

小结

有效的微调已成为大型语言模型(llms)适应特定任务的必要条件之一。然而,这需要一定的努力,有时也相当具有挑战性。随着 llama-factory 的引入,这一全面的框架让训练更加高效,用户无需编写代码即可轻松为超过 100 个 llms 定制微调。

现在,很多人对大型语言模型(llms)更加好奇,有这样想法的开发者可以试试 llama-factory 是否可以调整自己的模型。这有助于开源社区的成长和活跃。llama-factory 正变得广为人知,甚至已被列入 awesome transformers3 中,作为高效微调 llms 的工具。

我们希望本文能鼓励更多开发者使用这一框架来创建有价值的 llms。不过请记得,在使用llama-factory微调llms时,遵守模型的许可规则很重要。

至此,本文结束。我们看到了如今在几分钟内微调任何模型是多么容易。我们还可以使用 hugging face cli 将这个模型推送到 hugging face hub 上。

最后,如果你想在 h100 或其他型号的 gpu 上跑自己的大语言模型,可以在 digitalocean 的 gpu 云服务上直接开通使用。你也可以访问 digitalocean 中国区独家战略合作伙伴卓普云科技咨询更多云服务相关方案

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com