重要提示

您正在查看 NeMo 2.0 文档。此版本引入了 API 的重大更改和一个新的库 NeMo Run。我们目前正在将 NeMo 1.0 的所有功能移植到 2.0。有关先前版本或 2.0 中尚不可用的功能的文档,请参阅 NeMo 24.07 文档

数据准备以使用 Megatron-Energon 数据加载器#

Megatron-Energon 数据加载器旨在高效处理大规模分布式训练环境,特别是对于多模态模型。本文档概述了如何准备所需格式的数据以与 NeMo 框架一起使用。

有关 Megatron-Energon 的详细信息,请参阅 Megatron-Energon 简介。有关 WebDataset 格式的详细信息,请参阅 WebDataset 文档

使用 Megatron-Energon 数据加载器的第一步是以支持的格式准备数据。这包括将原始数据集转换为 WebDataset (WDS) 格式,并生成 Megatron-Energon 所需的元数据。

在此示例中,我们将展示如何将 LLaVA-Pretrain 数据集(JSON 格式)转换为 WebDataset 格式,然后准备它以供 NeMo 中的 Energon 数据模块使用。

步骤 1:下载数据集#

使用以下链接从 Hugging Face 下载数据集

以下是 JSON 结构的示例

[
  {
    "id": "GCC_train_002582585",
    "image": "GCC_train_002582585.jpg",
    "conversations": [
      {
        "from": "human",
        "value": "Provide a brief description of the given image.\n<image>"
      },
      {
        "from": "gpt",
        "value": "Olive oil is a healthy ingredient used liberally."
      }
    ]
  }
]

步骤 2:将 JSON 数据转换为 WebDataset 格式#

可以使用 Python 脚本将 JSON 数据集转换为 WebDataset 格式。您还可以参考 Megatron-LM 中提供的此示例:convert_llava_pretrain_to_wds.py。以下是将执行转换的 Python 脚本示例。根据数据的结构和键修改脚本。该脚本可以从任何目录运行。只需修改输入路径(‘llava_pretrain_dir’)和下面的输出路径。转换后的数据存储在输出路径 <path_to_LLaVA-Pretrain>/wds 中。

import json
import os
import webdataset as wds
from tqdm import tqdm

# Set the path to the LLaVA-Pretrain dataset directory
llava_pretrain_dir = '<path_to_LLaVA-Pretrain>'

# Paths to the dataset files
json_file = os.path.join(llava_pretrain_dir, 'blip_laion_cc_sbu_558k.json')
output_path = os.path.join(llava_pretrain_dir, 'wds')

if not os.path.exists(output_path):
    os.mkdir(output_path)

# Load data
with open(json_file, 'r') as f:
    data = json.load(f)

# Convert JSON to WebDataset
with wds.ShardWriter(os.path.join(output, 'pretrain-%d.tar'), maxcount=10000) as shard_writer:
    for entry in tqdm(data):
        with open(os.path.join(llava_pretrain_dir, entry['image']), "rb") as img_file:
            image_data = img_file.read()
        sample = {
            "__key__": entry['id'],
            "jpg": image_data,
            "json": json.dumps(entry['conversations']).encode("utf-8"),
        }
        shard_writer.write(sample)

print(f"Dataset successfully converted to WebDataset format.")

步骤 3:为 Megatron-Energon 生成元数据#

将数据集转换为 WebDataset 格式后,必须为 Megatron-Energon 数据加载器生成元数据。在包含 WebDataset 文件的目录中运行以下命令:导航到上述输出目录路径以运行以下命令。

energon prepare .

energon prepare <path_to_LLaVA-Pretrain>/wds

此命令创建一个 .nv-meta 文件夹,其中包含 Megatron-Energon 数据加载器所需的必要元数据。

有关更多详细信息,请参阅 Megatron-Energon 文档中的数据准备部分

数据集转换和元数据生成后,您的文件夹将如下所示

.
├── .nv-meta
│   ├── dataset.yaml
│   ├── split.yaml
├── pretrain-0.tar
├── pretrain-16.tar
├── pretrain-16.tar.idx
├── pretrain-23.tar
├── pretrain-23.tar.idx
├── pretrain-31.tar
├── pretrain-31.tar.idx
├── pretrain-39.tar
├── pretrain-39.tar.idx
├── pretrain-47.tar
├── pretrain-47.tar.idx
├── pretrain-55.tar
└── pretrain-55.tar.idx

.nv-meta 目录内容#

.nv-meta 文件夹包含 Megatron-Energon 数据加载器必不可少的元数据文件

.nv-meta/
├── dataset.yaml
└── split.yaml

dataset.yaml 的示例内容#

dataset.yaml 文件提供有关数据集结构和字段映射的信息。以下是一个示例

__class__: VQAWebdataset
__module__: megatron.energon
field_map:
  answers: json[1][value]
  context: json[0][value]
  image: jpg

其他参考资料#

有关数据集格式和示例的更多信息,请参阅:Megatron-Energon 数据集格式

有关创建自定义样本和自定义数据加载器的详细信息,请参阅:高级数据格式文档