Подтвердить что ты не робот

Как интерпретировать вывод TensorFlow?

Как интерпретировать вывод TensorFlow для построения и выполнения вычислительных графов на GPGPU?

Учитывая следующую команду, которая выполняет произвольный тензорный поток script с использованием API-интерфейса python.

python3 tensorflow_test.py > out

Первая часть stream_executor кажется ее зависимостями загрузки.

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

Что такое NUMA node?

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

Я предполагаю, что это когда он находит доступный графический процессор

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

Некоторая инициализация gpu? что такое 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)

Почему это вызывает ошибку E?

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

Отличный ответ на то, что делает pool_allocator: qaru.site/info/96390/...

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
4b9b3361

Ответ 1

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

Грубо говоря, если у вас есть двухпроцессорный CPU, у каждого из них будет своя собственная память, и они должны получить доступ к другой памяти процессора через более медленную QPI-связь. Таким образом, каждый процессор + память является NUMA node.

Потенциально вы могли бы обрабатывать два разных узла NUMA как два разных устройства и структурировать свою сеть для оптимизации для разных внутри < node/между node полосой пропускания

Однако, я не думаю, что сейчас достаточно проводов в TF, чтобы сделать это прямо сейчас. Обнаружение тоже не работает - я просто попробовал на машине с двумя узлами NUMA, и он все еще печатал одно и то же сообщение и инициализировался до 1 NUMA node.

DMA = Прямой доступ к памяти. Вы могли бы скопировать вещи с одного GPU на другой графический процессор без использования процессора (т.е. Через NVlink). Интеграция с NVLink еще не существует.

Что касается ошибки, TensorFlow пытается распределить близко к максимальной памяти GPU, поэтому кажется, что некоторые из ваших графических процессоров уже выделены на что-то еще, а выделение не удалось.

Вы можете сделать что-то вроде ниже, чтобы не выделять столько памяти

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 означает, что библиотека была загружена, но это не означает, что она будет использоваться.
  • successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero означает, что ваше ядро ​​не поддерживает NUMA. Вы можете прочитать о NUMA здесь и here.
  • Found device 0 with properties: у вас есть 1 графический процессор, который вы можете использовать. В нем перечислены свойства этого графического процессора.
  • DMA - прямой доступ к памяти. Дополнительная информация о Wikipedia.
  • failed to allocate 11.15G ошибка ясно объясняет, почему это произошло, но трудно сказать, зачем вам так много памяти, не глядя на код.
  • сообщения распределителя пулов объясняются в этом ответе