Оптимизация производительности GPU в Linux: нюансы управления драйверами и гибридными конфигурациями

Разработчики, работающие с GPU-интенсивными задачами — от тренировки нейросетей до рендеринга — нередко сталкиваются с противоречивым поведением графических адаптеров в Linux. Типичный сценарий: после обновления ядра CUDA-приложения перестают видеть GPU, батарея ноутбука разряжается за час из-за активной дискретной видеокарты, или Xorg отказывается стартовать из-за конфликта драйверов. Эти проблемы часто коренятся в тонкостях управления драйверами и их интеграции с системой.

Выбор и настройка драйверов: между open-source и проприетарными решениями

В Arch Linux установка драйверов NVIDIA кажется простой:

bash
sudo pacman -S nvidia nvidia-utils nvidia-settings

Но уже здесь начинаются подводные камни:

  • Для ядер linux-lts требуется пакет nvidia-lts;
  • Карты Turing (RTX 20xx+) часто нуждаются в флаге nvidia-drm.modeset=1 для корректной работы с Wayland;
  • Для CUDA 12.x+ необходимо явно установить cuda и cudnn из AUR.

Проверка активного драйвера:

bash
lspci -k | grep -A 2 -i "VGA"

Open-source альтернативы вроде nouveau годятся для базового вывода изображения, но не поддерживают современные API Vulkan. Однако они остаются полезными для дебагга: если система не загружается с проприетарным драйвером, временный переход на nouveau помогает изолировать проблему.

Управление гибридными GPU: не только Optimus

Ноутбуки с дискретной NVIDIA и интегрированной Intel GPU требуют согласованной работы обоих адаптеров. Три подхода доминируют:

  1. Prime Offload (динамическое переключение):

    bash
    __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | grep "OpenGL renderer"
    

    Преимущество: гибкость. Недостаток: ручное указание переменных окружения для каждого приложения.

  2. Optimus Manager (переключение на уровне сеанса):

    bash
    optimus-manager --switch integrated
    systemctl restart display-manager
    

    Решение перезагружает графическую сессию, но полностью переключает GPU.

  3. EnvyControl (автоматизация через udev):

    bash
    envycontrol -s nvidia --dm sddm
    

    Интегрируется с менеджерами входа, но требует тонкой настройки зависимостей.

Для Wayland-окружений (GNOME, KDE Plasma) необходимы дополнительные шаги — например, редактирование файлов в /etc/modprobe.d/ для загрузки nvidia-drm с параметром modeset=1.

Когда ядро обновляется, а драйвер — нет: работа с dkms и хуками

Частая проблема в rolling-дистрибутивах: новое ядро требует пересборки модулей NVIDIA. Решение — DKMS (Dynamic Kernel Module Support):

bash
sudo pacman -S dkms
sudo dkms install -m nvidia -v $(pacman -Q nvidia | awk '{print $2}' | cut -d- -1)

Для автоматизации в Arch Linux создайте хук pacman:

bash
# /etc/pacman.d/hooks/nvidia.hook
[Trigger]
Operation=Install
Operation=Upgrade
Operation=Remove
Type=Package
Target=nvidia

[Action]
Description=Update NVIDIA DKMS module
When=PostTransaction
Exec=/usr/bin/dkms autoinstall

Это предотвратит необходимость ручной пересборки после pacman -Syu.

CUDA без сюрпризов: проверка окружения

После обновления драйверов убедитесь в работоспособности стека CUDA:

bash
nvidia-smi # Проверка связи с драйвером
/opt/cuda/samples/1_Utilities/deviceQuery/deviceQuery # Запуск тестового примера

Для PyTorch/TensorFlow добавьте проверку в CI/CD-конвейер:

python
import torch
assert torch.cuda.is_available(), "CUDA недоступно"
print(torch.cuda.get_device_name(0))

Отладка типичных сбоев

Симптом: Черный экран после загрузки.
Решение: Добавить nouveau.modeset=0 nvidia-drm.modeset=1 в параметры GRUB, проверить наличие nvidia в Initramfs:

bash
sudo vim /etc/mkinitcpio.conf # Убедиться, что MODULES содержит nvidia
sudo mkinitcpio -P

Симптом: Высокий расход энергии при использовании интегрированной графики.
Инструменты:

bash
powertop --auto-tune # Управление энергопотреблением
sudo ps aux | grep -i