記事の目的
最近の大規模音声・テキストモデル(例:Whisper, Moshi, NeMo など)では,
学習データを「どの形式で保存・読み込むか」が非常に重要になります.
なかでも特に,
- WebDataset(.tar形式)
- Parquet形式
が,デファクト(お作法)化しているので,メモしておこうと思います.
簡単にいうと,どちらも「データの格納形式」ですが,目的や設計思想が異なります.
基本的な位置づけ
| 項目 | WebDataset | Parquet |
|---|---|---|
| 主な用途 | 機械学習用の大規模データ(特に画像・音声など)をストリーミング的に読み込む | 表形式データ(構造化データ)の高効率な格納・処理 |
| フォーマット | TARファイルベースのキー・バリュー形式 | 列指向のバイナリ形式(Arrowベース) |
| 主な使用環境 | PyTorch / TensorFlow のデータローダ | Spark / Pandas / DuckDB / Arrow などの分析環境 |
| ストリーミング適性 | ◎(逐次読み込みが容易) | △(全体のメタデータを読む必要あり) |
🧱 WebDatasetとは
WebDataset は,画像・音声・テキストなどの「非構造データ」を
.tar ファイルにまとめ,ストリーミング学習を効率化するフォーマットです.
各サンプルは「キー(例: 00001.jpg, 00001.txt)」に対応し,ファイル拡張子で型を判別します.
例:
data/
shard-000000.tar
shard-000001.tar
各 tar の中には:
00001.jpg
00001.txt
00002.jpg
00002.txt
...
特徴
- 各
.tar(シャード)に数千サンプルを格納 - PyTorch
IterableDatasetから直接ストリーミング可能 - S3 / GCS などリモートストレージからも高速に読み込める
- 巨大データセット(TB級)向けのI/O最適化
使用例
import webdataset as wds
dataset = wds.WebDataset("dataset-{00000..00099}.tar").decode("pil")
for sample in dataset:
img = sample["jpg"]
label = sample["cls"]
🧮 Parquetとは
Parquet は,テーブル構造のデータを「列指向・圧縮」形式で保存するための
分析・機械学習向けフォーマットです(Apache Arrow ベース).
特徴
- 各列を個別に圧縮するため 読み込みが超高速
-
pandas/pyarrow/datasetsで直接読み込み可能 -
input_ids,attention_mask,audio_feat,speaker_idなどを
1ファイルでまとめて扱える
使用例
import pandas as pd
df = pd.read_parquet("train-00001-of-00010.parquet")
print(df.columns)
# => ['utt_id', 'input_ids', 'attention_mask', 'audio_feat', 'speaker_id']
🔄 一般的なパイプライン構成
WebDatasetとParquetは,「競合」ではなく「補完関係」にあります.
| フェーズ | 一般的なフォーマット | 主な目的 |
|---|---|---|
| ① 生データ保管 | WebDataset (.tar) / 個別ファイル (.wav, .txt) | 音声・画像などの非構造データを効率的に格納・配信 |
| ② トークナイズ・特徴抽出後 | Parquet | 構造化データ(トークン列・特徴量・メタ情報)を一括管理 |
| ③ 大規模分散学習時(任意) | WebDataset (.tar) | Parquetから再度tar化し、ストリーミング読み込みを最適化 |
🧠 Moshi-finetuneの設計
nu-dialogue/moshi-finetune(こちら) の場合は,以下のような流れになっています.
-
生データ:音声 (
.wav),テキスト (.txt) -
トークナイズ後:音声特徴 (
audio_feat),テキストトークン (input_ids) -
出力形式:
train-00001-of-00010.parquetなど - 学習:PyArrow / Hugging Face Datasets で Parquet を直接読み込み
→ こちらのMoshiの学習では Parquetのまま学習しています.
CPU前処理をすべて済ませた上で,GPU学習を高速化する設計です.
🚀 一方で,超大規模学習では…
LAION,NeMo,OpenCLIP,Stable Audio などの「数TB規模のデータ」では,
Parquetを中間フォーマットにしたあと,再び WebDataset (tar) に変換して使用しています.
理由
- 分散環境(S3, GCS, Lustreなど)でストリーミングしやすい
- 各ノードがシャード単位でアクセスでき,I/Oがボトルネックになりにくい
- tarを1本ずつ順番に読み出すため,ランダムアクセスより高速
⚖️ 選択基準まとめ
| 観点 | Parquet 向き | WebDataset 向き |
|---|---|---|
| データ型 | トークン列・特徴量・構造化情報 | 音声・画像などの非構造データ |
| データ量 | 数十万〜数百万サンプル | 数百万〜数十億サンプル(TB級) |
| 環境 | ローカル / HPC クラスタ | クラウド / 分散環境(S3, GCS) |
| 処理目的 | 前処理・分析・再利用 | 本番学習・ストリーミング |
| フォーカス | 再現性・効率性 | スループット・スケーラビリティ |
✅ 結論
🎯 生データ(音声・テキスト):WebDataset で保管
🧩 トークナイズ後の構造化データ:Parquet で管理
🚀 大規模分散学習:Parquet をもとに再度 WebDataset 化して学習
つまり,
- Moshi-finetune のような中規模研究 → Parquet のままでOK
- 超大規模ストリーミング学習(LAION系) → WebDataset 化が有利
この2段階構成を理解しておくと,
自分のプロジェクトに最適なデータ形式を選びやすくなるかと思いました.