web-dev-qa-db-ja.com

Pytorchで同じGPU上のプロセス間でGPUメモリを共有する

Pytorchで同時推論を行う効率的な方法を実装しようとしています。

現在、GPUで2つのプロセスを開始しています(GPUは1つしかありません。両方のプロセスが同じデバイス上にあります)。各プロセスはPytorchモデルをロードし、推論ステップを実行します。

私の問題は、モデルがメモリ上でかなりのスペースを使用することです。 GPUに12Gbのメモリがあり、モデルは約3Gbのメモリのみを使用します(データなし)。つまり、私の2つのプロセスは、モデルだけで6 GBのメモリを消費します。


モデルを1回だけロードして、2つの異なるプロセスの推論にこのモデルを使用することは可能かどうか疑問に思っていました。必要なのは、モデルで消費されるのは3 GBのメモリだけですが、それでも2つのプロセスがあります。


私は遭遇しました この答え IPCについて言及しましたが、理解した限りでは、プロセス#2がプロセス#1からモデルをコピーするため、モデルに割り当てられた6Gbが残ります。

DataParallelとDistributedDataParallelについてPytorchのドキュメントも確認しましたが、それは不可能のようです。

これ は私が望んでいるようですが、推論モードでPytorchを使用する方法のコード例を見つけることができませんでした。


これはトレーニングのためにそのようなことをするのは難しいかもしれないことを理解していますが、私は推論ステップについてのみ話していることに注意してください(モデルは読み取り専用モードであり、勾配を更新する必要はありません)。この仮定では、それが可能かどうかはわかりません。

3
Astariul

GPU自体には多くのスレッドがあります。配列/テンソル操作を実行する場合、配列の1つ以上のセルで各スレッドを使用します。これが、GPUを完全に利用できるopが複数のプロセスなしで効率的にスケーリングする必要があるように見える理由です-単一のGPUカーネルはすでに大規模に並列化されています。

コメントで、小さなベンチマークで複数のプロセスを使用すると、より良い結果が得られると述べました。ウォームアップを確実にするためにより多くのジョブでベンチマークを実行することをお勧めします。10個のカーネルはテストとしては小さすぎるようです。ただし、一貫してより高速に実行できる完全な代表的なベンチマークを見つけている場合は、直感よりも優れたベンチマークを信頼します。

私の理解では、デフォルトのCUDAストリームで起動されたカーネルは順次実行されます。それらを並行して実行したい場合は、複数のストリームが必要になると思います。 PyTorchコードを見ると、カーネルにgetCurrentCUDAStream()のようなコードが表示されます。これにより、GPUは引き続きすべてのプロセスからのPyTorchコードを順次実行すると思います。

このNVIDIAの議論はこれが正しいことを示唆しています:

https://devtalk.nvidia.com/default/topic/1028054/how-to-launch-cuda-kernel-in-different-processes/

新しいGPUは複数のカーネルを並行して(MPIを使用して)実行できる可能性がありますが、いずれにせよ、これは内部でタイムスライシングを使用して実装されているようです。

Nvidiaマルチプロセスサービス(MPS)を使用して複数の非MPI CUDAアプリケーションを実行するにはどうすればよいですか?

2つの並列推論呼び出しで1つのモデルのメモリを共有する必要がある場合、プロセスではなく複数のスレッドを使用して、両方のスレッドから同じモデルを参照できますか?

実際にGPUで複数のカーネルを並行して実行するには、PyTorchでnn.Parallelを使用できる場合があります。ここの議論を参照してください: https://discuss.pytorch.org/t/how-can-l-run-two-blocks-in-parallel/61618/

1
nairbv

データの読み込みとモデルの推論で同時実行を行うことにより、(読み取り専用)推論の単一のプロセスで単一のモデルを使用して同時実行の利点のほとんどを得ることができます。

データの読み込みは、モデルの実行プロセスから分離されています。これは手動で行うことができます。私の知る限り、tensorflowには最適な並列処理のためのいくつかのネイティブサポートがあります data preloading 、例としてそれを調べることができます。

モデル推論は、GPUで自動的に並列化されます。より大きなバッチを使用することで、この同時実行性を最大化できます。

アーキテクチャーの観点からは、複数のユーザーが上位レベルのインターフェースを介してモデルと対話することもできます。

1
THN