用LlamaFactory微调Qwen-2 VL

MODEL ZOO Nov 7, 2024

在这篇博文中,我们将探索如何使用 LlamaFactory 框架微调多模态大模型Qwen-2 VL。无论你是经验丰富的 AI 开发人员还是刚刚起步,本指南都将为你提供定制 Qwen-2 VL 以满足你的特定需求的知识。

1、Qwen-2 VL:多模态冠军

在我们进入微调过程之前,让我们花点时间来欣赏这个惊人模型的功能。

  • 开源:这意味着它可供所有人免费使用和修改,促进 AI 社区内的创新和协作。
  • 紧凑尺寸:与许多需要大量计算资源的大型语言模型 (LLM) 不同,Qwen-2 VL 非常紧凑,个人和资源有限的小型团队都可以使用它。
  • 多模态:能够同时处理文本和图像,使 Qwen-2 VL 能够处理各种任务,从图像字幕到视觉问答。

2、LlamaFactory:微调的简便方法

微调是将预训练模型调整为特定任务的过程。这对于提高模型的性能和实现最佳结果至关重要。LlamaFactory 通过其用户友好的界面和强大的功能简化了此过程。

LlamaFactory 就像拥有一个装满 AI​​ 魔法工具的工具箱,让你可以:

  • 微调各种 AI 模型:从 LLM 到 Qwen-2 VL 等多模态模型。
  • 使用“低代码”或“无代码”方法:这意味着你不必是编码专家即可开始使用。
  • 为特定任务自定义模型:训练你的模型以进行图像字幕、文本摘要或你能想到的任何其他任务。

用LlamaFactory 微调 Qwen-2 VL 模型有两种主要方法:

  • LlamaBoard:无代码方法

LlamaBoard 是一个可视化、用户友好的界面,让您无需编写一行代码即可微调模型。它非常适合初学者和那些喜欢更直观方法的人。

  • LlamaFactory CLI:命令行灵活性

LlamaFactory CLI 通过命令行命令提供更大的灵活性和对微调过程的控制。这对于想要尝试各种参数和设置的有经验的用户来说是理想的选择。

3、入门:设置你的环境

让我们为微调冒险做好准备:

  • Google Colab Pro:你需要访问 Google Colab Pro 以获得必要的计算资源。免费的 Colab 无法完成这项任务!
  • 克隆 LlamaFactory:使用 git clone 从 GitHub 下载 LlamaFactory 存储库。
  • 安装依赖项:通过运行 pip install -r requirements.txt 确保你拥有所有必需的软件包。
  • 准备数据:收集你将用于微调模型的文本和图像数据。
!git clone https://github.com/hiyouga/LLaMA-Factory.git

%cd LLaMA-Factory

!pip install -r requirements.txt

!pip install bitsandbytes

!pip install git+https://github.com/huggingface/transformers.git
!pip install -e ".[torch, metrics]"
!pip install liger-kernel

3.1 Llama Board

import os
!GRADIO_SHARE=1 llamafactory-cli webui

4、微调过程:分步指南

对于这篇博文,我们将重点介绍 LlamaFactory CLI 方法,但 LlamaBoard 的步骤类似。

  • 创建配置文件 (JSON)

首先创建一个 JSON 文件,概述微调过程的参数。这包括你正在使用的模型、数据集和所需的训练设置等内容。

  • 启动微调过程

使用 llama_factory train 命令,将路径传递到你的 JSON 配置文件。

  • 监控训练

观察微调过程的输出和进度。这将让你深入了解模型的学习方式。

  • 合并微调模型

训练完成后,你可以使用 LlamaFactory 中提供的 merge_adapter 函数将微调模型与原始模型合并。

  • 测试和部署

最后,评估微调模型的性能并将其部署到您的应用程序中。

5、Llama Factory CLI


import json

args = dict(
  stage="sft",                        # do supervised fine-tuning
  do_train=True,
  model_name_or_path="Qwen/Qwen2-VL-2B-Instruct", # use bnb-4bit-quantized Llama-3-8B-Instruct model
  dataset="mllm_demo,identity",             # use alpaca and identity datasets
  template="qwen2_vl",                     # use llama3 prompt template
  finetuning_type="lora",                   # use LoRA adapters to save memory
  lora_target="all",                     # attach LoRA adapters to all linear layers
  output_dir="qwen2vl_lora",                  # the path to save LoRA adapters
  per_device_train_batch_size=2,               # the batch size
  gradient_accumulation_steps=4,               # the gradient accumulation steps
  lr_scheduler_type="cosine",                 # use 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
  loraplus_lr_ratio=16.0,                   # use LoRA+ algorithm with lambda=16.0
  fp16=True,                         # use float16 mixed precision training
  use_liger_kernel=True,                   # use liger kernel for efficient training
)


json.dump(args, open("train_qwen2vl.json", "w", encoding="utf-8"), indent=2)
!llamafactory-cli train train_qwen2vl.json

args = dict(
  model_name_or_path="Qwen/Qwen2-VL-2B-Instruct", # use official non-quantized Llama-3-8B-Instruct model
  adapter_name_or_path="qwen2vl_lora",            # load the saved LoRA adapters
  template="qwen2_vl",                     # same to the one in training
  finetuning_type="lora",                  # same to the one in training
  export_dir="qwen2vl_2b_instruct_lora_merged",              # the path to save the merged model
  export_size=2,                       # the file shard size (in GB) of the merged model
  export_device="cpu",                    # the device used in export, can be chosen from `cpu` and `cuda`
  #export_hub_model_id="your_id/your_model",         # the Hugging Face hub ID to upload model
)

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

%cd /content/LLaMA-Factory/

!llamafactory-cli export merge_qwen2vl.json

final_model_path = "/content/LLaMA-Factory/qwen2vl_2b_instruct_lora_merged"

hf_model_repo = "skuma307/Qwen2-VL-2B-Instruct-LoRA-FT"

from huggingface_hub import notebook_login

notebook_login()

from huggingface_hub import HfApi, HfFolder, Repository

# Create an instance of HfApi
api = HfApi()

api.upload_folder(
    folder_path=final_model_path,    # The folder containing the model files
    repo_id=hf_model_repo,                # Your authentication token
    commit_message="Initial model upload"  # Optional commit message
)

print(f"Model pushed to: {hf_model_repo}")
故障排除:常见错误及其解决方法
  • GPU 内存问题:如果遇到内存不足错误,请尝试清理缓存、释放 GPU 内存或减小批处理大小。
  • 缺少依赖项:仔细检查是否安装了所有必要的依赖项。
  • 数据格式问题:确保你的数据格式正确且与 LlamaFactory 兼容。

7、结束语:微调的力量

使用 LlamaFactory 对 Qwen-2 VL 等多模态模型进行微调开辟了无限可能。它允许你针对特定任务自定义模型的功能,从而提高准确性和性能。

别忘了查看 LlamaFactory GitHub 存储库,你将找到全面的文档、代码示例和有用的资源。


原文链接:Fine-Tuning the Multimodal Marvel: Qwen-2 VL with LlamaFactory

汇智网翻译整理,转载请标明出处

Tags