Last Updated: 21 May, 2025

TL;DR – 您选择的文件格式可以削减 30‑50 % 的训练时间,降低 1 %–5 % 的存储成本,并防止多模态模型因数据不对齐而出错。最佳方案是 流式就绪、列式二进制容器(TFRecord、WebDataset、Arrow/Parquet),在单个受版本控制的分片中存储 预分词文本 和 预编码媒体。
为何文件格式对 AI 训练至关重要
| 事实 | 对你的意义 |
|---|---|
| 二进制、列式格式比 CSV 或纯文本快 30‑50 % | 选择直接与硬件(GPU/TPU)和管道(TensorFlow、PyTorch、Spark)对接的格式。 |
| 不一致的分词或图像解码会损害模型质量 | 一次冻结预处理管道,然后存储已分词或已编码的表示。 |
| PB 级别的 LLM 通过 1 % 的尺寸缩减可节省数百万美元 | 使用压缩、分片的容器(ZSTD‑TFRecord、Arrow/Parquet 带字典编码)。 |
| 多模态模型需要同步的对齐元数据 | 将时间戳、边界框、字幕 ID 保存在同一记录中,而不是分散在不同文件里。 |
| 监管合规现在要求不可变、哈希校验的数据 | 生成一个清单(JSON/YAML),记录模式、校验和、来源和版本。 |
底线:格式是防止 I/O 缓慢、数据噪声和合规麻烦的第一道防线。
核心概念与术语(快速参考)
| 概念 | 一句话定义 | 典型使用场景 |
|---|---|---|
| Sharding | 将海量数据集拆分为许多小的、可独立读取的文件(例如 1 GB 分片)。 | 在分布式训练集群上并行加载。 |
| Streaming‑Ready Format | 能够顺序读取而无需随机寻址的文件(TFRecord、WebDataset .tar)。 | 直接从 S3/GCS 进行训练,无需本地副本。 |
| Columnar Storage | 按列而非按行存储数据(Parquet、Arrow)。 | 高效过滤单一模态(例如仅加载字幕)。 |
| Self‑Describing Schema | 文件内部嵌入字段名称和类型。 | 保证跨代码版本的兼容性。 |
| Lazy Decoding / Pre‑Tokenization | 存储已分词的文本(int‑IDs)或预计算的嵌入。 | 将预处理时间在每个 epoch 中降低 2‑5×。 |
| Multi‑Modal Record | 将图像、文本、音频和元数据打包为一个逻辑记录。 | 为视觉‑语言或音频‑文本模型提供同步抽样。 |
| Manifest / Index File | 列出所有分片、校验和及每个分片统计信息的小型 JSON/YAML。 | 快速验证、可恢复训练、审计追踪。 |
| Data‑Versioning | 将数据视作代码进行管理(DVC、LakeFS、Pachyderm)。 | 实验可复现并满足监管合规。 |
选择合适的格式
| 格式 | 模态支持 | 压缩 | 流式读取 | 模式 | 生态系统 |
|---|---|---|---|---|---|
| TFRecord | 任意二进制 Blob → 文本、图像、音频 | 内置 GZIP/ZSTD | ✅ | 隐式(通过 tf.io.parse_example) | TensorFlow、PyTorch(torchdata)、HuggingFace datasets |
WebDataset (.tar, .tar.gz) | 多模态(图像 + 文本 + 音频) | 外部(gzip、zstd) | ✅ | 隐式键值对 | PyTorch DataLoader、webdataset 库 |
| Apache Arrow / Parquet | 列式、嵌套结构、二进制 Blob | Snappy/ZSTD/LZ4 | ✅(Arrow Flight) | ✅(自描述) | Spark、Pandas、PyArrow、HuggingFace datasets |
| JSONL / NDJSON | 人类可读、灵活 | 无(或 gzip) | ❌ | 隐式 | 快速原型、小规模数据集 |
| LMDB | 快速随机读取(键值对) | 无(存储压缩 Blob) | ❌ | 隐式 | 检索增强生成 |
| HDF5 | 分层组、大型数组 | 内置 gzip/lzf | ❌(需分块) | 隐式 | 科学数据、音频频谱图 |
经验法则:
- 大规模训练 → TFRecord、WebDataset 或 Arrow/Parquet(支持流式、压缩、分片)。
- 探索性工作 → JSONL(人类可读、易编辑)。
- 重随机访问(如检索增强生成) → LMDB。
步骤蓝图(从原始文件到生产就绪的分片)
定义唯一的真相模式
message MultiModalExample { bytes image = 1; // JPEG‑XL or AVIF repeated int32 caption = 2; // token IDs bytes audio = 3; // Opus or FLAC map<string, string> meta = 4; // source_id, timestamp, etc. }将此
.proto(或 Arrow 模式)与数据集一起保存。收集并清洗原始资产
- 文本: Unicode‑NFKC,去除控制字符,去重。
- 图像: 先转为无损 PNG,再可选转为有损 JPEG‑XL(质量 85‑90 %)。
- 音频: 重采样至 16 kHz、16‑bit PCM;使用 Opus(有损)或 FLAC(无损)编码。
预处理 / 分词
使用模型实际使用的分词器(例如tiktoken用于 GPT‑NeoX)。将得到的int32[]token ID 直接写入记录。序列化每条记录
选用高速二进制序列化器:Protocol Buffers、FlatBuffers 或 Arrow IPC。目标是 每个示例对应单个字节串,可写入 TFRecord 或 tar 包。分片并压缩
- 目标分片大小:256 MiB – 1 GiB(对 S3 GET range 请求最优)。
- 使用 Zstandard(level 3‑5) 进行压缩——解压快、压缩率好。
- 命名规范:
train-00000-of-01000.tfrecord.zst。
生成清单
[ { "shard": "train-00000-of-01000.tfrecord.zst", "checksum": "sha256:ab12…", "num_examples": 12456, "avg_seq_len": 256, "git_hash": "d3f9c1e" }, … ]清单是验证、可恢复训练和审计的唯一真相来源。
验证
随机抽样 0.1 % 的记录,解码每个字段并执行检查(图像解码、token 长度、音频时长)。计算全局统计(词表覆盖、分辨率分布),并写入清单。版本化并以不可变方式存储
将分片 + 清单推送至不可变桶(gs://my‑project/datasets/v1/)。使用语义版本标记(v1.0.0),并在数据版本管理系统(DVC、LakeFS)中登记快照。在训练循环中加载
# PyTorch + WebDataset example import webdataset as wds, torch, torchvision, torchaudio def decode(sample): img = torchvision.io.decode_image(sample["jpg"], mode=torchvision.io.ImageReadMode.RGB) txt = torch.tensor([int(t) for t in sample["txt"].decode().split()], dtype=torch.long) wav, _ = torchaudio.load(io.BytesIO(sample["wav"])) return {"image": img, "caption": txt, "audio": wav} ds = (wds.WebDataset("s3://my-bucket/train-{00000..00999}.tar.zst") .decode("torchrgb") .map(decode) .batched(64) .prefetch(2)) loader = torch.utils.data.DataLoader(ds, num_workers=8) for batch in loader: # feed to model … pass
新兴趋势与面向未来的准备
| 趋势 | 为什么现在重要 | 快速行动 |
|---|---|---|
| 统一多模态容器(Meta 的 MDS、DeepLake) | 单一文件类型即可容纳文本、图像、视频、音频和嵌入,并内置版本管理。 | 试点 DeepLake;它可与 LangChain 和 LlamaIndex 集成。 |
| 零拷贝 GPU‑direct 存储 | NVMe‑over‑Fabric + GPUDirect 让压缩分片直接流入 GPU 内存。 | 若拥有 NVMe‑SSD 池,启用 torch.utils.data.DataLoader(persistent_workers=True)。 |
| 模式演进友好格式 | Arrow 13+ 支持在不重新写入整个数据集的情况下增删字段。 | 对可能后续加入深度图、视频或额外元数据的流水线,优先使用 Arrow/Parquet。 |
| 自监督预编码 | 存储 CLIP 图像嵌入或 wav2vec 音频嵌入,可将微调计算降低 2‑3×。 | 在 Arrow 表中新增 image_emb(float16)列;保留原始图像以备后续实验。 |
| 隐私保护存储 | 加密 TFRecord + 安全 enclave 正在为 GDPR 重负载领域提供方案。 | 若处理 PII,评估使用自定义加密包装器的 tf.io.TFRecordWriter。 |
| 数据中心 AI 指标 | 数据质量分数(OCR 置信度、模糊度、信噪比)已成为一等超参数。 | 将每个分片的质量分数写入清单,并在训练时过滤低质量分片。 |
生产就绪检查清单
- 将模式文件(
.proto或 Arrow 模式)与数据一起保存。 - 所有分片使用快速编解码器压缩(推荐 ZSTD‑L3)。
- 分片大小控制在 256 MiB 到 1 GiB 之间。
- 清单包含校验和、记录数、每个分片统计以及预处理代码的 git hash。
- 使用不可变版本控制(DVC、LakeFS 或类似工具)。
- 为每个分片记录数据质量指标。
- 完成隐私审计(PII 剔除,可选加密)。
- 端到端测试加载器能够无错误读取随机分片。
- 编写 README,说明模式、预处理步骤以及如何重新生成分片。
遵循此蓝图,您的训练流水线将保持 快速、低成本且可复现——现代 LLM 团队必须具备的三大支柱。
Tags: data‑engineering multi‑modal‑llm training‑pipelines
Slug: how-to-prepare-data-file-formats-for-ai-training