Czy TensorFlow domyślnie używa wszystkich dostępnych procesorów graficznych na komputerze?

Mam 3 GTX Titan GPU w mojej maszynie. Uruchamiam przykład podany w Cifar10 z cifar10_train.py i otrzymałem następujące wyjście:

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)

Wygląda na to, ż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 jest jakiś sposób, aby temu zapobiec? (Chcę tylko, aby działał tak, jakby był pojedynczy GPU)

Author: Zk1001, 2016-01-17

1 answers

Zobacz: Korzystanie Z GPU

Ręczne umieszczanie urządzeń

Jeśli chcesz, aby określona operacja została uruchomiona na wybranym urządzeniu zamiast tego, co jest automatycznie wybrane dla ciebie, możesz użyć tf.device, aby utworzyć kontekst urządzenia tak, że wszystkie operacje w tym kontekście będą miały to samo przypisanie 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 jednoznacznie określone dla operacji MatMul, Środowisko uruchomieniowe TensorFlow wybierze jeden na podstawie operacji i dostępnych urządzeń (gpu:0 w tym przykładzie) i automatycznie skopiuje tensory między urządzeniami w razie potrzeby.

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śniejsza Odpowiedź 2.

Zobacz: Korzystanie Z GPU

Korzystanie z jednego GPU w systemie multi-GPU

Jeśli masz więcej niż jeden procesor graficzny w systemie, procesor graficzny o najniższym identyfikatorze zostanie wybrany domyślnie. Jeśli chcesz uruchomić na innym GPU, musisz określić preferencje:

# 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śniejsza Odpowiedź 1.

Z CUDA_VISIBLE_DEVICES-maskowanie GPU

Czy Twoja aplikacja CUDA musi kierować konkretny procesor graficzny? Jeśli jesteś pisząc kod z obsługą GPU, zwykle używasz zapytania urządzenia do wybierz żądany procesor graficzny. Jednak szybkie i łatwe rozwiązanie dla testowanie polega na użyciu zmiennej środowiskowej CUDA_VISIBLE_DEVICES do ogranicz urządzenia, które widzi Twoja aplikacja CUDA. Może to być przydatne, jeśli próbujesz udostępnić zasoby na węźle lub chcesz Twój procesor GPU włączył plik wykonywalny do kierowania określonego procesora GPU.

Składnia Zmiennej Środowiskowej

Wyniki

CUDA_VISIBLE_DEVICES=1 będzie widoczne tylko urządzenie 1 CUDA_VISIBLE_DEVICES = 0,1 urządzenia 0 i 1 będą widoczne 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 is masked

CUDA wyliczy widoczne urządzenia zaczynając od zera. W ostatnim case, urządzenia 0, 2, 3 pojawią się jako urządzenia 0, 1, 2. Jeśli zmienisz kolejność ciągu do "2,3,0", urządzenia 2,3,0 będą wyliczane odpowiednio 0,1,2. Jeśli CUDA_VISIBLE_DEVICES jest ustawione na urządzenie, które nie istnieje, wszystkie urządzenia zostaną zamaskowane. Można określić mieszankę prawidłowe i nieprawidłowe numery urządzeń. Wszystkie urządzenia przed nieprawidłową wartością zostaną wyliczone, natomiast wszystkie urządzenia po nieprawidłowej wartości będą zamaskowany.

Aby określić identyfikator urządzenia dla dostępnego sprzętu w systemie, możesz uruchomić program wykonywalny deviceQuery firmy NVIDIA zawarty w CUDA SDK. Miłego programowania!

Chris Mason]}
 20
Author: Guy Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-29 09:35:36