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 个子进程加载数据。
相关推荐
Aspect of twilight20 小时前
QwenVL 模型输入细节
人工智能·qwen
刘金宝_Arvin20 小时前
【Data Agent】数据分析智能体 初体验,可用的Chat BI -- 本地部署使用全流程
qwen·ollama·data agent
Swift社区1 天前
LeetCode 375 - 猜数字大小 II
算法·leetcode·swift
Swift社区2 天前
使用 MetricKit 监控应用性能
ios·swiftui·swift
Swift社区2 天前
LeetCode 374 猜数字大小 - Swift 题解
算法·leetcode·swift
七牛云行业应用2 天前
iOS 19.3 突发崩溃!Gemini 3 导致 JSON 解析失败的紧急修复
人工智能·ios·swift·json解析·大模型应用
初级代码游戏2 天前
iOS开发 SwiftUI 6 :List
ios·swiftui·swift
高性能服务器3 天前
AGI-Next 闭门峰会深度纪要:中国AI的3小时深度思辨
agent·agi·qwen·智谱ai·agi-next闭门峰会·阿里千问·模型即产品
亚里随笔3 天前
超越LoRA:参数高效强化学习方法的全面评估与突破
人工智能·深度学习·机器学习·lora·rl