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  ...
【一】.钩子文件的设置和创建(1).打开hooks目录,可以看到有一个post-commit.tmpl文件,这是一个模板文件。复制一份,重命名为post-commit,将其用户组设为www,并设置为可执行。chown www:www post-commitchmod +x post-commit(2...
在安装之前我们先看看官方给出的依赖关系.首先是dll文件和mongodb软件的依赖关系然后是PHP文件和dll的依赖关系我的是phpstudy的集成环境PHP5.4.45 NTS+Apache+Mysql【一】.安装mongodb3.0软件对比依赖关系下载mongodb3.0.msi软件,完整名称:...
Application 对象用于存储和访问来自任意页面的变量,类似 Session 对象。不同之处在于所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对应的。很多的书籍中介绍的Application对象都喜欢以统计在线人数来介绍Application 对象...
日志查看:git log版本切换:方式1:git reset --hard HEAD^ 倒退一个版本git reset --hard HEAD^^ 倒退两个版本方式2:(版本号的形式,建议版本号码补充完...
public static string GetMD5(string str) { //创建MD5对象 MD5 md5 = MD5.C...