1

3 GPU를 사용하여 slim model을 훈련시키고 있습니다.TF 슬림의 inception_v3 모델에 여러 개의 GPU 사용

내가 특별히 모델을 할당하는 두 번째 GPU를 사용하는 TF를 말하는이 :

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

그러나, 나는 내 코드를 실행하는 GPU 매번상의 OOM 오류를 받고 있어요. 모델이 메모리에 맞도록 batch_size를 줄이려고했지만 그물은 망가졌습니다.

제가 GPUS를 3 개 가지고 있기 때문에, TF가 제 3의 GPU를 사용할 때 제 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에 배치되는 것을 확인할 수 있습니다.

단점은 대체하려는 각 변수의 모양을 알아야한다는 것입니다. 그러나 그것은 실행 가능하며 최소한 모델을 실행시킬 수 있습니다.