当前位置:首页 > 大杂烩 > 正文内容

qwen2.5vl模型微调第二天, SWIFT框架安装和微调脚本编写

高老师2周前 (09-22)大杂烩28

 SWIFT框架支持配置微调的各种配置,先安装吧

(1)、激活虚拟环境

cd /www/server/pyporject_evn/qwen/bin
source activate

(2)、安装框架

pip install ms-swift -U

(3)、编写微调脚本

# -*- coding: utf-8 -*-

# =================================================================================================
# 1. 导入所需的库
#    - os: 用于处理文件和目录路径,确保脚本在不同系统上都能正确找到数据文件。
#    - swift: 这是核心的微调框架,提供了 sft_main 主函数。
#    - get_main_process_devices: swift 的一个辅助函数,用于自动检测可用的GPU设备。
# =================================================================================================
import os
from swift.ui.app import sft_main
from swift.utils.utils import get_main_process_devices


# =================================================================================================
# 2. 定义微调参数
#    这是一个Python字典,包含了所有微调所需的配置。
#    您可以在这里调整模型、数据集、训练方法和超参数。
# =================================================================================================
sft_args = {
    # --- 模型配置 ---
    # model_type: SWIFT框架内部的模型“别名”,用于自动加载预设的最佳配置。
    # 'qwen2half-vl-7b-chat' 是 Qwen2.5-VL-Chat 的内部代号。
    'model_type': 'qwen2half-vl-7b-chat',
    # model_id_or_path: 模型在Hugging Face或ModelScope上的官方路径。
    'model_id_or_path': 'qwen/Qwen2.5-VL-Chat',

    # --- 数据集配置 ---
    # dataset: 指向您的标注文件路径。代码会自动定位到同目录下的 data/dataset.jsonl。
    'dataset': [os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data', 'dataset.jsonl')],
    # dataset_test_ratio: 自动从训练数据中划分出一部分作为验证集,用于评估模型效果。
    'dataset_test_ratio': 0.01,

    # --- 微调方法配置 (LoRA) ---
    # sft_type: 指定微调方法,'lora' 表示使用LoRA技术。
    'sft_type': 'lora',
    # lora_target_modules: 指定在模型的哪些部分应用LoRA。这组配置是为Qwen2系列优化的。
    'lora_target_modules': ['q_proj', 'k_proj', 'v_proj', 'o_proj'],
    # lora_rank: LoRA的秩,影响微调的参数量。通常16, 32, 64是常用值。
    'lora_rank': 32,
    # lora_alpha: LoRA的缩放因子,通常设置为rank的两倍。
    'lora_alpha': 64,

    # --- 训练过程超参数 ---
    # output_dir: 训练过程中产生的模型权重、日志等文件的保存目录。
    'output_dir': 'qwen2.5-vl-swift-lora-output',
    # num_train_epochs: 训练的总轮次。对于微调,通常1-3轮即可。
    'num_train_epochs': 3,
    # max_length: 模型能处理的最大序列长度(文本+图片tokens)。
    'max_length': 1024,
    # batch_size: 每个GPU设备上一次处理的样本数。根据显存大小调整,如果显存不足,可以减小此值。
    'batch_size': 1,
    # gradient_accumulation_steps: 梯度累积步数。等效批次大小 = batch_size * GPU数量 * 此值。
    # 例如,1 * 1 * 8 = 8。这是一种在不增加显存消耗的情况下,模拟大批量训练的技巧。
    'gradient_accumulation_steps': 8,
    # learning_rate: 学习率,控制模型参数更新的幅度。
    'learning_rate': 2e-4,
    # use_flash_attn: 如果您的GPU支持(如A100, H100, RTX 30/40系列),开启FlashAttention可以显著加速训练。
    'use_flash_attn': True,
    
    # --- 硬件与性能优化 ---
    # quantization_bit: 启用模型量化,以更低的数据类型(如4-bit)加载模型,极大节省显存。
    'quantization_bit': 4,
    # bnb_4bit_compute_dtype: 在计算过程中使用的精度类型。
    'bnb_4bit_compute_dtype': 'torch.float16',
    
    # --- 日志与保存策略 ---
    # logging_steps: 每隔多少步在控制台打印一次训练日志(如loss)。
    'logging_steps': 10,
    # save_steps: 每隔多少步保存一次模型的权重(checkpoint)。
    'save_steps': 50,
}


# =================================================================================================
# 3. 启动微调任务
#    sft_main 是SWIFT框架的入口函数。
#    它会接收上面的 sft_args 配置,并自动处理所有后续步骤:
#    - 下载模型和tokenizer
#    - 加载和预处理数据
#    - 初始化训练器
#    - 开始训练循环
#    - 保存最佳模型
# =================================================================================================
if __name__ == '__main__':
    print("开始执行SWIFT微调任务...")
    # devices=get_main_process_devices() 会自动检测并使用所有可用的GPU进行训练。
    result = sft_main(sft_args, devices=get_main_process_devices())
    
    # 训练完成后,打印出最佳模型 checkpoint 的路径。
    if result is not None:
        print(f"微调完成!最佳模型保存在: {result.get('best_model_checkpoint')}")
    else:
        print("微调任务已完成或被中断。")

项目的目录结构如下:

├── run_finetune.py          # ← 将上面的代码保存到这个文件中
└── data                     # ← 创建一个名为 data 的文件夹
    ├── dataset.jsonl        # ← 您的标注文件放在这里
    └── images               # ← 创建一个名为 images 的子文件夹
        ├── pos_01.jpg       # ← 所有图片都放在这里
        ├── phone_01.jpg
        └── ...

(4)、准备标准喂数据格式 ,也就是上面的dataset.jsonl

jsonl就是json line 每行1个对象,方便大模型按行取数据,例子:

{"id": "phone_case_001", "image": "images/phone_01.jpg", "conversations": [{"from": "user", "value": "这张图片里店员的行为规范吗?"}, {"from": "assistant", "value": "图中店员在工作时间低头玩手机,属于不规范行为。"}]}
{"id": "pos_case_001", "image": "images/pos_01.jpg", "conversations": [{"from": "user", "value": "请分析图中人物的行为。"}, {"from": "assistant", "value": "图中店员正在操作POS机为顾客结账,这是正常的标准工作行为。"}]}

字段分解说明:

  • "id" (字符串):

    • 作用: 用来唯一标识这条数据。

    • 写法: 可以是图片的编号(如 "0001")、图片的文件名(如 "pos_machine_view1")或者任何你觉得方便追踪的唯一字符串。

  • "image" (字符串):

    • 作用: 告诉模型这张图片在哪里。

    • 写法: 非常重要! 这里需要填写相对于 dataset.jsonl 文件的路径。根据我们之前设定的目录结构,图片都放在 images 文件夹里,所以路径通常是 images/图片文件名.jpg

  • "conversations" (列表/数组):

    • 作用: 这是核心的对话内容,模型将学习这个问答模式。它是一个列表 [...],里面包含了一轮或多轮对话。对于您的场景,一轮问答就足够了。

    • "from": "user": 代表这是“用户”的输入。这里的 "value" 就是您在实际使用模型时会输入的问题或指令。为了让模型更好地泛化,您可以在不同数据里使用稍微不同的问法,例如:“图中行为是否规范?”、“请描述店员在做什么。”等等。

    • "from": "assistant": 代表这是“助手”的回答。这里的 "value" 是您为这个问题设定的**“标准答案”或“黄金答案”**。微调的目的,就是让模型学习,当它看到这张图并被问到类似问题时,能够生成和这个标准答案一样或类似的回答。


扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/906.html

分享给朋友:

“qwen2.5vl模型微调第二天, SWIFT框架安装和微调脚本编写” 的相关文章

c#中string和StringBuilder效率对比

c#中string和StringBuilder效率对比

    c#中string和StringBuilder直接看看执行速度。(2).String类型累计赋值Test               ...

svn自动更新到网站

svn自动更新到网站

【一】.钩子文件的设置和创建(1).打开hooks目录,可以看到有一个post-commit.tmpl文件,这是一个模板文件。复制一份,重命名为post-commit,将其用户组设为www,并设置为可执行。chown www:www post-commitchmod +x post-commit(2...

PHP安装mongodb扩展

PHP安装mongodb扩展

在安装之前我们先看看官方给出的依赖关系.首先是dll文件和mongodb软件的依赖关系然后是PHP文件和dll的依赖关系我的是phpstudy的集成环境PHP5.4.45 NTS+Apache+Mysql【一】.安装mongodb3.0软件对比依赖关系下载mongodb3.0.msi软件,完整名称:...

Application的错误使用

Application的错误使用

Application 对象用于存储和访问来自任意页面的变量,类似 Session 对象。不同之处在于所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对应的。很多的书籍中介绍的Application对象都喜欢以统计在线人数来介绍Application 对象...

Git日志查看和版本切换

Git日志查看和版本切换

日志查看:git log版本切换:方式1:git  reset  --hard  HEAD^   倒退一个版本git  reset  --hard  HEAD^^  倒退两个版本方式2:(版本号的形式,建议版本号码补充完...

C# md5加密,C# md5加密代码

C# md5加密,C# md5加密代码

public static string GetMD5(string str) {     //创建MD5对象     MD5 md5 = MD5.C...