LLaMA-Factory微调sft Qwen2.5-VL-7B-Instruct

https://www.dong-blog.fun/post/1991

之前的相关文章:

【深度学习】LLaMA-Factory微调sft Qwen2-VL进行印章识别

https://www.dong-blog.fun/post/1661

使用LLaMA-Factory微调sft Qwen2-VL-7B-Instruct

https://www.dong-blog.fun/post/1762

构建最新的LLaMA-Factory镜像

https://www.dong-blog.fun/post/1799

启动容器

cd LLaMA-Factory

docker run -it --rm --gpus  '"device=1,2,3"' \
    -v ./hf_cache:/root/.cache/huggingface \
    -v ./ms_cache:/root/.cache/modelscope \
    -v ./data:/app/data \
    -v ./output:/app/output \
    -v ./examples:/app/examples \
    -v /ssd/xiedong/zizhishenhe/user_data_deal/data_new:/ssd/xiedong/zizhishenhe/user_data_deal/data_new \
    -v /ssd/xiedong/Qwen/Qwen2.5-VL-7B-Instruct:/Qwen2.5-VL-7B-Instruct \
    -p 7861:7860 \
    -p 8001:8000 \
    --shm-size 16G \
    kevinchina/deeplearning:llamafactory20250311-3 bash

kevinchina/deeplearning:llamafactory20250311-3已经安装:

pip install opencv-python-headless==4.5.4.58
pip install transformers==4.46.2

打开webui

llamafactory-cli webui

定义数据集

数据集样例:

[
  {
    "messages": [
      {
      "content": "你是一个擅长识别印章上文字的助手,输出json字符串给用户。",
      "role": "system"
      },
      {
        "content": "<image>识别图片里红色印章上的公司名称或单位名称(印章主文字)。",
        "role": "user"
      },
      {
        "content": "{\"印章主文字\": \"饮酒太原近似收益有限公司\"}",
        "role": "assistant"
      }
    ],
    "images": [
      "/xiedong/yinzhang/save_dst/010155.jpg"
    ]
  }
]

对于上述格式的数据, dataset_info.json 中的 数据集描述 应为:

{
  "seal": {
    "file_name": "seal.json",
    "formatting": "sharegpt",
    "columns": {
      "messages": "messages",
      "images": "images"
    },
    "tags": {
      "role_tag": "role",
      "content_tag": "content",
      "user_tag": "user",
      "assistant_tag": "assistant",
      "system_tag": "system"
    }
  }
}

定义训练Lora的配置yaml

数据模板在代码的这里:https://github.com/hiyouga/LLaMA-Factory/blob/ef5f1c1def3da62ee2d5e6ba933f9d7d6aab4340/src/llamafactory/data/template.py#L1359

# copied from qwen template
register_template(
    name="qwen2_vl",
    format_user=StringFormatter(slots=["<|im_start|>user\n{{content}}<|im_end|>\n<|im_start|>assistant\n"]),
    format_assistant=StringFormatter(slots=["{{content}}<|im_end|>\n"]),
    format_system=StringFormatter(slots=["<|im_start|>system\n{{content}}<|im_end|>\n"]),
    format_function=FunctionFormatter(slots=["{{content}}<|im_end|>\n"], tool_format="qwen"),
    format_observation=StringFormatter(
        slots=["<|im_start|>user\n<tool_response>\n{{content}}\n</tool_response><|im_end|>\n<|im_start|>assistant\n"]
    ),
    format_tools=ToolFormatter(tool_format="qwen"),
    default_system="You are a helpful assistant.",
    stop_words=["<|im_end|>"],
    mm_plugin=get_mm_plugin(name="qwen2_vl", image_token="<|image_pad|>", video_token="<|video_pad|>"),
)

在webui中选定模型和数据后,可以预览命令,也可以看出来数据模板:

比如预览:

llamafactory-cli train \
    --stage sft \
    --do_train True \
    --model_name_or_path Qwen/Qwen2.5-VL-7B-Instruct \
    --preprocessing_num_workers 16 \
    --finetuning_type lora \
    --template qwen2_vl \
    --flash_attn auto \
    --dataset_dir data \
    --dataset zizhi \
    --cutoff_len 2048 \
    --learning_rate 5e-05 \
    --num_train_epochs 3.0 \
    --max_samples 100000 \
    --per_device_train_batch_size 2 \
    --gradient_accumulation_steps 8 \
    --lr_scheduler_type cosine \
    --max_grad_norm 1.0 \
    --logging_steps 5 \
    --save_steps 100 \
    --warmup_steps 0 \
    --packing False \
    --report_to none \
    --output_dir saves/Qwen2.5-VL-7B-Instruct/lora/train_2025-03-14-05-58-17 \
    --bf16 True \
    --plot_loss True \
    --trust_remote_code True \
    --ddp_timeout 180000000 \
    --include_num_input_tokens_seen True \
    --optim adamw_torch \
    --lora_rank 8 \
    --lora_alpha 16 \
    --lora_dropout 0 \
    --lora_target all 

配置yaml文件设置训练方式。

vim examples/train_lora/qwen2vl_lora_sft_zizhi.yaml
### model
model_name_or_path: /Qwen2.5-VL-7B-Instruct # 模型的路径,指定你自己的模型路径。如果你有自定义模型,这里需要改成相应的路径。

### method
stage: sft # 指定训练阶段为 SFT(Supervised Fine-Tuning),这是一个监督微调的阶段。
do_train: true # 表示开始进行训练。
finetuning_type: lora # 使用 LoRA (Low-Rank Adaptation) 方法进行微调。建议避免使用 QLoRA 等其他复杂微调方法,因为 LoRA 效率更高且较为简单。
lora_target: all # 这里指定所有的模型层都将被 LoRA 处理,确保微调应用到整个模型。
deepspeed: examples/deepspeed/ds_z3_config.json  # 这个是很猛的降低显存的办法,我加的!!!记住,这么加就行!!!
lora_rank: 512 # 数据多就多给点
lora_alpha: 512 # 数据多就多给点


### dataset
dataset: zizhi  # 使用的数据集。这里包含两个数据集:mllm_demo 和 identity。你可以使用这些默认数据集或者替换成自己的数据集。
template: qwen2_vl # 数据集的模板,用于定义如何处理输入和输出。
cutoff_len: 2048 # 输入文本的最大长度,超过这个长度的文本将被截断。
max_samples: 1000 # 最多处理的数据样本数量,这里限制为 1000 样本。
overwrite_cache: true # 是否覆盖预处理的数据缓存。如果之前缓存有数据,这里会强制覆盖。
preprocessing_num_workers: 16 # 数据预处理时使用的 CPU 核心数量,指定为 16 个核心以加速处理。

### output
output_dir: output/saves/Qwen2.5-VL-7B-Instruct/lora/train_2025-03-14-05-58-17 # 训练输出的保存路径,所有训练结果将保存到这个目录。可以根据需要修改此路径。
logging_steps: 1 # 每隔 10 步进行一次日志记录,方便跟踪训练进度。
save_steps: 500 # 每 500 步保存一次模型检查点,确保可以在训练中途恢复。
plot_loss: true # 是否绘制损失曲线,开启此选项可以帮助你可视化训练损失的变化。
overwrite_output_dir: true # 是否覆盖之前的输出目录,如果之前有训练结果,这里会将其覆盖。

### train
per_device_train_batch_size: 2 # 每个设备(如 GPU)上的训练批次大小为 1,适合显存有限的设备。
gradient_accumulation_steps: 8 # 梯度累积步数为 8,这意味着每 8 个小批次的梯度将累积后再进行一次更新,等效于增加了有效批次大小。
learning_rate: 1.0e-4 # 学习率设置为 1.0e-4,这是一个较小的学习率,适合微调任务。
num_train_epochs: 50.0 # 训练的总轮数为 ,数据量多的话可以适当增加训练轮次。官方示例中默认使用 3 轮。
lr_scheduler_type: cosine # 使用余弦学习率调度器,学习率将根据余弦函数逐渐减少。
warmup_ratio: 0.1 # 热身比例为 0.1,这意味着前 10% 的训练步骤用于热身,逐渐增大学习率。
bf16: true  # 使用 bf16 混合精度训练,能够在不损失太多精度的情况下加速训练。
ddp_timeout: 180000000 # DDP(分布式数据并行)超时设置,确保在分布式环境下不会因为超时导致训练中断。

### eval
val_size: 0.1 # 验证集占数据集的比例为 0.1,表示使用 10% 的数据集进行验证。
per_device_eval_batch_size: 1 # 每个设备上评估的批次大小为 1,与训练的批次大小一致。
eval_strategy: steps # 评估策略为按步评估,意味着每隔一定步数进行一次评估。
eval_steps: 500 # 每 500 步进行一次评估,确保训练期间可以监控模型性能。

vim examples/deepspeed/ds_z3_config.json

{
  "train_batch_size": "auto",
  "train_micro_batch_size_per_gpu": "auto",
  "gradient_accumulation_steps": "auto",
  "gradient_clipping": "auto",
  "zero_allow_untested_optimizer": true,
  "fp16": {
    "enabled": "auto",
    "loss_scale": 0,
    "loss_scale_window": 1000,
    "initial_scale_power": 16,
    "hysteresis": 2,
    "min_loss_scale": 1
  },
  "bf16": {
    "enabled": "auto"
  },
  "zero_optimization": {
    "stage": 3,
    "overlap_comm": true,
    "contiguous_gradients": true,
    "sub_group_size": 1e9,
    "reduce_bucket_size": "auto",
    "stage3_prefetch_bucket_size": "auto",
    "stage3_param_persistence_threshold": "auto",
    "stage3_max_live_parameters": 1e9,
    "stage3_max_reuse_distance": 1e9,
    "stage3_gather_16bit_weights_on_model_save": true
  }
}

启动训练

llamafactory-cli train examples/train_lora/qwen2vl_lora_sft_zizhi.yaml

导出模型

vim examples/merge_lora/zizhi.yaml

### model
model_name_or_path: /Qwen2.5-VL-7B-Instruct
adapter_name_or_path: output/saves/Qwen2.5-VL-7B-Instruct/lora/train_2025-03-14-05-58-17
template: qwen2_vl
finetuning_type: lora

### export
export_dir: output/saves/Qwen2.5-VL-7B-Instruct/lora/train_2025-03-14-05-58-17-merge
export_size: 5
export_device: cpu
export_legacy_format: false

导出指令:

llamafactory-cli export examples/merge_lora/zizhi.yaml
### 对 LLaMA-FactoryQwen 2.5 版本模型进行视觉-语言 (VL) 微调 为了在 LLaMA-Factory 中对 Qwen 2.5 版本模型执行视觉-语言微调,需遵循特定配置和流程。首先确认已下载并设置好基础环境,在 `/mnt/workspace/` 下准备好所需资源[^1]。 #### 准备数据集 对于视觉-语言任务的数据准备至关重要。通常涉及图像特征提取以及相应的文本描述配对。确保所使用的数据格式兼容于框架需求,并按照指定结构组织文件夹: ```bash dataset/ ├── images/ │ ├── image_001.jpg │ └── ... └── captions.jsonl ``` 其中 `captions.jsonl` 文件每一行为 JSON 格式的字典对象,包含图片 ID 和对应的 caption 字符串。 #### 修改超参数配置 编辑位于 GitHub 上提到的路径中的 Python 脚本部分代码片段来适应 VL 任务特性[^2]: ```python from dataclasses import dataclass, field @dataclass class DataTrainingArguments: dataset_name: str = field( default=None, metadata={"help": "The name of the dataset to use."} ) image_column: Optional[str] = field( default="image_path", metadata={ "help": "The column name of the image paths in the datasets." }, ) text_column: Optional[str] = field( default="caption", metadata={ "help": "The column name of the texts associated with images." } ) ``` 此修改使得训练过程中能够正确读取图像路径及其关联的文字说明列名。 #### 执行微调过程 完成上述准备工作之后,通过命令行工具启动实际的微调操作。具体指令取决于本地安装情况和个人偏好设定;这里提供一个通用模板供参考: ```bash python run_clm.py \ --model_name_or_path /mnt/workspace/models/qwen-2.5-7b-instruct \ --train_file ./dataset/captions.jsonl \ --do_train \ --output_dir /mnt/workspace/output/vision_language_tuned_qwen \ --per_device_train_batch_size 4 \ --gradient_accumulation_steps 8 \ --learning_rate 5e-5 \ --num_train_epochs 3 \ --save_strategy epoch \ --logging_dir /mnt/workspace/logs \ --logging_steps 10 ``` 以上命令假设已经具备适当规模 GPU 支持下的计算能力以处理此类多模态学习任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值