web-dev-qa-db-fra.com

Comment interpréter la sortie TensorFlow?

Comment interpréter la sortie TensorFlow pour créer et exécuter des graphiques de calcul sur des GPGPU?

Étant donné la commande suivante qui exécute un script tensorflow arbitraire à l'aide de l'API python.

python3 tensorflow_test.py> out

La première partie stream_executor ressemble à ses dépendances de chargement.

I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcurand.so locally

Qu'est-ce qu'un nœud NUMA?

I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:900] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero

Je suppose que c'est quand il trouve le GPU disponible

I tensorflow/core/common_runtime/gpu/gpu_init.cc:102] Found device 0 with properties: 
name: Tesla K40c
major: 3 minor: 5 memoryClockRate (GHz) 0.745
pciBusID 0000:01:00.0
Total memory: 11.25GiB
Free memory: 11.15GiB

Une initialisation GPU? qu'est-ce que le DMA?

I tensorflow/core/common_runtime/gpu/gpu_init.cc:126] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:136] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:755] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla K40c, pci bus id: 0000:01:00.0)

Pourquoi lance-t-il une erreur E?

E tensorflow/stream_executor/cuda/cuda_driver.cc:932] failed to allocate 11.15G (11976531968 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY

Excellente réponse à ce que le pool_allocator fait: https://stackoverflow.com/a/35166985/4233809

I tensorflow/core/common_runtime/gpu/pool_allocator.cc:244] PoolAllocator: After 3160 get requests, put_count=2958 evicted_count=1000 eviction_rate=0.338066 and unsatisfied allocation rate=0.412025
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:256] Raising pool_size_limit_ from 100 to 110
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:244] PoolAllocator: After 1743 get requests, put_count=1970 evicted_count=1000 eviction_rate=0.507614 and unsatisfied allocation rate=0.456684
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:256] Raising pool_size_limit_ from 256 to 281
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:244] PoolAllocator: After 1986 get requests, put_count=2519 evicted_count=1000 eviction_rate=0.396983 and unsatisfied allocation rate=0.264854
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:256] Raising pool_size_limit_ from 655 to 720
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:244] PoolAllocator: After 28728 get requests, put_count=28680 evicted_count=1000 eviction_rate=0.0348675 and unsatisfied allocation rate=0.0418407
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:256] Raising pool_size_limit_ from 1694 to 1863
24

À propos de NUMA - https://software.intel.com/en-us/articles/optimizing-applications-for-numa

En gros, si vous avez un processeur à double socket, ils auront chacun leur propre mémoire et devront accéder à la mémoire de l'autre processeur via une liaison QPI plus lente. Ainsi, chaque CPU + mémoire est un nœud NUMA.

Potentiellement, vous pouvez traiter deux nœuds NUMA différents comme deux appareils différents et structurer votre réseau pour optimiser la bande passante intra-nœud/inter-nœuds

Cependant, je ne pense pas qu'il y ait suffisamment de câblage dans TF en ce moment pour le faire maintenant. La détection ne fonctionne pas non plus - je viens d'essayer sur une machine avec 2 nœuds NUMA, et elle a toujours imprimé le même message et s'est initialisée à 1 nœud NUMA.

DMA = accès direct à la mémoire. Vous pouvez potentiellement copier des éléments d'un GPU vers un autre GPU sans utiliser de processeur (c'est-à-dire via NVlink). L'intégration NVLink n'est pas encore là.

En ce qui concerne l'erreur, TensorFlow essaie d'allouer près de la mémoire maximale du GPU de sorte qu'il semble qu'une partie de votre mémoire GPU a déjà été allouée à autre chose et que l'allocation a échoué.

Vous pouvez faire quelque chose comme ci-dessous pour éviter d'allouer autant de mémoire

config = tf.ConfigProto(log_device_placement=True)
config.gpu_options.per_process_gpu_memory_fraction=0.3 # don't hog all vRAM
config.operation_timeout_in_ms=15000   # terminate on long hangs
sess = tf.InteractiveSession("", config=config)
25
Yaroslav Bulatov
  • successfully opened CUDA library xxx locally Signifie que la bibliothèque a été chargée, mais cela ne signifie pas qu'elle sera utilisée.
  • successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero signifie que votre noyau ne prend pas en charge NUMA. Vous pouvez lire sur NUMA ici et ici .
  • Found device 0 with properties: Vous avez 1 GPU que vous pouvez utiliser. Il répertorie les propriétés de ce GPU.
  • DMA est un accès direct à la mémoire. Plus d'informations sur Wikipedia .
  • failed to allocate 11.15G L'erreur explique clairement pourquoi cela s'est produit, mais il est difficile de dire pourquoi vous avez besoin de tant de mémoire sans regarder le code.
  • les messages d'allocateur de pool sont expliqués dans cette réponse
4
Salvador Dali