21 октября 2026 г. · Анатолий Крылов, редактор Тераферма
CUDA не видит видеокарту на сервере: диагностика за 5 минут и 8 частых причин
Если CUDA не видит видеокарту, причина почти всегда находится за 5 минут пятью командами: nvidia-smi, which python, torch.version.cuda, torch.cuda.is_available() и echo $CUDA_VISIBLE_DEVICES. Первая показывает, жива ли карта и драйвер, остальные показывают, видит ли её ваше окружение Python. На арендованном сервере в 9 случаях из 10 карта исправна, а сломано окружение: CPU-сборка PyTorch, не тот Python или переменная среды.
Команды подходят для любого Linux-сервера с NVIDIA, примеры приведены для серверов Тераферма с шаблоном «PyTorch + CUDA + Jupyter».
Шаг 1. Пять команд диагностики
Откройте терминал (по SSH или в Jupyter: File → New → Terminal) и выполните по очереди:
nvidia-smi
which python && python --version
python -c "import torch; print(torch.__version__, torch.version.cuda)"
python -c "import torch; print(torch.cuda.is_available(), torch.cuda.device_count())"
echo "CUDA_VISIBLE_DEVICES=[$CUDA_VISIBLE_DEVICES]"
Как читать результат:
| Что видите | Где проблема | Куда смотреть |
|---|---|---|
nvidia-smi не запускается или пишет ошибку |
машина, драйвер | причина 8 |
torch.version.cuda выводит None |
CPU-сборка PyTorch | причина 1 |
is_available() = False, версия CUDA есть |
драйвер старее PyTorch или переменная среды | причины 2, 4 |
True, но device_count() меньше, чем карт в заказе |
CUDA_VISIBLE_DEVICES |
причина 4 |
В терминале True, в ноутбуке False |
разные окружения Python | причина 5 |
True, но ошибка no kernel image is available |
PyTorch без поддержки архитектуры карты | причина 3 |
Ошибка forward compatibility was attempted on non supported HW |
лишние библиотеки cuda-compat в образе | причина 6 |
Сначала всегда смотрите на nvidia-smi. В правом верхнем углу таблицы стоят версия драйвера и CUDA Version: это максимальная версия CUDA, которую поддерживает драйвер, а не та, что установлена. Ниже идут модель карты, объём памяти и процессы на GPU.
Причина 1. Установлена CPU-сборка PyTorch
Самая частая причина. pip install torch в некоторых окружениях ставит сборку без CUDA, а пакет из requirements.txt с жёсткой версией torch==… может тихо перезаписать уже установленный CUDA-PyTorch.
Признак: torch.version.cuda выводит None, а в torch.__version__ стоит +cpu.
Решение: переустановить PyTorch с индекса CUDA:
pip uninstall -y torch torchvision torchaudio
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
Чтобы это не повторилось при установке зависимостей проекта, зафиксируйте torch через файл ограничений:
pip freeze | grep -E "^torch" > /workspace/constraints.txt
pip install -r requirements.txt -c /workspace/constraints.txt
Если какой-то пакет требует другую версию torch, pip откажется ставить его и покажет конфликт, вместо того чтобы молча заменить PyTorch.
Причина 2. PyTorch собран под более новую CUDA, чем умеет драйвер
PyTorch приносит с собой библиотеки CUDA, но драйвер на машине должен их поддерживать. Если вы поставили сборку под CUDA 12.8, а nvidia-smi показывает CUDA Version: 12.2, PyTorch напишет The NVIDIA driver on your system is too old или просто вернёт False.
Сверьте два числа:
| Что | Где посмотреть |
|---|---|
| Максимальная CUDA драйвера | nvidia-smi, правый верхний угол |
| CUDA, под которую собран PyTorch | python -c "import torch; print(torch.version.cuda)" |
Версия PyTorch должна быть не новее версии драйвера. Если новее, поставьте сборку под более старую CUDA, например cu124 или cu121, с тем же --index-url. Драйвер на арендованной машине обновить нельзя: его ставит владелец, а контейнер получает его с хоста. Поэтому, если нужна именно свежая CUDA, перезапустите сервер на другой машине.
На Тераферме машины подбираются под CUDA 12.8 базового шаблона, поэтому с ним эта причина почти не встречается. Она появляется, когда вы ставите nightly-сборку PyTorch или свой образ под CUDA 13.
Причина 3. RTX 50 и старый PyTorch: no kernel image
Карты Blackwell (RTX 5090, 5080, 5070 Ti, RTX PRO 6000) имеют архитектуру sm_120. Сборки PyTorch под CUDA 12.4 и старше её не знают. Симптом обманчивый: is_available() возвращает True, а первая же операция на GPU падает с ошибкой:
RuntimeError: CUDA error: no kernel image is available for execution on the device
или с предупреждением sm_120 is not compatible with the current PyTorch installation.
Решение: PyTorch 2.7 или новее со сборкой под CUDA 12.8:
pip install --upgrade torch torchvision --index-url https://download.pytorch.org/whl/cu128
python -c "import torch; print(torch.cuda.get_arch_list())"
В списке архитектур должен появиться sm_120. Та же проблема бывает у отдельных библиотек со своими CUDA-ядрами (xformers, flash-attn, bitsandbytes старых версий): обновите их до сборок с поддержкой Blackwell. Если на RTX 50 что-то не собирается, проще временно взять карту прошлого поколения, например аренда RTX 4090 с тем же объёмом памяти, что у RTX 3090.
Причина 4. Переменная CUDA_VISIBLE_DEVICES
Эта переменная говорит программам, какие карты им можно видеть. Если она пустая строка, PyTorch не увидит ни одной карты. Если в ней 0, на сервере с четырьмя картами будет видна только первая.
echo "[$CUDA_VISIBLE_DEVICES]"
unset CUDA_VISIBLE_DEVICES
Переменную часто выставляют скрипты запуска, .bashrc из чужого репозитория или ноутбук, который кто-то скопировал вместе с ячейкой os.environ["CUDA_VISIBLE_DEVICES"] = "". Учтите: переменную нужно менять до первого import torch, после импорта она уже не действует.
Причина 5. Не тот Python: Jupyter, conda и venv
В терминале is_available() возвращает True, а в ноутбуке Jupyter — False или ModuleNotFoundError. Значит, ядро ноутбука запущено из другого окружения.
Проверьте в ячейке:
import sys; print(sys.executable)
и в терминале which python. Если пути разные, у вас два Python. Чтобы ноутбук видел ваше окружение, зарегистрируйте его как ядро:
source /workspace/venv/bin/activate
pip install ipykernel
python -m ipykernel install --user --name myenv
После этого в Jupyter выберите ядро myenv в правом верхнем углу. В базовом шаблоне Тераферма PyTorch с CUDA уже стоит в основном Python образа, и создавать venv для простых задач не нужно.
Причина 6. Лишние библиотеки cuda-compat в своём образе
Если вы запускаете свой Docker-образ, собранный под серверные карты, в нём может быть пакет cuda-compat. Он нужен, чтобы новая CUDA работала со старым драйвером на A100 и H100, но на игровых картах вызывает ошибку:
CUDA error: forward compatibility was attempted on non supported HW
Решение: убрать путь к compat-библиотекам из LD_LIBRARY_PATH или удалить пакет при сборке образа:
echo $LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$(echo $LD_LIBRARY_PATH | tr ':' '\n' | grep -v compat | paste -sd:)
Для своего образа лучше брать за основу официальный pytorch/pytorch или nvidia/cuda нужной версии без compat-пакетов.
Причина 7. TensorFlow и JAX не видят GPU
У TensorFlow и JAX свои требования к CUDA и cuDNN, и PyTorch-образ их не покрывает. Проще всего ставить пакеты, которые сами принесут нужные библиотеки:
pip install "tensorflow[and-cuda]"
python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
pip install "jax[cuda12]"
python -c "import jax; print(jax.devices())"
Если список пустой, посмотрите предупреждения при импорте: TensorFlow прямо пишет, какую библиотеку не нашёл. Ставить TensorFlow и PyTorch в одно окружение можно, но версии CUDA-библиотек у них иногда конфликтуют, надёжнее держать отдельный venv.
Причина 8. Сама машина: nvidia-smi не работает
Если nvidia-smi не запускается или пишет одно из сообщений ниже, ваш код ни при чём:
| Сообщение | Что значит |
|---|---|
Failed to initialize NVML: Driver/library version mismatch |
на хосте обновили драйвер без перезагрузки |
No devices were found |
карта отвалилась от шины или перегрелась |
Unable to determine the device handle for GPU…: Unknown Error |
аппаратный сбой карты |
| в таблице меньше карт, чем в заказе | одна из карт недоступна |
На арендованном сервере это не исправить изнутри контейнера. Скачайте результаты из /workspace, остановите сервер, чтобы не платить за неработающую карту, и запустите новый на другой машине. Номер сервера пришлите в поддержку, мы проверим машину.
При запуске Тераферма сама сверяет модель и число карт с заказом: если проверка прошла, в карточке сервера стоит отметка об этом. Но карта может отказать и позже, под нагрузкой, поэтому nvidia-smi остаётся первой командой при любой странности.
Скрипт проверки окружения
Сохраните его в /workspace/check_gpu.py и запускайте после установки зависимостей:
import os, sys, subprocess
print("python:", sys.executable)
print("CUDA_VISIBLE_DEVICES:", repr(os.environ.get("CUDA_VISIBLE_DEVICES")))
print(subprocess.run(["nvidia-smi", "--query-gpu=name,memory.total,driver_version",
"--format=csv,noheader"], capture_output=True, text=True).stdout)
import torch
print("torch:", torch.__version__, "cuda:", torch.version.cuda)
print("available:", torch.cuda.is_available(), "count:", torch.cuda.device_count())
if torch.cuda.is_available():
print("arch:", torch.cuda.get_arch_list())
x = torch.randn(4096, 4096, device="cuda")
print("matmul ok:", (x @ x).sum().item() != 0, torch.cuda.get_device_name(0))
Последняя строка выполняет реальное умножение матриц на карте. Если она прошла, CUDA работает: дальше проблема уже в конкретной библиотеке, а не в связке «драйвер — PyTorch».
Начинайте с nvidia-smi. Если он работает, карта и драйвер в порядке, и причину нужно искать в окружении: CPU-сборка PyTorch, версия CUDA, RTX 50 без сборки cu128, CUDA_VISIBLE_DEVICES или не тот Python в Jupyter. Если nvidia-smi не работает, не тратьте время на отладку, перезапустите сервер на другой машине.
Чтобы не собирать окружение с нуля, запускайте сервер с шаблоном «PyTorch + CUDA + Jupyter»: PyTorch 2.7.1 и CUDA 12.8 там уже согласованы с драйвером, включая RTX 50. Пошаговое подключение описано в статье первый запуск на арендованной GPU, выбор карты в каталоге аренды GPU.