ホームへ戻る

GitHub Repo

PyTorchコミュニティがデータ読み込みの性能低下を報告、バックグラウンドスレッドがCUDAトレーニングを遅らせる可能性

10月24日のPyTorchコミュニティからの報告によると、同一プロセス内のバックグラウンドスレッドが大きなDataLoaderバッチを受け取ると、特定のCUDAトレーニングテストが大幅に遅くなる。報告にはバージョンをまたいだ測定結果と再現コードが含まれるが、根本原因、影響範囲、修正バージョンはまだ確認されていない。

Pytorch Deepdream (https://github.com/gordicaleksa/pytorch-deepdream) by gordicaleksa (https://github.com/gordicaleksa/pytorch-deepdream/commits?author=gordicaleksa) · MIT · Image source
zh-Hant

PyTorchユーザーは10月24日、2.10.0以降、同一プロセス内でバックグラウンドスレッドがDataLoaderの大きなバッチを継続的に受け取ると、CUDAトレーニングループに大きな影響が出る可能性があるとして、性能問題を報告した。再現コードを添えたコミュニティからの報告であり、確認時点ではIssueはオープンのままで、メンテナーによる根本原因の特定や正式な修正は行われていない。Issue報告

再現コードでは、メインスレッドで小規模な畳み込みニューラルネットワークを学習させ、バックグラウンドスレッドでは8つのデータ読み込みワーカープロセスから送られる画像バッチを受け取り、受信後にそのまま破棄する。報告者のRTX PRO 6000 Blackwellでは、1ステップあたりの時間は2.9.1で約8.83ミリ秒、2.10.0で約428ミリ秒だった。バックグラウンドでの読み込みを無効にすると、どちらのバージョンも約8.4ミリ秒だった。この比較から、データ読み込みと計算を同時に行う経路を調査する価値はあるが、根本的な原因を特定するには至らない。テストコードと測定値

極端なテストでの倍率を、そのまま実際のトレーニングに当てはめることはできない。報告に含まれるYOLOのワークロードでは、1ステップあたりの時間は約73~75ミリ秒から80~85ミリ秒に増えており、差はより小さい。また報告者は、詳細なレポートは自身のマシンでの測定結果を基にClaude Codeが作成したと明記している。そのため、これらの数値は他の環境で独立に再現する必要がある。測定方法の説明

公式ドキュメントによると、num_workersはデータ読み込みに使うサブプロセスの数を指定し、0に設定するとデータはメインプロセスで読み込まれる。pin_memory=Trueはテンソルをページロックメモリに格納し、CUDA GPUへの転送を高速化する。これらは異なる処理段階を制御するため、エンジニアリングチームが原因を調査する際は、ワーカープロセス数、バッチサイズ、メモリのピン留め設定を個別に測定し、GPU使用率だけからボトルネックを判断しないことが望ましい。DataLoaderドキュメント

最近のアップグレード後にスループットが低下したチームにとって、この報告は比較テストを始める手がかりになる。モデル、ドライバー、データの条件を固定したうえで、計算のみの場合と入力パイプライン全体を含めた場合のステップあたりのレイテンシを比較するとよい。今後は、メンテナーが原因となった変更を特定できるか、また修正によってマイクロベンチマークと実際のトレーニングの両方が改善するかが注目される。

出典

  1. CUDA training loop runs ~50x slower while a DataLoader iterates in a background thread, since 2.10.0
  2. torch.utils.data — PyTorch 2.14 documentation