Не удается запустить код CUDA, который запрашивает NVML - ошибка, связанная с libnvidia-ml.so
Недавно коллеге понадобилось использовать NVML для запроса информации об устройстве, поэтому я скачал комплект разработки Tesla 3.304.5 и скопировал файл nvml.h в /usr/include. Чтобы проверить, я скомпилировал пример кода в tdk_3.304.5/nvml/example, и он работал нормально.
В выходные дни что-то изменилось в системе (я не могу определить, что было изменено, и я не единственный, у кого есть доступ к машине), и теперь любой код, использующий nvml.h, такой как пример кода, завершается ошибкой со следующей ошибкой:
Failed to initialize NVML:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
WARNING:
You should always run with libnvidia-ml.so that is installed with your NVIDIA Display Driver. By default it's installed in /usr/lib and /usr/lib64. libnvidia-ml.so in TDK package is a stub library that is attached only for build purposes (e.g. machine that you build your application doesn't have to have Display Driver installed).
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Однако я все еще могу запустить nvidia-smi и прочитать информацию о состоянии моего K20m, и насколько я знаю, nvidia-smi - это просто набор вызовов nvml.h. Полученное сообщение об ошибке несколько загадочно, но я считаю, что оно говорит мне о том, что файл nvidia-ml.so должен соответствовать драйверу Tesla, который я установил в своей системе. Просто чтобы убедиться, что все правильно, я повторно загрузил CUDA 5.0 и установил драйвер, среду выполнения CUDA и тестовые файлы. Я уверен, что файл nvidia-ml.so соответствует драйверу (оба 304.54), поэтому я совершенно не понимаю, что может пойти не так. Я могу скомпилировать и запустить тестовый код с помощью nvcc, а также запустить свой собственный код CUDA, если он не включает nvml.h.
Кто-нибудь сталкивался с этой ошибкой или есть мысли по устранению проблемы?
$ ls -la /usr/lib/libnvidia-ml*
lrwxrwxrwx. 1 root root 17 Jul 19 10:08 /usr/lib/libnvidia-ml.so -> libnvidia-ml.so.1
lrwxrwxrwx. 1 root root 22 Jul 19 10:08 /usr/lib/libnvidia-ml.so.1 -> libnvidia-ml.so.304.54
-rwxr-xr-x. 1 root root 391872 Jul 19 10:08 /usr/lib/libnvidia-ml.so.304.54
$ ls -la /usr/lib64/libnvidia-ml*
lrwxrwxrwx. 1 root root 17 Jul 19 10:08 /usr/lib64/libnvidia-ml.so -> libnvidia-ml.so.1
lrwxrwxrwx. 1 root root 22 Jul 19 10:08 /usr/lib64/libnvidia-ml.so.1 -> libnvidia-ml.so.304.54
-rwxr-xr-x. 1 root root 394792 Jul 19 10:08 /usr/lib64/libnvidia-ml.so.304.54
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module 304.54 Sat Sep 29 00:05:49 PDT 2012
GCC version: gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2012 NVIDIA Corporation
Built on Fri_Sep_21_17:28:58_PDT_2012
Cuda compilation tools, release 5.0, V0.2.1221
$ whereis nvml.h
nvml: /usr/include/nvml.h
$ ldd example
linux-vdso.so.1 => (0x00007fff2da66000)
libnvidia-ml.so.1 => /usr/lib64/libnvidia-ml.so.1 (0x00007f33ff6db000)
libc.so.6 => /lib64/libc.so.6 (0x000000300e400000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x000000300ec00000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000300e800000)
/lib64/ld-linux-x86-64.so.2 (0x000000300e000000)
РЕДАКТИРОВАТЬ: Решение было удалить все дополнительные экземпляры libnvidia-ml.so. По некоторым причинам их было МНОГО.
$ sudo find / -name 'libnvidia-ml*'
/usr/lib/libnvidia-ml.so.304.54
/usr/lib/libnvidia-ml.so
/usr/lib/libnvidia-ml.so.1
/usr/opt/lib/libnvidia-ml.so
/usr/opt/lib/libnvidia-ml.so.1
/usr/opt/lib64/libnvidia-ml.so
/usr/opt/lib64/libnvidia-ml.so.1
/usr/opt/nvml/lib/libnvidia-ml.so
/usr/opt/nvml/lib/libnvidia-ml.so.1
/usr/opt/nvml/lib64/libnvidia-ml.so
/usr/opt/nvml/lib64/libnvidia-ml.so.1
/usr/lib64/libnvidia-ml.so.304.54
/usr/lib64/libnvidia-ml.so
/usr/lib64/libnvidia-ml.so.1
/lib/libnvidia-ml.so.old
/lib/libnvidia-ml.so.1
4 ответа
Вы получаете эту ошибку, потому что приложение, которое пытается использовать nvml, загружает библиотеку заглушек, которая находится в:
...tdk_install_path/lib64/libnvidia-ml.so
вместо того, что в:
/usr/lib64/libnvidia-ml.so
Я смог воспроизвести вашу ошибку, когда добавил путь к библиотеке заглушки LD_LIBRARY_PATH
переменная окружения. Так что это один из возможных источников ошибок, если кто-то добавил путь к библиотеке-заглушке, которая поставляется с дистрибутивом tdk, к вашему LD_LIBRARY_PATH
переменная окружения, но, вероятно, не единственный способ, которым это может произойти. Если кто-то необычным образом скопировал библиотеку заглушки в какой-нибудь системный путь, это также может быть проблемой.
Вам нужно будет попытаться выяснить, почему ваша система загружает эту библиотеку заглушек вместо правильной в /usr/lib64
, В качестве альтернативы, для целей обнаружения, вы можете попробовать удалить все экземпляры библиотеки заглушек в любом месте вашей системы (оставьте правильные библиотеки в /usr/lib
а также /usr/lib64
в одиночку), и вы должны быть в состоянии наблюдать правильное поведение.
Я решил проблему таким образом на GTX 1070, используя Windows 10: зайдите в диспетчер устройств, выберите GPU, который имеет проблему, отключите GPU и включите обратно.
У меня была такая же или похожая проблема с EWBF Cuda Miner для zCash.
Вот способ автоматически реализовать ответ Pro7ech (который работал для меня) для WIN10:
Установите WDK для Windows 10, если у вас его еще нет: это даст вам возможность использовать devcon.exe, который позволяет манипулировать устройствами с помощью пакетных сценариев: https://docs.microsoft.com/en-us/windows- аппаратное обеспечение / драйверы / скачать-The-WDK
Вам также может понадобиться Windows SDK, если у вас нет Visual Studio с разработкой для настольных компьютеров с рабочей нагрузкой C++: https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk
Чтобы упростить задачу, вы можете добавить путь установки в переменную среды PATH: https://www.howtogeek.com/118594/how-to-edit-your-system-path-for-easy-command-line-access/
Devcon.exe был установлен здесь для меня:
C:\Program Files (x86)\Windows Kits\10\Tools\x64
Так что теперь запустите это или подобное в приглашении cmd.exe, чтобы получить идентификатор устройства:
devcon findall * | find /i "nvidia"
Вот как выглядит моя:
C:\Users\Soenhay>devcon findall * | find /i "nvidia"
HDAUDIO\FUNC_01&VEN_10DE&DEV_0083&SUBSYS_38426674&REV_1001\5&1C277AD4&0&0001: NVIDIA High Definition Audio
SWD\MMDEVAPI\{0.0.0.00000000}.{574980C3-9747-42EF-A78C-4C304E070B81}: SAMSUNG (NVIDIA High Definition Audio)
ROOT\UNNAMED_DEVICE\0000 : NVIDIA Virtual Audio Device (Wave Extensible) (WDM)
PCI\VEN_10DE&DEV_1B81&SUBSYS_66743842&REV_A1\4&1F1337ch33s3&0&0000: NVIDIA GeForce GTX 1070
Из этого я вижу, что мой идентификатор графического устройства:
PCI\VEN_10DE&DEV_1B81&SUBSYS_66743842&REV_A1\4&1F1337ch33s3&0&0000
Поэтому я создаю командный файл со следующим, чтобы отключить и снова включить драйвер:
devcon disable "@PCI\VEN_10DE&DEV_1B81&SUBSYS_66743842&REV_A1\4&1F1337ch33s3&0&0000"
devcon enable "@PCI\VEN_10DE&DEV_1B81&SUBSYS_66743842&REV_A1\4&1F1337ch33s3&0&0000"
Теперь, когда я получаю ошибку NVML при запуске майнера, я просто запускаю этот пакетный файл, и он исправляет его. Вы также можете просто добавить эти 2 строки в начало вашего файла start.bat, чтобы делать это каждый раз, но я обнаружил, что ошибка не всегда возникает каждый раз, когда я перезапускаю время майнера.
Рекомендации:
Подходящих устройств не найдено.
ПРИМЕЧАНИЕ. Команда должна иметь символ @ в начале идентификатора устройства. Пакетный скрипт должен запускаться от имени администратора.
Я столкнулся с той же ошибкой.
Найденное решение заключается в запуске команды:
nvidia-uninstall