web-dev-qa-db-fra.com

qu'est-ce que Device Interconnect StreamExecutor avec la force 1 matrice Edge

J'ai quatre cartes graphiques NVIDIA GTX 1080 et lorsque j'initialise une session, je vois la sortie de console suivante:

Adding visible gpu devices: 0, 1, 2, 3
 Device interconnect StreamExecutor with strength 1 Edge matrix:
      0 1 2 3 
 0:   N Y N N 
 1:   Y N N N 
 2:   N N N Y 
 3:   N N Y N 

Et aussi, j'ai 2 cartes graphiques NVIDIA M60 Tesla et l'initialisation ressemble à:

Adding visible gpu devices: 0, 1, 2, 3
 Device interconnect StreamExecutor with strength 1 Edge matrix:
      0 1 2 3 
 0:   N N N N 
 1:   N N N N 
 2:   N N N N 
 3:   N N N N 

Et j'ai remarqué que cette sortie a été modifiée pour moi depuis la dernière mise à jour de 1.6 à 1.8 pour 1080 gpu. Cela ressemblait à quelque chose comme ça (je ne me souviens pas précisément, juste des souvenirs):

 Adding visible gpu devices: 0, 1, 2, 3
Device interconnect StreamExecutor with strength 1 Edge matrix:
     0 1 2 3            0 1 2 3
0:   Y N N N         0: N N Y N
1:   N Y N N    or   1: N N N Y
2:   N N Y N         2: Y N N N
3:   N N N Y         3: N Y N N

Mes questions sont:

  • qu'est-ce que c'est interconnexion de l'appareil?
  • quelle influence cela a-t-il sur la puissance de calcul?
  • pourquoi il diffère pour différents GPU?
  • peut-il évoluer dans le temps pour des raisons matérielles (pannes, incohérence des drivers ...)?
18
Ivan Talalaev

TL; DR

quelle est cette interconnexion de périphérique?

Comme l'a déclaré Almog David dans les commentaires, cela vous indique si un GPU a un accès direct à la mémoire de l'autre.

quelle influence cela a-t-il sur la puissance de calcul?

Le seul effet que cela a est pour la formation multi-GPU. Le transfert de données est plus rapide si les deux GPU ont une interconnexion d'appareils.

pourquoi il diffère pour différents GPU?

Cela dépend de la topologie de la configuration matérielle. Une carte mère ne possède que de nombreux emplacements PCI-e connectés par le même bus. (vérifiez la topologie avec nvidia-smi topo -m)

peut-il évoluer dans le temps pour des raisons matérielles (pannes, incohérence des drivers ...)?

Je ne pense pas que l'ordre puisse changer avec le temps, à moins que NVIDIA ne modifie le schéma d'énumération par défaut. Il y a un peu plus de détails ici

Explication

Ce message est généré dans le BaseGPUDeviceFactory::CreateDevices fonction. Il parcourt chaque paire d'appareils dans l'ordre donné et appelle cuDeviceCanAccessPeer . Comme mentionné par Almog David dit dans les commentaires, cela indique simplement si vous pouvez effectuer DMA entre les appareils.

Vous pouvez effectuer un petit test pour vérifier que la commande est importante. Considérez l'extrait de code suivant:

#test.py
import tensorflow as tf

#allow growth to take up minimal resources
config = tf.ConfigProto()
config.gpu_options.allow_growth = True

sess = tf.Session(config=config)

Vérifions maintenant la sortie avec un ordre d'appareil différent dans CUDA_VISIBLE_DEVICES

$ CUDA_VISIBLE_DEVICES=0,1,2,3 python3 test.py
...
2019-03-26 15:26:16.111423: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1511] Adding visible gpu devices: 0, 1, 2, 3
2019-03-26 15:26:18.635894: I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] Device interconnect StreamExecutor with strength 1 Edge matrix:
2019-03-26 15:26:18.635965: I tensorflow/core/common_runtime/gpu/gpu_device.cc:988]      0 1 2 3 
2019-03-26 15:26:18.635974: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 0:   N Y N N 
2019-03-26 15:26:18.635982: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 1:   Y N N N 
2019-03-26 15:26:18.635987: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 2:   N N N Y 
2019-03-26 15:26:18.636010: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 3:   N N Y N 
...

$ CUDA_VISIBLE_DEVICES=2,0,1,3 python3 test.py
...
2019-03-26 15:26:30.090493: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1511] Adding visible gpu devices: 0, 1, 2, 3
2019-03-26 15:26:32.758272: I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] Device interconnect StreamExecutor with strength 1 Edge matrix:
2019-03-26 15:26:32.758349: I tensorflow/core/common_runtime/gpu/gpu_device.cc:988]      0 1 2 3 
2019-03-26 15:26:32.758358: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 0:   N N N Y 
2019-03-26 15:26:32.758364: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 1:   N N Y N 
2019-03-26 15:26:32.758389: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 2:   N Y N N 
2019-03-26 15:26:32.758412: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 3:   Y N N N
...

Vous pouvez obtenir une explication plus détaillée des connexions en exécutant nvidia-smi topo -m. Par exemple:

       GPU0      GPU1    GPU2   GPU3    CPU Affinity
GPU0     X       PHB    SYS     SYS     0-7,16-23
GPU1    PHB       X     SYS     SYS     0-7,16-23
GPU2    SYS      SYS     X      PHB     8-15,24-31
GPU3    SYS      SYS    PHB      X      8-15,24-31

Legend:

  X    = Self
  SYS  = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)
  NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node
  PHB  = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)
  PXB  = Connection traversing multiple PCIe switches (without traversing the PCIe Host Bridge)
  PIX  = Connection traversing a single PCIe switch
  NV#  = Connection traversing a bonded set of # NVLinks

Je pense que plus vous descendez sur la liste, plus le transfert est rapide.

6
McAngus