GPUを使用して(かなり大きな)ニューラルネットワークを訓練しようとしています。ネットワークはpytorchで書かれています。私は、ubuntu 16.04で動作するpython 3.6.3を使用します。現在のところ、コードは実行されていますが、CPUを使用したデータ取得プロセスがGPUを使用したトレーニングプロセスと直列に実行されるため、実行する必要がある時間は約2倍です。基本的には、ミニバッチジェネレータを使用してファイルからミニバッチを取得し、そのミニバッチをGPUに送信し、そのミニバッチでネットワークをトレーニングします。私は2つのプロセス(ミニバッチをつかんで、そのミニバッチを訓練)を計時しました。そして、それらはどれくらいの時間がかかります(どちらも約200msかかる)。私はkerasのfit_generatorメソッドと同様に、トレーニングと並行してデータ取得を実行したいと考えています(GPUがそのミニバッチを訓練したいときにGPUに送ることができるminibatchのキューを作成します)。それをする最善の方法は何ですか?具体的には、私のデータジェネレータコードとトレーニングコードは、次のようなコードを実行します(擬似コード)。CPUとGPUを並列に実行して神経ネットワークをより速くトレーニングする方法
#This generator opens a file, grabs and yields a mini batch
def data_gen(PATH,batch_size=32):
with h5py.File(PATH,'r') as f:
for mini-batch in mini-batches:
X = f['X'][mini-batch]
Y = f['Y'][mini-batch]
yield (X,Y)
for epoch in range(epochs):
for data in data_gen(PATH):
mini_X,mini_Y = data
mini_X = autograd.Variable(torch.Tensor(mini_X))
mini_Y = autograd.Variable(torch.Tensor(mini_Y))
out = net(mini_X)
loss = F.binary_cross_entropy(out,mini_Y)
loss.backward()
optimizer.step()
そういうものです。ご覧のように、私はfor-loopの実際のジェネレータとしてdata_genを使用していますので、トレーニングで順番に実行されています。私はそれを並行して実行したいと思うし、私のネットワークに送ることができるminibatchのqueを生成させたい。現在、1エポックを実行するには5時間以上かかりますが、これを並列化したバージョンでは3時間以下にすることができます。私はPython上でマルチプロセッシングを調べましたが、公式ドキュメントの説明は、並列コンピューティングの経験が限られていたため、私にとっては少し高密度でした。私が見ることができるいくつかのリソースがある場合、それらのリソースに向かって私を指しても非常に役立つだろう!ありがとう。
本当に、この全体的な質問は次のように簡素化されています:どのプロセスがCPU集約型で、GPU上で計算されるような他のプロセスでもない、並行プロセスをPythonでどのように管理できますか?ありがとうございます、私はそれを調べます。https://stackoverflow.com/q/2846653/4013571 –
私はtorch.multiprocessingモジュールを見つけて昨日試してみましたが、私はGPUでメモリエラーに陥っています。 – enumaris