効率的なデータ読み込みは、モデルトレーニングの速度に直接影響します。以下のベンチマークでは、内部エンドポイントおよび OSS アクセラレータを用いた場合の、3 種類のデータセットアクセス方法 — `OssIterableDataset`、`OssMapDataset`、および `ossfs` と `ImageFolder` を組み合わせた方法 — のスループットを比較しています。テスト結果をもとに、ご使用のトレーニングワークロードに最適なアクセス方法およびエンドポイント構成を選択してください。
データセットタイプの選択
| データセットタイプ | アクセスパターン | 推奨用途 |
|---|---|---|
| OssIterableDataset | 順次ストリーミング | ほとんどのトレーニングワークロード — データセット全体を順序通りに反復処理する場合 |
| OssMapDataset | インデックスによるランダムアクセス | インデックス単位でのシャッフリングや非順次サンプリングを必要とするワークロード |
| ossfs と ImageFolder を組み合わせた方法 | FUSE 経由の POSIX ファイルシステム | ファイルシステム API を必要とするパイプラインで、スループットがやや低いことへの許容が可能な場合 |
テスト概要
テストシナリオ: 内部エンドポイント および アクセラレーテッドエンドポイント を経由したデータセットオブジェクトの読み取り。
テストデータ: 約 1 TB の画像データ(1,000 万枚)、1 枚あたり平均 100 KB。
テスト環境: ネットワーク拡張型汎用 g7nex Elastic Compute Service (ECS) インスタンス(vCPU 128 個、メモリ 512 GB、内部帯域幅 160 Gbit/s)。
データセット作成方法:
`OssIterableDataset` および `OssMapDataset` は、OSS Connector for AI/ML を使用して作成されます。
`ossfs` と `ImageFolder` を組み合わせた方法は、ossfs を使用して作成されます。
パフォーマンステスト
テストパラメーター
すべてのテストで、以下の DataLoader 設定を使用します:
| パラメーター | 値 | 説明 |
|---|---|---|
| DataLoader のバッチサイズ | 256 | 各バッチで 256 サンプルを処理 |
| DataLoader のワーカー数 | 32 | 32 のプロセスで並列にデータを読み込み |
変換パイプラインでは、各画像に対して前処理が適用されます:
trans = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
def transform(object):
img = Image.open(io.BytesIO(object.read())).convert('RGB')
val = trans(img)
return val, object.labelテスト結果
| 作成元 | データセットタイプ | 内部エンドポイント | OSS アクセラレータ |
|---|---|---|---|
| OSS Connector for AI/ML | OssIterableDataset | 4,582 img/s | 4,744 img/s |
| OSS Connector for AI/ML | OssMapDataset | 4,010 img/s | 4,370 img/s |
| ossfs | ossfs と ImageFolder を組み合わせた方法 | 56 img/s | 251 img/s |
最適パフォーマンステスト
これらのテストでは、画像の前処理を含まない純粋な読み取りスループットを測定し、各アクセス方法の I/O パフォーマンスを分離して評価します。
テストパラメーター
DataLoader の設定は上記と同じです。変換関数では画像デコードをスキップし、生のオブジェクトバイトを返します:
def transform(object):
data = object.read()
return object.key, object.labelテスト結果
| 作成元 | データセットタイプ | 内部エンドポイント | OSS アクセラレータ |
|---|---|---|---|
| OSS Connector for AI/ML | OssIterableDataset | 99,920 img/s | 123,043 img/s |
| OSS Connector for AI/ML | OssMapDataset | 56,564 img/s | 78,264 img/s |
パフォーマンスデータの分析
ベンチマーク結果から、以下の 3 つの重要な知見が得られます:
OSS アクセラレータ未使用時で約 80 倍の高速化: OSS アクセラレータをいずれも使用しない場合、`OssIterableDataset` および `OssMapDataset` は、`ossfs` と `ImageFolder` を組み合わせた方法を大幅に上回ります。
OSS アクセラレータ使用時で約 18 倍の高速化: OSS アクセラレータを両方で使用すると差は縮まりますが、OSS コネクタベースのデータセットは依然として大幅な優位性を維持します。
OSS コネクタ for AI/ML に OSS アクセラレータを追加有効化することで、さらに約 1.6 倍の向上: OSS コネクタ for AI/ML に OSS アクセラレータを併用することで、内部エンドポイント単体での性能をさらに上回るスループットが実現できます。
このスループットの差異は、各手法がオブジェクトを読み込む方式に起因します。`ossfs` は POSIX ファイルシステム呼び出しを個別の OSS API リクエストに変換するため、1 枚の画像ごとにネットワーク往復が発生します。一方、`OssIterableDataset` および `OssMapDataset` はストリーム形式でオブジェクトを読み込むため、大量のバッチにわたってリクエストごとのオーバーヘッドを均等に分散でき、テストインスタンスの 160 Gbit/s の内部帯域幅を活かした高い同時実行性を維持できます。
結論
ほとんどのモデルトレーニングワークロードには、内部エンドポイント上で OSS Connector for AI/ML と `OssIterableDataset` を組み合わせた構成をご利用ください。この組み合わせにより、追加設定なしで高いスループットを実現できます。さらにスループットを向上させるには、OSS Connector for AI/ML に OSS アクセラレータを併用してください。両者は相互に連携し、本テストで確認された最高のパフォーマンスを提供します。