1

3 GPUを使用してslim modelをトレーニングしようとしています。TFスリムのinception_v3モデルに複数のGPUを使用

私は、具体的モデルを割り当てるために第2のGPUを使用するようにTFを伝える:

with tf.device('device:GPU:1'): 
    logits, end_points = inception_v3(inputs) 

しかし、私は私のコードを実行しているGPUのたびにOOMエラーを取得しています。私はモデルがメモリに収まるようにbatch_sizeを減らそうとしましたが、ネットは台無しです。

私はGPUSを3つ所有していますので、2番目がいっぱいになったらTFに3番目のGPUを使用するように指示する方法はありますか?私はTFにどんなGPUを使用してもソフトな配置を許可しないようにしてみたが、うまくいきませんでした。

答えて

1

この文with tf.device('device:GPU:1')は、tensorflowに特にGPU-1を使用するように指示しているため、他のデバイスを使用することはありません。

モデルが大きすぎる場合、recommended wayは、グラフを手動で別のGPUに分割することによってモデルの並列性を使用することです。あなたのケースでは、モデル定義がライブラリにあるため、テンソルフローを修正しない限り、異なるレイヤーにtf.deviceステートメントを挿入することはできません。

しかし、あなたは変数を定義して置くことができinception_v3ビルダーを起動する前にこの問題を回避する

があります。このようにしてinception_v3はこれらの変数を再利用し、配置を変更しません。例:

with tf.variable_scope(tf.get_variable_scope(), reuse=tf.AUTO_REUSE): 
    with tf.device('device:GPU:1'): 
    tf.get_variable("InceptionV3/Logits/Conv2d_1c_1x1/biases", shape=[1000]) 
    tf.get_variable("InceptionV3/Logits/Conv2d_1c_1x1/weights", shape=[1, 1, 2048, 1000]) 

    with tf.device('device:GPU:0'): 
    logits, end_points = inception_v3(inputs) 

ランニング時に、あなたはConv2d_1c_1x1層はGPU-1上にある間Conv2d_1c_1x1を除くすべての変数が、GPU-0上に配置されていることがわかります。

欠点は、置き換えたい各変数の形を知る必要があることです。しかし、それは実行可能であり、少なくともあなたのモデルを実行することができます。

関連する問題