Почему используемое устройство gpu не соответствует информации журнала?

#tensorflow #cuda #gpu #tensorflow2.0

Вопрос:

На моей машине 4 графических процессора, и когда я запускаю код, в начале я уже установил:

 import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
 

С помощью команды nvidia-smi я вижу, что на самом деле используется графический процессор 1. Однако журнал tensorflow на терминале показывает, что используется графический процессор 0:

 2021-09-24 02:27:55.691073: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1716] Found device 0 with properties: 
pciBusID: 0000:00:0d.0 name: Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.75GiB deviceMemoryBandwidth: 836.37GiB/s
2021-09-24 02:27:55.691123: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
2021-09-24 02:27:55.694585: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcublas.so.10
2021-09-24 02:27:55.698234: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcufft.so.10
2021-09-24 02:27:55.698776: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcurand.so.10
2021-09-24 02:27:55.702390: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcusolver.so.10
2021-09-24 02:27:55.703656: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcusparse.so.10
2021-09-24 02:27:55.709853: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudnn.so.7
2021-09-24 02:27:55.710078: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:982] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-09-24 02:27:55.711069: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:982] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-09-24 02:27:55.711917: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1858] Adding visible gpu devices: 0

...

2021-09-24 02:27:55.906440: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1858] Adding visible gpu devices: 0
2021-09-24 02:27:55.906571: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
2021-09-24 02:27:57.342555: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1257] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-09-24 02:27:57.342608: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1263]      0 
2021-09-24 02:27:57.342619: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1276] 0:   N 
2021-09-24 02:27:57.342980: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:982] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-09-24 02:27:57.343982: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:982] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-09-24 02:27:57.344891: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1402] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14419 MB memory) -> physical GPU (device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:0d.0, compute capability: 7.0)
 

У меня есть два вопроса:

  1. Графический процессор 0 действительно используется, но другим процессом. В моем коде он использует графический процессор 1. Мне интересно, почему приведенный выше журнал соответствует фактически используемому устройству?
  2. Кроме того, Tensorflow 2 должен автоматически определять доступные графические процессоры и использовать его. Если я не добавлю эту строку:

    os.environ[«CUDA_VISIBLE_DEVICES»] = «1»

Журнал показывает, что он пытается использовать gpu= 0 и выдает ошибку нехватки памяти.

Ответ №1:

  1. переменная CUDA_VISIBLE_DEVICES среды переназначает выбранные вами устройства так, чтобы в отношении вашего процесса CUDA эти устройства (в вашем списке) отображались в CUDA так, как если бы они начинались с нуля. Поэтому, когда вы это сделаете:
     os.environ["CUDA_VISIBLE_DEVICES"] = "1"
     

    После этого CUDA видит это устройство так, как если бы это было устройство 0.

  2. Просто потому, что графический процессор используется другим процессом/пользователем, не означает, что он «недоступен» для вас. CUDA не мешает двум пользователям или двум процессам пытаться использовать один и тот же графический процессор, и в некоторых случаях этот сценарий является разумным/эффективным. Таким образом, TF рассматривает его как полезное устройство, пытается его использовать и у него заканчивается память. Это одна из типичных причин, по которой люди используют переменную среды, указанную в 1 выше. Переменная среды сделает только определенные устройства «видимыми» или «доступными» для вашего процесса TF.

Комментарии:

1. Кроме того, я вижу, что другой процесс показывает, что его загрузка графического процессора составляет 10%, последний столбец команды nvidia-smi, но его память используется почти полностью. И если мой процесс использует этот графический процессор, он показывает ошибку outofmory. Это нормально? Какова связь между использованием памяти и использованием графического процессора в команде nvidia-smi?

2. Нет никакой связи между использованием памяти и использованием графического процессора. Вы можете использовать примерно 100% GPU при незначительном или почти полном отсутствии использования памяти. Вы можете полностью использовать память без (0%) загрузки графического процессора, о которой сообщает nvidia-smi . То, что вы видите здесь, является функцией того, что делает ваше приложение. Выделение памяти устройства? -> использование памяти. Запуск ядер GPU? -> Загрузка графического процессора.

3. Да, это нормально, что если графический процессор использует всю свою память (как бы это ни произошло), а затем ваш процесс попытается использовать этот графический процессор и выделить на нем память устройства, будет сообщено об ошибке нехватки памяти.

4. Является ли эта память на nvidia-smi такой же, как память процессора? Мое другое воспоминание намного больше. Если не то же самое, то в то время как программа использует графический процессор, будет ли она использовать только память графического процессора, а не другую гораздо большую память?

5. Нет, это не то же самое, что память процессора. Это память, подключенная к вашему графическому процессору. Я не могу сказать вам, как будет вести себя неспецифическая программа. Программа может использовать память процессора (что на самом деле не имеет ничего общего с nvidia-smi отчетностью), или она может использовать память GPU, или и то, и другое. Вероятно, в какой-то степени и то, и другое для программ с поддержкой графического процессора.