2016-01-17 14 views
16

Mam 3 procesory GPU GTX Titan w moim komputerze. I uruchomić przykład przewidzianej w Cifar10 z cifar10_train.py i uzyskałem następujący wynik:Czy TensorFlow domyślnie używa wszystkich dostępnych procesorów graficznych w urządzeniu?

I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot enable peer access from device ordinal 0 to device ordinal 1 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot enable peer access from device ordinal 1 to device ordinal 0 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:127] DMA: 0 1 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 0: Y N 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 1: N Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:694] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX TITAN, pci bus id: 0000:03:00.0) 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:694] Creating TensorFlow device (/gpu:1) -> (device: 1, name: GeForce GTX TITAN, pci bus id: 0000:84:00.0) 

Wydaje mi się, że TensorFlow próbuje zainicjować się na dwóch urządzeniach (gpu0 i gpu1).

Moje pytanie brzmi: dlaczego robi to tylko na dwóch urządzeniach i czy istnieje sposób, aby temu zapobiec? (Chcę tylko go uruchomić, jak gdyby nie jest pojedynczym GPU)

+1

Znaleziony [Dowolny sposób zmusić TF nie zajmują całych zasobów? (dotyczące multi-gpu)] (https://groups.google.com/a/tensorflow.org/forum/#!searchin/discuss/gpu/discuss/QmMqfikKxlU/BC5P4XrDEgAJ) prowadzące do [CUDA_VISIBLE_DEVICES - Maskowanie GPU] (http : //acceleware.com/blog/cudavisibledevices-masking-gpus) –

+0

To naprawdę pomaga. Ale dlaczego TensorFlow automatycznie zainicjowałby wszystkie urządzenia w maszynie? Przy okazji utwórz odpowiedź, którą przyjmuję. – Zk1001

+0

TensorFlow ma na celu "badania do produkcji". Wydaje się, że domyślnie używa się całej mocy obliczeniowej, spełniającej oczekiwania, aby zadanie zostało wykonane jak najszybciej. Świetnie, że można to dostroić. Wspomniałeś jednak o 3 procesorach graficznych i tylko 2 pokazują w twoich dziennikach. Dlaczego to? –

Odpowiedz

19

Patrz: Using GPUs

Ręczne urządzenie placement

Jeśli chcesz konkretnej operacji, aby uruchomić na urządzeniu do wyboru zamiast tego, co jest automatycznie wybierane dla ciebie, możesz użyć z tf.device, aby utworzyć kontekst urządzenia tak, aby wszystkie operacje w tym kontekście miały przypisanie tego samego urządzenia.

# Creates a graph. 
with tf.device('/cpu:0'): 
  a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a') 
  b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b') 
c = tf.matmul(a, b) 
# Creates a session with log_device_placement set to True. 
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) 
# Runs the op. 
print(sess.run(c)) 

Zobaczysz, że teraz a i b są przypisane do cpu:0. Ponieważ urządzenie nie zostało jawnie określone dla operacji MatMul, środowisko wykonawcze TensorFlow wybierze jeden w oparciu o operację i dostępne urządzenia (gpu: 0 w tym przykładzie) i automatycznie skopiuje tensory między urządzeniami, jeśli jest to wymagane.

Device mapping: 
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: Tesla K40c, pci bus 
id: 0000:05:00.0 
b: /job:localhost/replica:0/task:0/cpu:0 
a: /job:localhost/replica:0/task:0/cpu:0 
MatMul: /job:localhost/replica:0/task:0/gpu:0 
[[ 22.  28.] 
 [ 49.  64.]] 

Wcześniej Odpowiedź 2.

zobacz: Using GPUs

Korzystanie z pojedynczego GPU w systemie multi-GPU

Jeśli masz więcej niż jedno GPU w twojej system, GPU z najniższym identyfikatorem zostanie wybrane domyślnie. Jeśli chcesz uruchomić na innym GPU, trzeba będzie określić preferencje wyraźnie:

# Creates a graph. 
with tf.device('/gpu:2'): 
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a') 
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b') 
    c = tf.matmul(a, b) 
# Creates a session with log_device_placement set to True. 
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) 
# Runs the op. 
print sess.run(c) 

Wcześniej Odpowiedź 1.

Od CUDA_VISIBLE_DEVICES – Masking GPUs

Czy aplikacji CUDA trzeba kierować na konkretny procesor graficzny? Jeśli jesteś pisząc kod z obsługą GPU, zwykle używałbyś zapytania urządzenia do , wybierając pożądane GPU. Jednak szybkie i łatwe rozwiązanie do testowania polega na użyciu zmiennej środowiskowej CUDA_VISIBLE_DEVICES do ograniczenia urządzeń, które widzi aplikacja CUDA. Może to być przydatne, gdy próbujesz udostępnić zasoby w węźle lub chcesz, aby Twój plik wykonywalny GPU był dostępny dla określonego procesora GPU.

zmienną Składnia

Wyniki

CUDA_VISIBLE_DEVICES = 1 Tylko 1 urządzenie będzie widoczne CUDA_VISIBLE_DEVICES = 0,1 Devices 0 i 1 będzie widoczna CUDA_VISIBLE_DEVICES =”0.1” Tak samo jak wyżej, cudzysłowy są opcjonalne CUDA_VISIBLE_DEVICES = 0,2,3 Urządzenia 0, 2, 3 będą widoczne; urządzenie 1 jest zamaskowane

CUDA wyliczy widoczne urządzenia zaczynające się od zera. W ostatniej obudowie urządzenia 0, 2, 3 będą wyświetlane jako urządzenia 0, 1, 2. Jeśli zmienisz kolejność łańcucha na "2,3,0", urządzenia 2,3,0 będą oznaczone jako odpowiednio 0,1,2. Jeśli CUDA_VISIBLE_DEVICES jest ustawione na urządzenie, które nie istnieje, wszystkie urządzenia zostaną zamaskowane. Możesz określić kombinację poprawnych i nieprawidłowych numerów urządzeń: . Wszystkie urządzenia przed nieprawidłową wartością zostaną wyliczone, a wszystkie urządzenia po niepoprawnej wartości zostaną zamaskowane na .

Aby określić identyfikator urządzenia dla dostępnego sprzętu w systemie, można uruchomić plik wykonywalny NVIDIA deviceQuery zawarty w zestawie SDK CUDA. Happy programowanie!

Chris Mason

+0

Zrobiłem dokładnie to samo. Ale wtedy, gdy zrobiłem '' 'nvidia-smi''' widziałem taką samą ilość pamięci ze wszystkich urządzeń gpu. –

+0

Informacje powiązane z tensorflow gpu są stare/uszkodzone; zamiast tego (od 2017/10) spróbuj: https://www.tensorflow.org/tutorials/using_gpu – michael

+0

@Michael Dzięki. Zaktualizowana odpowiedź. –