Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

NVIDIA и CUDA: машинное обучение на Arch Linux

CUDA на Arch ставится в три слоя: проприетарный драйвер, сам toolkit из репозитория и, если нужны компиляция своих расширений или cuDNN, дополнительные библиотеки. Для чистого обучения на PyTorch часто хватает первых двух слоёв и venv с pip-колесами, а системный cudnn вообще можно не трогать. Ниже — порядок установки, реальные команды проверки и разбор трёх ошибок, на которых спотыкается большинство.

Зачем вообще CUDA на Arch?

CUDA — не отдельный драйвер, а стек вычислений поверх модуля nvidia. Пока в системе нет проприетарного модуля NVIDIA, GPU не отдаст ни ядер, ни VRAM под вычисления, сколько бы ни стоял toolkit.

Практический список задач, ради которых всё это затевается: обучение и инференс на PyTorch и TensorFlow, распознавание речи через faster-whisper или whisper.cpp, локальные языковые модели через ollama-cuda или llama.cpp, генерация картинок и видео, а также любые самописные CUDA-ядра для ускорения собственного кода.

Отдельная радость Arch — свежесть. Ядро и драйвер здесь самые новые, а в extra лежит актуальный toolkit: на момент написания cuda 13.4.1 тянет за собой 2.4 ГБ загрузки и 5.25 ГБ на месте. Плата за это — необходимость внимательно следить за мажорными версиями: драйвер 615.x поддерживает CUDA 13, а wheel PyTorch может собираться под CUDA 12 или 13 в зависимости от релиза. О том, как подбирать драйвер под ядро, я писал в статье про драйвер NVIDIA на Arch Linux.

Какие пакеты ставить и в каком порядке?

Первый слой — драйвер с утилитами. Ставь его и nvidia-utils одной командой, чтобы версии гарантированно совпали:

sudo pacman -Syu nvidia nvidia-utils

На картах Turing и новее вместо закрытого модуля можно взять открытый: sudo pacman -Syu nvidia-open nvidia-utils (или nvidia-open-dkms, если нужен пересбор под своё ядро). Про грабли рассинхрона между открытым и закрытым модулями — вот здесь. Категорическое правило: не ставь nvidia-utils через один pacman -Sy без -u — частичное обновление ломает соответствие версий драйвера и утилит, и nvidia-smi начинает сыпать ошибками. Если драйвер уже в непонятном состоянии, сначала прогони полную чистку, а потом ставь заново.

Второй слой — сам toolkit:

sudo pacman -S cuda

Пакет лежит в extra, ставится в /opt/cuda, тянет за собой cccl, opencl-nvidia и python, а также объявляет Provides: cuda-toolkit. Отдельного пакета cublas в Arch нет: библиотеки libcublas.so приезжают в составе cuda, там же cusolver, cusparse и cudart. Полезно знать и про опцию: nvidia-utils у cuda числится как дополнительная зависимость, а не обязательная — то есть nvidia-smi toolkit не поставит.

Третий слой — cuDNN, и тут грабли:

sudo pacman -S cudnn

Текущий cudnn 9.26 в extra требует cuda>=13. Если у тебя CUDA 12.x, системный cuDNN из репозитория не поставится в принципе — придётся брать сборку под нужный мажор руками и следить за ABI.

Четвёртый слой необязателен, но на Arch часто удобнее pip: в extra лежат python-pytorch-cuda, python-tensorflow-cuda, onnxruntime-cuda и ollama-cuda. Ставишь нужный и получаешь готовую связку без ручной сборки колёс.

Как проверить, что CUDA заработала?

Проверять надо по трём уровням, и каждый отвечает на свой вопрос.

Первый — драйвер видит карту и называет свой потолок по CUDA:

nvidia-smi | head -12

Строка CUDA Version — это максимальная версия runtime, которую поддерживает драйвер, а не версия установленного toolkit. Понимание этой разницы снимает половину вопросов в разделе ошибок.

Второй — компилятор на месте:

nvcc --version
/opt/cuda/bin/nvcc --version
ls -l /usr/local/cuda

Пакет cuda кладёт файлы в /opt/cuda и делает /usr/local/cuda симлинком, чтобы пути из документации NVIDIA работали как привык. Если nvcc не находится, PATH не настроен — это поправимо, разберём ниже.

Третий — вычисления реально идут. Классический инструмент deviceQuery в репозиториях Arch не поставляется: сэмплов в составе пакета cuda нет. Если ты распаковывал их из исходников cuda-samples в /opt/cuda/samples, то:

cd /opt/cuda/samples
make
./bin/x86_64-linux/release/deviceQuery

Успешный вывод покажет число устройств, compute capability вроде 8.6 и строку Result = PASSED. Если сэмплов нет, проверь то же самое через Python — это быстрее и ближе к твоей реальной задаче:

python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available(), torch.cuda.get_device_name(0))"

Ожидание: True в третьем слоте и версия CUDA, совпадающая с torch.version.cuda.

Как настроить PATH и LD_LIBRARY_PATH?

На Arch переменные окружения нужны не всегда, но когда нужны, настройка специфична. Компилятор лежит в /opt/cuda/bin, библиотеки — в /opt/cuda/lib64:

export PATH=/opt/cuda/bin:$PATH
export LD_LIBRARY_PATH=/opt/cuda/lib64:$LD_LIBRARY_PATH

Чтобы не повторять руками в каждом терминале, добавь строку с PATH в ~/.zshrc, а путь к библиотекам отдай системе через ldconfig — это надёжнее, чем ручной LD_LIBRARY_PATH, потому что работает и для systemd-сервисов:

echo "/opt/cuda/lib64" | sudo tee /etc/ld.so.conf.d/cuda.conf
sudo ldconfig
ldconfig -p | grep libcudart

А вот для PyTorch из venv всё это лишнее. Колесо тянет в окружение собственные nvidia-cuda-runtime-cu13, nvidia-cudnn-cu13, nvidia-cublas-cu13 и прочее, и import torch работает без единой переменной. PATH нужен для nvcc, cupy, numba.cuda и компиляции своих расширений через torch.utils.cpp_extension, LD_LIBRARY_PATH — для программ, собранных вручную против системного cudart.

Нужен ли системный cuDNN, если есть pip-сборки?

Почти всегда нет. Колесо torch с +cu13 или +cu12 подтягивает cuDNN нужной версии внутрь venv, и torch.backends.cudnn.enabled работает без системной библиотеки. Ставить cudnn из extra поверх — версия библиотеки почти наверняка не совпадёт с тем, что собрано под колесо, и получишь cuDNN error вместо ускорения.

Системный cuDNN нужен в трёх случаях: ты пишешь C/C++ код и линкуешь cudnn сам; тебе нужен cuDNN для приложения, у которого нет Python-обвязки; либо в пакете с TensorFlow из pip уезжает несовпадение версий и ты сознательно выравниваешь её. Смешивать системный cuDNN и pip-колеса в одном окружении — худшая идея, но проверить, откуда реально грузится библиотека, можно так:

python -c "import torch; print(torch.backends.cudnn.version(), torch.backends.cudnn.enabled())"

Практическое правило для ML на Arch: системный cuda нужен под компиляцию и нативные проекты, cuDNN и PyTorch живут в venv из pip.

Какие ошибки сыпятся и что с ними делать?

Самая частая — CUDA driver version is insufficient for CUDA runtime version. Значит, драйвер старше рантайма, который пытается загрузить. Смотри CUDA Version в выводе nvidia-smi: если там 12.4, а wheel или toolkit требует 13, вариантов два — обновить драйвер через pacman -Syu либо взять версию PyTorch, собранную под CUDA 12. Снос и переустановка драйвера тут не нужна, хватает обновления.

Вторая — libcudart.so.12: cannot open shared object file. Библиотека не нашлась. Ищи её глазами и проверяй кэш:

find /usr/lib /opt/cuda -name 'libcudart.so*' 2>/dev/null
ldconfig -p | grep libcudart

Если в системе CUDA 13, а приложение ищет libcudart.so.12, дело не в путях, а в мажорной версии: собрано под 12.x, а поставил ты 13. Обратный случай (libcudart.so.13 не найден) лечится либо экспортом LD_LIBRARY_PATH, либо сборкой под твою версию.

Третья, самая запутывающая: nvcc --version работает, а torch.cuda.is_available() возвращает False. nvcc из /opt/cuda ничего не знает про то, что видит Python, поэтому успешная компиляция здесь не аргумент. Собери диагностику одним блоком:

lsmod | grep nvidia
nvidia-smi -L
echo "$CUDA_VISIBLE_DEVICES"
python -c "import torch; print(torch.cuda.device_count())"

Модуль не загружен — лечится перезагрузкой после установки. CUDA_VISIBLE_DEVICES пуст или содержит мусор — снимай переменную. device_count() возвращает ноль при установленном модуле — почти всегда версия драйвера не дотягивает до CUDA, с которой собрано колесо. Отдельный класс ошибок — CUDA error: no kernel image is available: код собран под архитектуру, которой на карте нет, и лечится флагом TORCH_CUDA_ARCH_LIST под compute capability твоей карты.

Частые вопросы

Почему torch.cuda.is_available() возвращает False?

В порядке убывания частоты: не загружен модуль nvidia после установки без перезагрузки; драйвер старше CUDA-версии, с которой собрано колесо; в venv не хватает nvidia-* колёс, если ставил через --no-deps; переменная CUDA_VISIBLE_DEVICES указывает на несуществующие устройства. Начинай с lsmod | grep nvidia и nvidia-smi -L — они отсекают половину случаев сразу.

Можно ли обойтись без системного toolkit?

Да, для типичного обучения. Колесо PyTorch везёт свой CUDA-дистрибутив, поэтому достаточно одного драйвера и pip install torch. Системный cuda нужен только под nvcc, cuDNN для нативного кода, cupy, numba.cuda и прочих вещей, которые собираются локально.

Подойдёт ли nvidia-open для машинного обучения?

Да, на Turing и новее открытый модуль работает с вычислениями не хуже закрытого, и nvidia-smi покажет полный набор GPU-возможностей. Ограничения касаются в основном карт старее Turing и части функций вроде некоторых режимов vGPU, а также есть список карт, с которыми модуль в принципе не совместим. Если модель на RTX 30/40/50 или на карте数据中心 — бери nvidia-open без сомнений.

Чем CUDA 12.x отличается от 13.x?

В 13-м мажоре подняли минимальную архитектуру (карты старее Maxwell выпадают из поддержки) и перетащили часть библиотек на новый мажор, из-за чего ищутся libcudart.so.13 и libcublas.so=13. Практически это значит одно: сверяй версию драйвера с той, что требует твой toolkit или колесо, и не смешивай 12 и 13 в одном окружении.

Полезные ресурсы

  • CUDA (ArchWiki) — версии, драйверы, нюансы с /opt/cuda и сборкой расширений.
  • PyTorch (ArchWiki) — установка в Arch, системные пакеты против pip-колёс.

Заключение

Рабочий CUDA на Arch собирается из драйвера с nvidia-utils одной командой и пакета cuda из extra, а проверяется тремя командами: nvidia-smi, nvcc --version и torch.cuda.is_available(). Системный cuDNN для PyTorch не нужен — колесо везёт его сам, и смешивать две версии только вредно. Держи версии драйвера, toolkit и колеса в одном мажоре, и обновляй систему через pacman -Syu, а не частичными -Sy.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max