VLM 数据集转换#
1. 数据集格式与处理#
考虑到多模态数据集的多样性,本项目采用 Energon 加载器来提升数据处理性能,该加载器要求数据集以标准 WebDataset 格式存储。WebDataset 以原生文件格式(jpg、mp4 等)存储数据,允许各种原生多模态数据集简单地压缩并转换为 WebDataset 格式,然后由 Energon 读取。
参考文档:
本目录提供 tools/data_preprocess/vlm/convert_to_webdataset.py 用于将 .json/.jsonl 标注文件 + 原始媒体文件(图像/视频)转换为 Energon 可直接读取的 WebDataset 目录(同时生成 Energon 所需的索引和 dataset.yaml)。
2. 支持的数据类型(--sample_type)#
根据 --sample_type 写入不同的 dataset.yaml 文件,决定了 tar 文件内样本的字段组织方式:
常见预训练数据集可使用 caption 格式,SFT 数据集可使用 VQA 格式。对于多图像或混合 SFT 需求,推荐使用 multi_mix_qa 格式。
sample_type |
适用场景 |
说明 |
|---|---|---|
|
单图 VQA |
生成 |
|
单图描述 |
生成 |
|
多图/视频混合 QA |
使用 |
|
多视频 VQA |
同上 |
|
离线打包后的数据 |
通常由 |
其他字符串 |
自定义场景 |
仍写入 |
注意事项:
--media仅用于写入数据集元数据(用于区分 image/video/mix)。实际样本是否包含图像/视频取决于每条数据是否包含image(s)/video(s)字段。如果一条数据既没有
image(s)也没有video(s),将被写入为"纯文本样本"(仅包含json)。
3. 转换脚本使用方法#
支持的输入文件:
--json_file:.json(list[dict])或.jsonl(每行一个 dict)--image_dir/--video_dir:原始媒体文件根目录(条目中存储的是相对路径)
python tools/data_preprocess/vlm/convert_to_webdataset.py \
--output_dir /workspace/wds_data/ \
--json_file tests/datasets/vlm/mllm_demo.json \
--image_dir tests/datasets/vlm/ \
--video_dir tests/datasets/vlm/ \
--media mix \
--columns_messages messages \
--maxcount 10000 \
--maxsize 3000000000 \
--sample_type multi_mix_qa
参数说明:
参数 |
默认值 |
说明 |
|---|---|---|
|
- |
输出目录(生成 |
|
- |
输入 |
|
- |
图像根目录(样本包含 |
|
- |
视频根目录(样本包含 |
|
|
|
|
|
条目中对话/文本字段的键名 |
|
|
每个分片(tar)的最大样本数 |
|
|
每个分片(tar)的最大字节数 |
|
- |
数据类型(见上表) |
输出说明:
输出目录包含
pretrain-0.tar、pretrain-1.tar…(每个 tar 根据 WebDataset 规范按照__key__存储若干文件,如xxx.jpg/xxx.json/xxx.0_a.mp4等)同时生成 Energon 所需的元数据目录(通常名为
.wds/),包含dataset.yaml和索引文件;训练时--data-path通常指向--output_dir
4. 输入 JSON 约定(常用字段)#
每条数据支持以下字段组合(均为相对路径,将与 --image_dir/--video_dir 拼接以读取二进制文件):
图像:
image: "a/b.jpg"或images: ["a/b.jpg", "c/d.jpg"]视频:
video: "a/b.mp4"或videos: ["a/b.mp4", "c/d.mp4"]文本/对话:默认读取
messages(可通过--columns_messages修改)
不同 sample_type 的文本字段要求(与脚本生成的 dataset.yaml 对齐):
vqa:messages应支持读取json[0][content]和json[1][content](通常为长度 >= 2 的列表,元素包含content)caption:messages应支持读取json[captions][0][content](例如 dict 包含captions: [{content: ...}])multi_mix_qa/multi_vid_vqa等:脚本写入结构化的json(包含texts/media/name),下游根据对应的sample_typecooker 进行解析
5. 离线 Packing 数据处理#
在多模态场景中,提供了序列离线 packing 处理方法
详情请参阅 离线数据打包指南