2016-04-25 45 views
18

Come si interpreta l'uscita TensorFlow per la creazione e l'esecuzione di grafici computazionali su GPGPU?Come interpretare l'uscita TensorFlow?

Dato il seguente comando che esegue uno script di tensorflow arbitrario utilizzando l'API python.

python3 tensorflow_test.py> fuori

La prima parte stream_executor sembra che le sue dipendenze di carico.

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 

Che cosa è un nodo 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 

Suppongo che questo è quando trova la GPU disponibili

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 

Alcuni di inizializzazione gpu? cos'è il 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) 

Perché si genera un errore E?

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

Grande risposta a ciò che la pool_allocator fa: 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 

risposta

18

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

In parole povere, se si dispone di due socket della CPU, che hanno ciascuno la propria memoria e devono accedere alla memoria dell'altro processore attraverso un link QPI più lento. Quindi ogni CPU + memoria è un nodo NUMA.

Potenzialmente si potrebbe trattare due differenti nodi NUMA come due dispositivi diversi e strutturare la rete per ottimizzare per diversi all'interno del nodo/tra-nodo di larghezza di banda

Tuttavia, non credo che ci sia abbastanza cablaggio in TF in questo momento per farlo adesso. Il rilevamento non funziona neanche - ho appena provato su una macchina con 2 nodi NUMA, e ha comunque stampato lo stesso messaggio e inizializzato su 1 nodo NUMA.

DMA = Accesso diretto alla memoria. Potresti potenzialmente copiare cose da una GPU a un'altra GPU senza utilizzare la CPU (cioè attraverso NVlink). L'integrazione NVLink non esiste ancora.

Per quanto riguarda l'errore, TensorFlow tenta di allocare vicino alla memoria massima della GPU, quindi sembra che parte della memoria della GPU sia già stata assegnata a qualcos'altro e l'allocazione non è riuscita.

Si può fare qualcosa di simile di seguito per evitare di allocare la memoria così tanto

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) 
2
  • successfully opened CUDA library xxx locally significa che la biblioteca è stata caricata, ma ciò non significa che sarà usato.
  • successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero significa che il kernel non ha il supporto NUMA.Puoi leggere su NUMA here e here.
  • Found device 0 with properties: si dispone di 1 GPU che è possibile utilizzare. Elenca le proprietà di questa GPU.
  • DMA è l'accesso diretto alla memoria. Maggiori informazioni su Wikipedia.
  • failed to allocate 11.15G l'errore spiega chiaramente perché questo è successo, ma è difficile dire perché hai bisogno di così tanta memoria senza guardare il codice.
  • i messaggi di allocazione pool sono spiegati in this answer
Problemi correlati