针对VL模型的数据构造

当前数据处理方式参考LLaMAFactory仓库实现。

1. 适用范围

本文所述数据构造方式通用于仓库内大多数 VL 模型(如 Qwen3.6Qwen3.5Qwen3VLQwen2.5VLGLM4.5VKimi-K2.5Step3-VL 等)。各模型若有特殊数据要求(如视频、音频等),以其 README 为准。

2. 使用真实数据集

2.1. 数据集下载(以coco2017数据集为例)

(1)用户需要自行下载COCO2017数据集COCO2017,并解压到本地路径,如./data/COCO2017

Note

如无法顺利访问HuggingFace社区下载资源,推荐前往ModelScope下载,需关注待下载文件的正确性与安全性。

(2)获取图片数据集的描述文件(LLaVA-Instruct-150K),下载至本地,如./data/路径下。

下载得到的是原始格式数据,采用本地多模态 ShareGPT 风格的字段(示例见 2.3),使用前需参考 2.2 转换为训练实际读取的目标格式。

2.2. 数据格式转换

运行数据转换脚本,得到格式转换后的描述文件:

python mindspeed_mm/fsdp/tools/data_tool/llava_instruct_2_mllm_demo_format.py \
    --coco_path ./data/COCO2017 \
    --llava_json_path ./data/llava_instruct_150k.json \
    --output_json_path ./data/mllm_format_llava_instruct_data.json

并在训练开始前修改xxx_config.yaml中data配置:

### 数据相关配置
data:
  dataset_param:
    basic_parameters:
      # 将该字段修改为COCO2017所在路径
      dataset_dir: ./data/COCO2017
      # 将该字段修改为格式转换后json路径
      dataset: &DATASET_PATH ./data/mllm_format_llava_instruct_data.json
      # 该参数用于限制只读取`max_samples`条数据,可用于快速验证功能,null即为全部数据
      max_samples: null

对于其他格式的原始数据集,可以参考mindspeed_mm/fsdp/tools/data_tool/llava_instruct_2_mllm_demo_format.py自行设计数据格式转换脚本,转换后的数据目标格式如下:

# 图文数据
[
  {
    "messages":[
      {
        "content": "<image>source1",
        "role": "user"
      },
      {
        "content": "target1",
        "role": "assistant"
      },
      {
        "content": "<image>source2",
        "role": "user"
      },
      {
        "content": "target2",
        "role": "assistant"
      }
    ],
    "images": [
      "demo_image_1.jpg", "demo_image_2.jpg"
    ]
  },
  ...
]
# 视频文本数据
[
  {
    "messages":[
      {
        "content": "<video>source1",
        "role": "user"
      },
      {
        "content": "target1",
        "role": "assistant"
      }
    ],
    "videos": [
      "demo_video.mp4"
    ]
  },
  ...
]

2.3. 多数据集以及纯文本或有图无图混合数据(以LLaVA原始数据格式为例)

当前支持读取多个以,(注意不要加空格)分隔的数据集

例如xxx_config.yaml

### 数据相关配置
data:
  dataset_param:
    basic_parameters:
      dataset_dir: ./data/COCO2017  # 将该字段修改为COCO2017所在路径
      dataset: &DATASET_PATH ./data/mllm_format_llava_instruct_data1.json,./data/mllm_format_llava_instruct_data2.json  # 将该字段修改为格式转换后json路径

现在本框架已经支持纯文本/混合数据(有图像和无图像数据混合训练)。

注意:以下示例为转换前的源格式(LLaVA 原始风格),并非训练直接读取的格式。 准备好后仍需参照上一章节转换为目标格式后再用于训练。

在数据构造时,对于包含图片的数据,需要保留image这个键值。 各字段含义如下:

  • 图片字段:image
  • 对话字段:conversations
  • 角色字段:from
  • 内容字段:value
{
  "id": your_id,
  "image": your_image_path,
  "conversations": [
      {"from": "human", "value": your_query},
      {"from": "gpt", "value": your_response},
  ],
}

在数据构造时,对于纯文本数据,可以去除image这个键值。

{
  "id": your_id,
  "conversations": [
      {"from": "human", "value": your_query},
      {"from": "gpt", "value": your_response},
  ],
}

3. 使用虚构数据进行功能/性能测试

使用真实数据集进行训练时,通常因为样本间序列长度不一,每一步迭代的时间会有所波动,且真实数据通常较大,有一定的下载和使用成本,因此在指定数据分辨率、序列长度的功能和性能测试场景,使用虚构数据可以更快的满足测试效果。

当前仓库提供了一种构造指定配置图文数据的方法,虚构数据生成脚本使用指令如下:

source /usr/local/Ascend/ascend-toolkit/set_env.sh
SAVE_DIR=./data/mocked_vl_data/
mkdir -p $SAVE_DIR
# 下方命令会生成包括512条样本的数据集,每条样本拥有10张1024*1024大小的图片以及16384的文本长度,--tokenizer_path需要指定当前待测模型的原始权重本地路径
python mindspeed_mm/fsdp/tools/data_tool/generate_mock_data_for_vlmodel.py \
    --tokenizer_path /home/weights/Qwen3.5-35B-A3B/ \
    --pic_width 1024 \
    --pic_height 1024 \
    --num_pics 10 \
    --text_length 16384 \
    --num_samples 512 \
    --save_dir $SAVE_DIR

并在训练开始前修改xxx_config.yaml中data配置:

### 数据相关配置
data:
  dataset_param:
    basic_parameters:
      # 该参数指定模型训练的核心语言模块接受的最大序列长度,超出该配置的部分将被截断,建议构造数据是手动计算图文序列长度占比及总长度,尽可能与cutoff_len数值接近,否则会有截断图片占位符无法正常训练的风险
      cutoff_len: 16384
      # 将该字段修改构造数据的保存路径
      dataset_dir: ./data/mocked_vl_data
      # 将该字段修改为构造数据的json路径
      dataset: &DATASET_PATH ./data/mocked_vl_data/mock_data_pic_num_10_textlen_16384.json
      # 该参数用于限制只读取`max_samples`条数据,可用于快速验证功能,null即为全部数据
      max_samples: null