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:
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
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.