non_blocking=Falseの提案はnon_blocking=Trueでなければなりません。tar形式とIterableDatasetに基づいてデータ読み取りを加速するというアイデアが補完されています。 注記
元のドキュメント:https://www.yuque.com/lart/ugkv9f/ugysgn
ステートメント:コンテンツのほとんどは、Zhihuや他のブログで共有することから来ており、ここにはコレクションとしてのみリストされています。もっと提案は大歓迎です。
Zhihuの回答(いいねへようこそ):
resizeなどの固定操作を使用して事前に保存し、トレーニング中に直接使用することを検討できます。NVIDIA/DALIを使用できます。opencv一般にPILよりも高速です。PILの怠zyなロード戦略により、 opencvのimreadよりもopen見えるようになりますが、実際にはデータを完全にロードしないことに注意してください。オブジェクトで返されたオブジェクトのload()メソッドを、 openでロードデータに呼び出すことができます。現時点では速度が妥当です。jpeg読み取りについては、 jpeg4pyを試すことができます。bmpグラフを保存します(デコード時間を短縮します)。大規模な小さなファイルの測定値の場合、継続的に読み取ることができる連続ファイル形式として保存できます。 TFRecord (Tensorflow) 、 recordIO 、 hdf5 、 pth 、 n5 、 lmdbなどを考慮することを選択できます。
TFRecord :https://github.com/vahidk/tfrecordlmdbデータベース:TarファイルとIterableDatasetに基づく実装次の反復に必要なデータを事前読み取りします。ユースケース:
--cache 。機械的なハードディスクは、NVMEソリッドステートに置き換えられます。 PytorchのDataloaderで鶏の血を与える方法を参照してください-Mkfmikuの記事-Zhihu
トレーニングでは、元の精度( FP32 )表現の代わりに、低精度( FP16またはINT8 、バイナリネットワーク、および3価値ネットワーク)表現が使用されます。
一定量のビデオメモリを節約してスピードアップできますが、平均や合計などの安全でない操作には注意してください。
NVIDIA/Apexが提供する混合精度サポート。torch.cuda.amp提供を開始します。 バッチが大きいと、固定されたエポックの場合、トレーニング時間が短くなる傾向があります。ただし、大きなバッチは、ハイパーパラメーターの設定やメモリの使用量など、多くの考慮事項に直面しています。これは、多くの注目を集めている別の領域です。
torch.backends.cudnn.benchmark = Trueトレーニングループが計算を高速化できるように設定します。さまざまなカーネルサイズの畳み込みを計算するCudnnアルゴリズムのパフォーマンスは異なるため、オートターナーはベンチマークを実行して最適なアルゴリズムを見つけることができます。入力サイズが頻繁に変更されない場合、この設定を有効にすることをお勧めします。入力サイズが頻繁に変更された場合、オートツナはあまりにも頻繁にベンチマークする必要があり、パフォーマンスを損なう可能性があります。前方および後方の伝播速度を1.27倍から1.70倍にすることができます。pin_memory=Trueを設定します。num_workerについては、詳細な議論はPytorch Speedupガイド-Yunmengの記事-Zhihuに記載されています。set_to_none=Trueを設定し、パフォーマンスを適度に改善することでmemsetフットプリントを減らすことができます。しかし、これはドキュメントに表示される動作も変更します。Memsetは、 memset model.zero_grad()またはNone optimizer.zero_grad()の設定ではありません。したがって、勾配None 「書き込みのみ」操作を使用して更新されます。evalモードを使用し、 torch.no_gradを使用して勾配計算をオフにします。DataParallel DistributedDataParallelに置き換えます。マルチGPUの場合、単一のノードのみがDataParallel場合でも、 DistributedDataParallel複数のプロセスに適用され、各GPUに1つを作成し、Pythonグローバルインタープリターロック(GIL)をバイパスし、速度を上げて速度を上げて、 DistributedDataParallel常に優先されます。 forward個別であるため、未使用の変数を初期化しないでください。使用しないために初期化されません。@torch.jit.script 、pytroch jitを使用して、ポイントバイポイント操作を単一のcudaカーネルに融合させます。 Pytorchは、大きな寸法のテンソルの動作を最適化します。 Pytorchの小さなテンソルであまりにも多くの操作を行うことは非常に非効率的です。そのため、可能であれば、すべての計算操作をバッチに書き換えると、消費を削減し、パフォーマンスを向上させることができます。バッチ操作を手動で実装できない場合は、Torchscriptを使用してコードのパフォーマンスを改善できます。 TorchscriptはPython関数のサブセットですが、PytorchがPytorchによって検証された後、PytorchはTorchscriptコードを自動的に最適化して、Just In Time(JTT)コンパイラを通じてパフォーマンスを改善できます。しかし、より良いアプローチは、バッチ操作を手動で実装することです。delを使用して、メモリフットプリントを解放します。torch.from_numpy(ndarray)またはtorch.as_tensor(data, dtype=None, device=None)を使用して、メモリを共有することでスペースの再適用を避けます。詳細と注意事項については、対応するドキュメントを参照してください。ソースおよびターゲットデバイスがCPUの場合、 torch.from_numpyおよびtorch.as_tensorデータをコピーしません。ソースデータがnumpy配列の場合、 torch.from_numpyを使用してください。ソースデータが同じデータタイプとデバイスタイプを持つテンソルである場合、 torch.as_tensor 、Pythonのリスト、タプル、またはテンソルであるデータのコピーを避けることができます。non_blocking=Trueを設定します。これにより、可能であれば非同期変換が試みます。たとえば、ページロックメモリのCPUテンソルをCUDAテンソルに変換します。optimizer.step()の時間を短縮します。contiguous_pytorch_paramsmemory access costの略語はMACです)は最小で、モデル速度は現時点で最も速いですelement-wise操作を減らす: element-wise操作によってもたらされる時間消費は、フロップに反映される値よりもはるかに大きいため、 element-wise操作を可能な限り最小限に抑える必要があります。 depthwise convolution低フロップと高MACの特性もあります。 推論において、低精度( FP16またはINT8 、バイナリネットワーク、3価値ネットワーク)表現を使用して、元の精度( FP32 )表現を置き換えます。
TensorRTは、Nvidiaが提案するニューラルネットワーク推論エンジンであり、トレーニング後の8ビット量子化をサポートしています。エントロピーベースのモデル量子化アルゴリズムを使用して、2つの分布間の違いの程度を最小限に抑えます。Distiller Pytorchに基づいたオープンソースモデルの最適化ツールであり、Pytorchの定量技術を自然にサポートしています。NNI 、さまざまな定量的認識トレーニングアルゴリズムを統合し、 PyTorch/TensorFlow/MXNet/Caffe2詳細については、3つのAIを参照してください。[その他の話]現在のモデルの定量化に利用できるオープンソースツールは何ですか?
profile 、 cProfile 、 hotshot付属しています。使用方法は基本的に同じです。モジュールが純粋なPythonであるか、Cで書かれているかにすぎません。元のドキュメント:https://www.yuque.com/lart/ugkv9f/nvffyf
収集:Pytorchでメモリ(ビデオメモリ)を保存するためのヒントは何ですか? -Zhihu https://www.zhihu.com/question/274635237
inplaceサポートする操作を有効にするようにしてください。たとえば、 relu inplace=True使用できます。batchnormおよびいくつかの特定のアクティベーション関数は、 inplace_abnにパッケージ化できます。各ループの端で損失を削除すると、ビデオメモリはほとんど保存できませんが、何もないよりはましです。変数へのテンソルとメモリは、ベストプラクティスを解放します
一定量のビデオメモリを節約してスピードアップできますが、平均や合計などの安全でない操作には注意してください。
NVIDIA/Apexが提供する混合精度サポート。torch.cuda.amp提供を開始します。torch.no_gradを使用してコードをラップします。model.eval() torch.no_grad()に等しくないことに注意してください。次の説明を参照してください。 'model.eval()' vs 'with torch.no_grad()'Falseに計算する必要のない変数のrequires_gradを設定します。torch.cuda.empty_cache()は、 delの高度なバージョンです。 nvidia-smiを使用すると、ビデオメモリには明らかな変更があることがわかります。ただし、トレーニング中の最大ビデオメモリの使用は変わらないようです。試してみることができます:GPUメモリキャッシュをどのようにリリースできますか?delを使用して、不要な中間変数を削除するか、 replacing variables形式を使用して占有率を減らすことができます。batchsize=64 32の2つのバッチに分割し、2回転送した後、1回後方になります。ただし、 batchnormやbatchsizeに関連する他のレイヤーに影響します。
Pytorchの文書では、勾配の蓄積と混合精度を使用する例が言及されています。
勾配蓄積技術を使用して分散トレーニングを加速します。これは、[オリジナル] [ディープ] [Pytorch] DDPシリーズ3:実用的およびスキル-996ゴールデンジェネレーション-Zhihuを参照するために使用できます。
torch.utils.checkpointはPytorchで提供されています。これは、バックプロパゲーション中に各チェックポイントの場所で前方の伝播を再実行することによって達成されます。
サブリンメモリコストを備えたペーパートレーニングディープネットは、勾配チェックポイントテクノロジーに基づいて、ビデオメモリをO(n)からO(SQRT(n))に削減します。より深いモデルの場合、この方法が保存するメモリが増え、大幅に遅くなりません。
ドキュメントの関連する章に従うことができます。
非決定的アルゴリズムの使用は避けてください。
pytorchでは、 torch.use_deterministic_algorithms()は、非決定論的アルゴリズムの代わりに決定論的アルゴリズムの使用を強制することができ、操作が非決定論的なものであることが知られている場合(および決定論的な代替品がない)場合、エラーがスローされます。
def seed_torch ( seed = 1029 ):
random . seed ( seed )
os . environ [ 'PYTHONHASHSEED' ] = str ( seed )
np . random . seed ( seed )
torch . manual_seed ( seed )
torch . cuda . manual_seed ( seed )
torch . cuda . manual_seed_all ( seed ) # if you are using multi-GPU.
torch . backends . cudnn . benchmark = False
torch . backends . cudnn . deterministic = True
seed_torch ()https://www.zdaiot.com/mlframeworks/pytorch/pytorch%E9%9A%8F%E6からの参照
具体的な詳細は、95%の人々がまだPytorchの間違いを犯していることを示しています - Serendipityの記事-Zhihu
ソリューションについては、ドキュメントを参照してください。
def seed_worker ( worker_id ):
worker_seed = torch . initial_seed () % 2 ** 32
numpy . random . seed ( worker_seed )
random . seed ( worker_seed )
DataLoader (..., worker_init_fn = seed_worker )