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" 是您为这个问题设定的**“标准答案”或“黄金答案”**。微调的目的,就是让模型学习,当它看到这张图并被问到类似问题时,能够生成和这个标准答案一样或类似的回答。
c#中string和StringBuilder直接看看执行速度。(2).String类型累计赋值Test  ...
Application 对象用于存储和访问来自任意页面的变量,类似 Session 对象。不同之处在于所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对应的。很多的书籍中介绍的Application对象都喜欢以统计在线人数来介绍Application 对象...
1.远程仓库的协作模式开发者把自己最新的版本推到线上仓库,同时把线上仓库的最新代码,拉到自己本地即可2.注册git帐号国外: http://www.github.com国内: http://git.oschina.net2.在码云创建项目,不要初始化readmegit push https://gi...
git pull https://git.oschina.net/392223903/learn.git master 换为您的git地址...
日志查看:git log版本切换:方式1:git reset --hard HEAD^ 倒退一个版本git reset --hard HEAD^^ 倒退两个版本方式2:(版本号的形式,建议版本号码补充完...
1.关机Process.Start("shutdown", "-s -t 0"); 2. 注销 Proc...