私はTensorflowを使用していますが、通常はディープラーニングフレームワークによって異なるユーザー向けのドキュメントを作成しています。
ローカルファイルシステム(TB +)に適合しないデータセットを操作するとき、リモートデータストアからデータをサンプリングし、サンプルをローカルでTensorflow標準tfrecords
形式に書き込みます。
トレーニングの最初のエポックの間、私は数個の値をサンプリングしただけなので、ローカルデータのエポックは非常に小さく、それでトレーニングします。上エポック2 Iは、データファイルは、次のエポックのためのローカルデータファイルの拡張セットに私のサンプリングサブプロセス(今より)と電車で製造されていたものを再検討します。エポックごとにプロセスを繰り返します。このようにして、サンプルのローカルキャッシュを構築し、ローカルストレージがいっぱいになると古いサンプルを削除できます。ローカルサンプルキャッシュは、モデルが最も分散を必要とする頃に(トレーニングの後半に向かって)大きくなります。
Python / Tensorflowでは、PythonのGILがデータ転送速度(300-600 MB /秒、データは未処理の科学的な非圧縮性)をサポートできないため、Pythonトレーニングループプロセスでデータをデシリアライズしないことが重要であり、したがってGPUパフォーマンスPython GILがトレーニングループを高速に処理できない場合に問題が発生します。
tfrecords
サブプロセスからサンプルをファイルに書き込む(Pythonマルチプロセッシング)と、テンソルフローのネイティブTFRecordsDataset
がPythonの外部で逆シリアル化を実行できるため、PythonのGILの問題を回避でき、高いIOデータレートでGPUを飽和させることができます。
Pytorchでこの問題にどう対処するか知りたいのですが。使用しているサンプリング戦略について書いていて、TensorflowとPyTorchの両方のユーザーに特定の推奨事項を提供したいのですが、PyTorchの前処理エコシステムについて十分に詳しく説明できません。
補足:これらのデータ転送速度をサポートする唯一の純粋なPythonベースのソリューションは、System V共有メモリとマルチプロセッシングを備えたPython 3.8で提供される可能性がありますが、まだ十分にサポートされていないため、まだ試していません(まもなく)。既存のマルチプロセッシングソリューションは、トレーニングループプロセスでの逆シリアル化を必要とするため、高IOレートでの逆シリアル化中にGILをロックするため、十分ではありません。
DataLoader
私の答えのようにデータが読み込まれる場合、これらの簡単な操作はメインプロセスのGILを要求しません。