Статьи

О проблемах, приводящих к появлению ошибки определения CUDA-устройств

Иногда при попытке запустить программу, использующую многопотоковые вычисления (например, майнер), появляется сообщение об отсутствии CUDA-устройств, например:

CUDA device not found

Подобная проблема может возникнуть и на новых, и на старых видеокартах, причем в разных операционных системах, включая Linux-подобные.

Как избавиться от ошибки CUDA device not found?

Перед поиском причин ошибки CUDA device not found нужно убедиться, что видеокарта, установленная на компьютере, поддерживается программой, которая выдает ошибку.

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

В дистрибутивах Windows и в OS с Linux-ядром проблема с определением CUDA-устройтсв обычно успешно решается с помощью повторной установки нужных драйверов, желательно с полной очисткой от предыдущих. Дополнительно можно вручную инсталлировать CUDA Toolkit, соответствующий установленной версии драйверов или новее.

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

Пример отображения информации в программе GPU-Z на компьютере с видеокартой Nvidia GT710 (ОС Windows 8.1, драйвера успешно установлены), но CUDA-устройства пребывают в состоянии невидимости:

Для решения проблемы можно предпринять следующие шаги:

  • проверить в диспетчере устройств установку драйверов для всех устройств (отсутствие восклицательных знаков или ошибок);
  • запуск программы осуществлять от имени администратора (не из гостевого аккаунта);
  • поставить совместимые драйвера более новой версии после очистки от предыдущих с помощью программы DDU (Display Driver Uninstaller);
  • на компьютер дополнительно установить другой видеоакселератор и поставить драйвер;
  • установить видеокарту в другой слот PCI-E материнской платы или райзер;
  • включить видимость CUDA-устройства с помощью переменной окружения CUDA_VISIBLE_DEVICES (об этом ниже по тексту);
  • отключить функцию PCI Express Native Control Feature. Для этого нужно выполнить из-под админа консольную команду:
bcdedit /set {current} pciexpress forcedisable

перезагрузить систему и заново установить драйвера

  • произвести переустановку операционной системы.

Иногда перечисленные ухищрения не срабатывают и, хотя видеокарта Nvidia успешно определяется операционной системой, видна в диспетчере задач Windows, она не работает как CUDA-устройство.

При загрузке этого же компьютера с операционной системой на Linux-ядре (xubuntu 18.04), видеокарта успешно работает, производя многопотоковые вычисления при майнинге.

Исходя из успешной работы видеокарты в ОС Linux, можно сделать предположение, что она исправна и на компьютере используются правильные настройки BIOS. Вероятно, решение проблемы с невидимостью CUDA связано с конфигурацией конкретного дистрибутива Windows.

Как решить проблему с определением CUDA-устройств в операционной системе Windows?

Множество проблем при работе в Windows возникает из-за использования сборок, в которых была произведена «доработка напильником», осуществлено «выпиливание» ненужных компонентов и/или чрезмерная очистка от ненужных файлов.

В связи с этим, в большинстве случаев самым простым и логичным решением является использование официального дистрибутива Windows, в котором не производились изменения сторонними лицами.

Иногда, даже в случае использования официальной операционной системы Windows,но Embedded-версии, проблемы остаются. В этом случае также стоит перейти на полноценную сборку от Microsoft.

Если есть время и желание, то можно попытаться исправить ситуацию, найдя и устранив причину, по которой конкретная операционная система отказывается видеть cuda-функционал видеокарт, управляемых ею

Для этого нужно понять, как реализуются CUDA-функции на компьютере.

Как производятся многопотоковые вычисления на видеокартах Nvidia?

Для работы CUDA приложений на компьютере нужно иметь CUDA-видеокарту и драйвер дисплея NVIDIA, совместимый с CUDA Toolkit, использовавшийся при компиляции приложения (майнера):

Для обеспечения совместимости каждая версия CUDA toolkit поставляется с подходящим драйвером дисплея NVIDIA. Пакет с драйверами включает в себя user mode CUDA-драйвер (файл libcuda.so) и компоненты ядра, что позволяет обеспечить работу всех функций, поддерживаемых в конкретной версии CUDA Toolkit.

Программы, скомпилированные для более ранней версии CUDA должны успешно работать и с новыми драйверами. Приложение, скомпилированное с более поздней версией CUDA, чем та, что поддерживается драйверами, работать не будет.

Работа CUDA-программ осуществляется с помощью двух интерфейсов прикладного программирования (API):

  • высокого уровня (CUDA Runtime API);
  • низкого уровня (CUDA Driver API).

Майнер или другая программа, использующая мультипроцессоры Nvidia, работает на основе CUDA Runtime API, поверх низкого уровня CUDA-драйверов:

Вызовы runtime-кода программы транслируются в более простые инструкции, в свою очередь обрабатываемые низкоуровневым API-драйвером.

Для успешного запуска майнера или другой программы, требующей поддержки CUDA, нужно:

  • использовать драйвер, поддерживающий версию CUDA, равную или новее той, которая использовалась при компиляции;
  • обеспечить, чтобы версия CUDA runtime, установленной в системе была не старее версии CUDA-драйвера.

Если программа (майнер) скомпилирована для более новой версии CUDA, чем та, что поставляется в драйверах, то (иногда) можно повысить только версию CUDA runtime, не трогая драйверов (эта фишка доступна для версий CUDA новее 10.0):

Это длается с помощью специального «CUDA compat package» на NGC-Ready профессиональных видеокартах Nvidia, но, возможно, при «определенной сноровке», применимо и на других моделях.

Если после успешной установки драйверов программа (майнер) не видит графического ускорителя, выдавая ошибку No Nvidia CUDA GPU detected, скорее всего не срабатывает CUDA runtime (так как система видит видеокарту, то значит функция deviceQueryDrv, реализуемая драйвером API работает нормально). Возможно, проблема кроется в неправильном взаимодействии с NVML-библиотекой, которая выдает неверную информацию о неподдерживаемом GPU.

Как найти причину бага CUDA runtime, приводящего к ошибке no usable mining devices found?

Детектирование наличия CUDA-capable GPU производится через библиотеку cudart (файлы cudart.dll, cudart_static.lib, cudadevrt.lib.dll в Windows) с помощью функции cudaGetDeviceCount() из состава CUDA Runtime API.

Она выдает ошибку cudaErrorNoDevice если в системе отсутствуют совместимые устройства или используется неподходящий драйвер (ошибка cudaErrorInsufficientDriver).

В случае использования компьютеров с видеокартами Nvidia, поддерживающими разные версии CUDA, могут возникнуть проблемы, связанные с их совместимостью. В связи с этим рекомендуется делать сборку компьютеров (майнинг ригов) с одинаковыми видеокартами (на одной архитектуре), а также использовать драйвера, соответствующие видеокарте (ее Compute Capability).

Таблица соответствия драйверов, версии Compute Capability и архитектуры видеокарт Nvidia:

Для выяснения причины, по которой система прячет от прикладных программ CUDA устройства, нужно изучить всю доступную информацию об установленных видеокартах Nvidia, драйверах и т. д.

В Windows очень удобно для изучения информации о видеокарте использовать программы GPU-Z или Некоторую информацию о старых видеокартах nVIDIA Geforce, Quadro и Tesla в Windows, Linux и Mac OSX можно получить утилитой cuda-z. В большинстве систем можно использовать штатную консольную утилиту nvidia-smi. Она позволяет получать следующую информацию:

  • количество ECC ошибок за текущую сессию и за все время работы GPU;
  • загруженность GPU с точки зрения compute ресурсов и памяти;
  • активные compute процессы их названием/ID и выделенной им GPU памятью;
  • частота GPU и текущий уровень performance state (pstate);
  • температура и частота вращения вентиляторов видеокарты;
  • потребляемая мощность;
  • идентификационные данные о драйверах, графическом адаптере, включая его серийный номер, PCI device Ids, версия VBIOS и т.д.

Обычно утилита nvidia-smi.exe устанавливается в папку

C:\Windows\System32

или

C:\Windows\System32\DriverStore\FileRepository\nvdm*\nvidia-smi.exe

где имя каталога nvdm* различается в зависимости от используемых драйверов/системы.

В старых ОС, например, в Windows 8.1 с драйверами 445.87, программа nvidia-smi находится в папке C:\Program Files\NVIDIA Corporation\NVSMI:

Запуск программы nvidia-smi.exe в Windows можно производить из ее каталога с помощью простейшего батника (для удобства пользователя можно использовать ярлык на рабочем столе):

@echo off

nvidia-smi

pause

При запуске такого bat-файла (без дополнительных ключей) можно получить информацию об установленных драйверах и поддерживаемой версией CUDA, например:

Как видно на приведенном в качестве примера рисунке, nvidia-smi видит видеокарту, драйвер и поддерживаемую версию CUDA, но в колонке Process name (она отвечает за compute-процессы) отображается надпись Not Supported. При этом игры на этой видеокарте работают (например, World of Tanks), а майнеры не видят CUDA-устройства (появляется ошибка no devices).

В этом случае, наверное, лучше перейти на другой, более послушный дистрибутив операционной системы.

Проблемы с видимостью устройств CUDA иногда могут возникнуть в случае неверной конфигурации переменных окружения.

Как управлять видимостью видеокарт Nvidia с помощью конфигурации окружения?

Видимостью CUDA устройств можно управлять с помощью переменной окружения CUDA_VISIBLE_DEVICES. Она позволяет исключить или включить в поле зрения прикладной программы видеокарты с помощью командной строки вида:

CUDA_VISIBLE_DEVICES=0,2

в которой перечисляются только видимые программой видеокарты.

Эту команду нужно использовать до запуска основной программы вместе с другими переменными окружения, например, в скрипте Linux, следующим образом:

export CUDA_VISIBLE_DEVICES=0,1

export GPU_FORCE_64BIT_PTR=0

export GPU_MAX_HEAP_SIZE=100

export GPU_USE_SYNC_OBJECTS=1

export GPU_MAX_ALLOC_PERCENT=100

export GPU_SINGLE_ALLOC_PERCENT=100

export CUDA_DEVICE_ORDER=PCI_BUS_ID

и т.д.

В Windows эту команду можно использовать в батнике майнера следующим образом:

setx CUDA_VISIBLE_DEVICES 0,1

setx GPU_FORCE_64BIT_PTR 1

setx GPU_MAX_HEAP_SIZE 100

setx GPU_USE_SYNC_OBJECTS 1

setx GPU_MAX_ALLOC_PERCENT 100

setx GPU_SINGLE_ALLOC_PERCENT 100

и т.д.

Добавить комментарий

Ваш адрес email не будет опубликован.

English English Русский Русский