> 技术文档 > LLaMA-Factory微调sft Qwen2.5-VL-7B-Instruct_llamafactory qwen2.5-vl

LLaMA-Factory微调sft Qwen2.5-VL-7B-Instruct_llamafactory qwen2.5-vl

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-Factorydocker 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.58pip install transformers==4.46.2

打开webui

llamafactory-cli webui

定义数据

数据集样例:

[ { \"messages\": [ { \"content\": \"你是一个擅长识别印章上文字的助手,输出json字符串给用户。\", \"role\": \"system\" }, { \"content\": \"识别图片里红色印章上的公司名称或单位名称(印章主文字)。\", \"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 templateregister_template( name=\"qwen2_vl\", format_user=StringFormatter(slots=[\"user\\n{{content}}\\nassistant\\n\"]), format_assistant=StringFormatter(slots=[\"{{content}}\\n\"]), format_system=StringFormatter(slots=[\"system\\n{{content}}\\n\"]), format_function=FunctionFormatter(slots=[\"{{content}}\\n\"], tool_format=\"qwen\"), format_observation=StringFormatter( slots=[\"user\\n\\n{{content}}\\n\\nassistant\\n\"] ), format_tools=ToolFormatter(tool_format=\"qwen\"), default_system=\"You are a helpful assistant.\", stop_words=[\"\"], mm_plugin=get_mm_plugin(name=\"qwen2_vl\", image_token=\"\", video_token=\"\"),)

在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
### modelmodel_name_or_path: /Qwen2.5-VL-7B-Instruct # 模型的路径,指定你自己的模型路径。如果你有自定义模型,这里需要改成相应的路径。### methodstage: 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 # 数据多就多给点### datasetdataset: zizhi # 使用的数据集。这里包含两个数据集:mllm_demo 和 identity。你可以使用这些默认数据集或者替换成自己的数据集。template: qwen2_vl # 数据集的模板,用于定义如何处理输入和输出。cutoff_len: 2048 # 输入文本的最大长度,超过这个长度的文本将被截断。max_samples: 1000 # 最多处理的数据样本数量,这里限制为 1000 样本。overwrite_cache: true # 是否覆盖预处理的数据缓存。如果之前缓存有数据,这里会强制覆盖。preprocessing_num_workers: 16 # 数据预处理时使用的 CPU 核心数量,指定为 16 个核心以加速处理。### outputoutput_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 # 是否覆盖之前的输出目录,如果之前有训练结果,这里会将其覆盖。### trainper_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(分布式数据并行)超时设置,确保在分布式环境下不会因为超时导致训练中断。### evalval_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

### modelmodel_name_or_path: /Qwen2.5-VL-7B-Instructadapter_name_or_path: output/saves/Qwen2.5-VL-7B-Instruct/lora/train_2025-03-14-05-58-17template: qwen2_vlfinetuning_type: lora### exportexport_dir: output/saves/Qwen2.5-VL-7B-Instruct/lora/train_2025-03-14-05-58-17-mergeexport_size: 5export_device: cpuexport_legacy_format: false

导出指令:

llamafactory-cli export examples/merge_lora/zizhi.yaml

股市行情网