2017-12-11 16 views
0

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上でマルチプロセッシングを調べましたが、公式ドキュメントの説明は、並列コンピューティングの経験が限られていたため、私にとっては少し高密度でした。私が見ることができるいくつかのリソースがある場合、それらのリソースに向かって私を指しても非常に役立つだろう!ありがとう。

+0

本当に、この全体的な質問は次のように簡素化されています:どのプロセスがCPU集約型で、GPU上で計算されるような他のプロセスでもない、並行プロセスをPythonでどのように管理できますか?ありがとうございます、私はそれを調べます。https://stackoverflow.com/q/2846653/4013571 –

+0

私はtorch.multiprocessingモジュールを見つけて昨日試してみましたが、私はGPUでメモリエラーに陥っています。 – enumaris

答えて

0

データ生成にスレッドを使用する必要があります。この考えは、あなたのGPUがトレーニングをしている間に、CPUにデータ生成(通常はロード)をさせることです。それは、物事を減速させるのはCPUではないという。これは、ファイルの常時読み書きです。データセットを使用している場合は、ファイルシステム上の連続したブロックにファイルがコピーまたは抽出されていることを確認してください。ファイルがハードドライブ全体で最適化されている場合は、使用しているマルチスレッドメカニズムに関係なく、ファイルをロードすることはボトルネックになります。 SSDハードドライブでは目立たない。

+0

右のファイルはSSDには大きすぎます(私はこのような大きなSSD hehを買う余裕はありません)が、私はベンチマークでミニバッチをつかんでいました。バッチ(どちらもそれぞれ約200msです)。私の神経網がはるかに小さかった場合、負荷データ部分がボトルネックになります。つまり、私はマルチスレッドの経験がほとんどないので、このプロセスをマルチスレッドする最良の方法は何かを考えていました。 – enumaris

+0

今スレッドを心配する必要はありません。 pyrotchが提供するデータローダーを使用することができます。データローダがスレッドを処理します。私の答えをhttps://stackoverflow.com/a/45118712/7387369で確認してください –

関連する問題