Swift SFT Qwen-VL LoRA 微调指令详解

接上文:使用 ms-swift 微调 Qwen3-VL-2B 详细指南

这条指令是使用 ModelScope Swift 框架对 Qwen-VL (视觉语言大模型)进行 LoRA 微调 的完整脚本。

1. 完整指令代码

bash 复制代码
PYTORCH_CUDA_ALLOC_CONF='expandable_segments:True' \
IMAGE_MAX_TOKEN_NUM=1024 \
VIDEO_MAX_TOKEN_NUM=128 \
FPS_MAX_FRAMES=16 \
NPROC_PER_NODE=1 \
CUDA_VISIBLE_DEVICES=0 \
swift sft \
--model '/root/autodl-tmp/models/Qwen/Qwen3-VL-2B-Instruct' \
--dataset /root/autodl-tmp/plate/train.jsonl \
--val_dataset /root/autodl-tmp/plate/val.jsonl \
--load_from_cache_file true \
--split_dataset_ratio 0.01 \
--train_type lora \
--torch_dtype bfloat16 \
--num_train_epochs 1 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--attn_impl sdpa \
--padding_free false \
--learning_rate 1e-4 \
--lora_rank 8 \
--lora_alpha 32 \
--target_modules all-linear \
--freeze_vit true \
--freeze_aligner true \
--packing false \
--gradient_checkpointing true \
--vit_gradient_checkpointing false \
--gradient_accumulation_steps 2 \
--eval_steps 100 \
--save_steps 100 \
--save_total_limit 2 \
--logging_steps 5 \
--max_length 4096 \
--output_dir /root/autodl-tmp/loras/Qwen/Qwen3-VL-2B-Instruct \
--warmup_ratio 0.05 \
--dataset_num_proc 4 \
--dataloader_num_workers 4

2. 详细参数解析

2.1 环境变量配置 (Environment Variables)

这些变量在 Python 脚本启动前配置了显存管理和多模态数据的处理上限。

变量名 说明
PYTORCH_CUDA_ALLOC_CONF 'expandable_segments:True' 显存防碎片化。允许 CUDA 内存分配器创建可扩展的内存段,防止在显存有剩余但碎片化严重时出现 OOM 错误。
IMAGE_MAX_TOKEN_NUM 1024 图像 Token 限制。限制单张图片被编码后的最大 Token 数,防止高分辨率图片撑爆显存。
VIDEO_MAX_TOKEN_NUM 128 视频 Token 限制。限制视频数据编码后的最大 Token 数量。
FPS_MAX_FRAMES 16 视频帧数限制。如果是视频数据,最多抽取 16 帧进行训练。
NPROC_PER_NODE 1 进程数。每个节点启动的进程数,通常设为 1 代表单卡或单进程控制。
CUDA_VISIBLE_DEVICES 0 显卡指定。只让脚本看到并使用 ID 为 0 的第一张显卡。

2.2 模型与数据路径 (Model & Data)

  • --model '/root/autodl-tmp/models/Qwen/Qwen3-VL-2B-Instruct'
    • 模型路径:指定基础模型的加载路径。
  • --dataset /root/autodl-tmp/plate/train.jsonl
    • 训练集:训练数据的绝对路径,通常为 JSONL 格式。
  • --val_dataset /root/autodl-tmp/plate/val.jsonl
    • 验证集:用于评估模型效果的数据集路径。
  • --load_from_cache_file true
    • 读取缓存 :是否加载预处理后的缓存数据。设为 true 可加速二次启动,避免重复 Tokenize。
  • --split_dataset_ratio 0.01
    • 切分比例 :若未提供验证集,从训练集中切分 1% 作为验证集(因已指定 val_dataset,此项多为备用)。

2.3 训练核心配置 (Training Core)

  • --train_type lora
    • 微调方式 :使用 LoRA (Low-Rank Adaptation)。相比全量微调,显存占用极低,训练速度快。
  • --torch_dtype bfloat16
    • 计算精度 :使用 bfloat16。在 30系/40系/A100 等显卡上比 float16 更稳定,不易溢出。
  • --attn_impl sdpa
    • 注意力机制 :使用 PyTorch 内置的 SDPA (Scaled Dot Product Attention) 进行加速。
  • --num_train_epochs 1
    • 训练轮数:所有数据仅训练 1 个 Epoch。

2.4 显存优化策略 (VRAM Optimization)

这是一个极度节省显存的配置方案:

  • --per_device_train_batch_size 1
    • 训练 Batch :单卡每次只处理 1 条数据,最大限度降低显存峰值。
  • --per_device_eval_batch_size 1
    • 验证 Batch:验证时单卡也只处理 1 条数据。
  • --gradient_accumulation_steps 2
    • 梯度累积:累积 2 步梯度更新一次权重。
    • 等效 Batch Size = 1 (单卡) × 1 (显卡数) × 2 (累积) = 2
  • --gradient_checkpointing true
    • 梯度检查点 :开启后不保存中间激活值,反向传播时重新计算。显著降低显存占用,但略微拖慢速度。
  • --freeze_vit true
    • 冻结视觉塔不训练视觉编码器(Vision Transformer)。
  • --freeze_aligner true
    • 冻结对齐器不训练 连接层(Projector)。结合上一条,意味着仅微调 LLM 部分
  • --vit_gradient_checkpointing false
    • ViT 检查点:因视觉部分已被冻结(不参与计算图),故无需开启此项。

2.5 LoRA 参数详解 (LoRA Config)

  • --lora_rank 8
    • 秩 (Rank):LoRA 矩阵的秩。8 是较小的值,参数量少,显存占用低。
  • --lora_alpha 32
    • 缩放系数 (Alpha):通常设为 Rank 的 2-4 倍。控制 LoRA 权重对模型的影响程度。
  • --target_modules all-linear
    • 目标模块:将 LoRA 挂载到所有的线性层(Q, K, V, O, Gate, Up, Down)。效果通常优于仅挂载 Attention 层。

2.6 数据处理与长度 (Data Processing)

  • --padding_free false
    • 无填充模式:关闭 Padding Free。使用常规 Padding 对齐 Batch。
  • --packing false
    • 多样本打包:关闭打包。多模态训练中关闭此项较稳妥,防止图片 Token 上下文错位。
  • --max_length 4096
    • 最大长度:单条数据(含图片+文本)的最大 Token 数,超过则截断。

2.7 优化器、日志与保存 (Optimizer & Logging)

  • --learning_rate 1e-4
    • 学习率 :初始学习率设为 1e-4,LoRA 常用的大于全量微调的学习率。
  • --warmup_ratio 0.05
    • 预热比例:前 5% 的 Step 学习率从 0 线性增加,用于稳定初期训练。
  • --output_dir /root/...
    • 输出目录:模型权重、日志、配置文件的保存位置。
  • --logging_steps 5
    • 日志频率:每 5 步打印一次 Loss。
  • --eval_steps 100
    • 评估频率:每 100 步在验证集上评估一次。
  • --save_steps 100
    • 保存频率:每 100 步保存一次 Checkpoint。
  • --save_total_limit 2
    • 保存数量:最多保留最新的 2 个模型存档,防止硬盘爆满。

2.8 进程设置 (Process)

  • --dataset_num_proc 4
    • 预处理进程:使用 4 个 CPU 进程进行数据预处理。
  • --dataloader_num_workers 4
    • 数据加载线程:PyTorch DataLoader 使用 4 个子进程加载数据。
相关推荐
fendoudexiaoniao_ios1 天前
iOS 列表拖拽cell排序
ios·swift
一颗小树x1 天前
【VLA 系列】 πRL | 在线强化学习 | 流匹配 | VLA
微调·强化学习·vla·流匹配·πrl
大熊猫侯佩2 天前
Swift 6 驱魔实录:揭开 Combine 与 @Sendable 的“血色契约”
swift·block·combine·preconcurrency·sendable·mainactor·isolation
初级代码游戏2 天前
iOS开发 SwiftUI 15:手势 拖动 缩放 旋转
ios·swiftui·swift
ujainu2 天前
Flutter + OpenHarmony 游戏开发进阶:虚拟摄像机系统——平滑跟随与坐标偏移
开发语言·flutter·游戏·swift·openharmony
dawdo2224 天前
自己动手从头开始编写LLM推理引擎(9)-KV缓存实现和优化
缓存·llm·transformer·qwen·kv cache
初级代码游戏5 天前
iOS开发 SwiftUI 14:ScrollView 滚动视图
ios·swiftui·swift
初级代码游戏5 天前
iOS开发 SwitftUI 13:提示、弹窗、上下文菜单
ios·swiftui·swift·弹窗·消息框
阿尔的代码屋5 天前
[大模型实战 01] 本地大模型初体验:Ollama 部署与 Python 调用指南
qwen·modelscope·大模型实战·ollama·大模型部署
zhyongrui5 天前
托盘删除手势与引导体验修复:滚动冲突、画布消失动画、气泡边框
ios·性能优化·swiftui·swift