LLaMA-Factory v1 怎么做多模态 SFT 训练(图像/视频/音频样本)
【免费下载链接】LlamaFactoryUnified Efficient Fine-Tuning of 100+ LLMs & VLMs (ACL 2024)项目地址: https://gitcode.com/GitHub_Trending/ll/LlamaFactory
如果你的数据不是纯文本对话,而是混合了图像、视频或音频的多模态样本,想在 LLaMA-Factoryv1里跑一次监督微调(SFT),可以参考仓库自带的多模态示例:训练配置 examples/v1/train_full/train_multimodal.yaml 指向演示数据 data/v1_multimodal_demo.yaml,使用fsdp2分布式策略对一个 Qwen 模型做小规模验证训练。本文按“环境安装 → 准备多模态数据 → 配置训练文件 → 运行 → 验证”的顺序走一遍这条路径。
准备环境
docs/zh/getting-started.md 给出的软件依赖要求如下(最低 / 推荐版本):
| 必需项 | 至少 | 推荐 |
|---|---|---|
| python | 3.11 | 3.12 |
| torch | 2.7.1 | 2.7.1 |
| torchvision | 0.22.1 | 0.22.1 |
| transformers | 5.0.0 | 5.0.0 |
| datasets | 3.2.0 | 4.0.0 |
| peft | 0.18.1 | 0.18.1 |
可选依赖:CUDA(NVIDIA GPU)至少 11.6(推荐 12.2)、flash-attn至少 2.5.6、deepspeed0.18.4。
安装方式二选一,文档推荐从源码安装:
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e .或者直接用 pip:
pip install llamafactoryv1 多模态数据格式
v1 使用统一的Messages 格式作为标准数据格式:每个样本是一个包含messages字段的 JSON 对象,messages中每条消息有role(system/user/assistant)、content和loss_weight三个字段(见 docs/zh/data-preparation/data-processing.md)。
多模态样本的关键在content:它是一个列表,除{"type": "text", ...}外可以加入非文本类型:
image_url:图像video_url:视频audio_url:音频
一个图像样本的标准格式(文档示例):
{ "messages": [ { "role": "user", "content": [ {"type": "text", "value": "这张图片里有什么?"}, {"type": "image_url", "value": "path/to/image.jpg"} ], "loss_weight": 0.0 }, { "role": "assistant", "content": [{"type": "text", "value": "图片中有一只猫。"}], "loss_weight": 1.0 } ] }loss_weight控制该消息是否计算损失:0.0表示不算(一般用于提示词部分),1.0表示完全计算(用于回复部分),也可以设为其他值调整学习权重。文档说明image_url、audio_url、video_url的路径可以是相对路径或绝对路径,具体加载方式由DataLoaderPlugin决定。
仓库自带的演示数据 data/v1_multimodal_demo.jsonl 就是这种格式,其中一条实际样本如下(多轮对话,image_url指向仓库内的演示图片):
{"messages": [{"role": "user", "content": [{"type": "image_url", "value": "data/mllm_demo_data/1.jpg"}, {"type": "text", "value": "Who are they?"}]}, {"role": "assistant", "content": [{"type": "text", "value": "They're Kane and Gretzka from Bayern Munich."}]}, {"role": "user", "content": [{"type": "text", "value": "What are they doing?"}, {"type": "image_url", "value": "data/mllm_demo_data/1.jpg"}]}, {"role": "assistant", "content": [{"type": "text", "value": "They are celebrating on the soccer field."}]}]}注意:演示数据里目前只包含图像样本。要训练视频或音频数据,按同一格式把内容项换成video_url/audio_url并指向你的本地文件即可,文档未提供视频、音频的现成演示数据。
数据集配置
训练配置不直接指向.jsonl,而是通过一个数据集配置文件引用它。仓库自带的 data/v1_multimodal_demo.yaml 内容如下:
multimodal_demo: path: data/v1_multimodal_demo.jsonl source: local即声明一个名为multimodal_demo的数据集,从本地路径data/v1_multimodal_demo.jsonl加载。
补充说明:数据预处理文档描述的dataset_info.yaml字段包括file_name(本地文件路径,支持.json、.jsonl、.csv、.parquet、.arrow、.txt)、hf_hub_url(HF Hub 仓库 ID,二者必选其一),以及可选的converter、size、weight、split、streaming。文档未逐字段解释演示配置中使用的path/source写法,如果你的数据需要转换器或权重配置,以 docs/zh/data-preparation/data-processing.md 中的字段说明为准,并参考该文档给出的示例。
配置训练文件
仓库示例 examples/v1/train_full/train_multimodal.yaml 全文如下:
model: Qwen/Qwen3.5-0.8B model_class: llm kernel_config: name: auto quant_config: null dist_config: name: fsdp2 dcp_path: null ### data train_dataset: data/v1_multimodal_demo.yaml ### training output_dir: outputs/test_multimodal micro_batch_size: 1 cutoff_len: 2048 learning_rate: 1.0e-4 max_steps: 5 ### sample sample_backend: hf max_new_tokens: 128各项的含义可以对照理解:
model/model_class:指定模型与模型类别,示例使用Qwen/Qwen3.5-0.8B,替换成你要微调的模型即可;dist_config.name: fsdp2:分布式策略,示例走 FSDP2;train_dataset:指向上一节的数据集配置文件;micro_batch_size: 1、cutoff_len: 2048、learning_rate: 1.0e-4:训练超参;max_steps: 5:很小的步数,用于快速验证流水线,正式训练需按数据集规模调整;sample块(sample_backend、max_new_tokens)随模板提供,保留原样即可,示例文档未对其做进一步展开。
运行训练
按 docs/zh/getting-started.md 的命令行训练方式,先导出USE_V1=1再传入训练配置文件:
export USE_V1=1 llamafactory-cli sft examples/v1/train_full/train_multimodal.yaml文档说明llamafactory-cli sft与llamafactory-cli train等价,两个命令可以互换。
验证结果
训练前核对数据。数据预处理文档给出了用DataEngine直接访问数据样本的方法,可以先把数据集加载出来检查格式是否正确(下方路径替换为你的多模态数据文件):
from llamafactory.v1.config.data_args import DataArguments from llamafactory.v1.core.data_engine import DataEngine data_args = DataArguments(dataset="data/v1_multimodal_demo.jsonl") engine = DataEngine(data_args=data_args) print(f"数据集总样本数: {len(engine)}") print(f"数据集列表: {list(engine.datasets.keys())}") sample = engine[0] print(f"样本格式: {sample.keys()}") for content_item in sample['messages'][0]['content']: print(f" 类型: {content_item['type']}, 值: {content_item['value']}")文档给出的输出示例(对应文本演示数据集,此处仅示意输出形态):
数据集总样本数: 500 数据集列表: ['default'] 样本格式: dict_keys(['_dataset_name', 'messages'])按多模态数据文件加载时,content中应能看到image_url(或video_url/audio_url)类型的条目及其路径,说明消息列表与媒体引用已被正确解析。
训练后检查产物与推理。按上面的配置,训练产物写入outputs/test_multimodal(即output_dir)。确认训练正常结束、输出目录生成后,按快速开始文档的推理部署方式加载模型做交互式验证:
llamafactory-cli chat --model_name_or_path path/to/your/model --template qwen其中path/to/your/model替换为你训练产物的实际路径;也可以加--infer_backend vllm使用 vLLM 后端。
边界与限制
- 快速开始文档提示:v1 版本目前支持 SFT 和 DPO 两种训练方法,多模态 SFT 属于其中 SFT 路径;
- 演示数据只覆盖图像;
video_url/audio_url由数据格式文档明确支持,但仓库没有附带对应演示文件,加载行为由DataLoaderPlugin决定; - 示例配置的
max_steps: 5与micro_batch_size: 1是快速验证规模,正式训练时这两项需要按自己的数据量和显存调整,文档未给出统一推荐值。
【免费下载链接】LlamaFactoryUnified Efficient Fine-Tuning of 100+ LLMs & VLMs (ACL 2024)项目地址: https://gitcode.com/GitHub_Trending/ll/LlamaFactory
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考