gpu-unlock: модуль Linux удваивает скорость FP/BF16 на видеокартах Nvidia RTX 3000

gpu-unlock: модуль Linux удваивает скорость FP/BF16 на видеокартах Nvidia RTX 3000

На GitHub опубликован проект gpu-unlock (репозиторий Zagitta/gpu-unlock), модуль ядра Linux, который разблокирует скорость выдачи инструкций FP/BF16 на видеокартах Nvidia серии RTX 3000 до уровня их профессиональных аналогов. По описанию проекта, эффект такой: скорость выдачи инструкций FP/BF16 FMA (умножение с накоплением) в операциях FP32 удваивается на чипах GA102, GA103, GA104 и GA106.

Технически модуль объединяет приём из «CMP unlocker» (метод V67/PLM) с моментом запуска до загрузки драйвера, как в варианте на основе UEFI. Он выполняет разблокировку, записывает селекторы скорости (SS0 = 0x88888888, что выбирает полную скорость BF16, и 4-битный SS1 = 0x8 IMLA4) и делает сброс функции устройства (FLR) до того, как немодифицированный драйвер NVIDIA захватит карту. Это не UEFI-приложение и не пропатченный драйвер NVIDIA, поэтому при выходе каждой новой версии драйвера ничего вручную патчить не нужно.

По данным README, ускоряются задачи с тяжёлой матричной математикой: предзаполнение (prefill) в больших языковых моделях (+14-36% в отчётах №9, №15, №25 и №33), диффузионные модели и FlashAttention. Декодирование LLM, упирающееся в пропускную способность памяти, и INT8-вычисления остаются примерно прежними. Отчёты, где сравнивали результаты вычислений, нашли их побитово идентичными до и после разблокировки. Приведённые цифры прироста, это пропускная способность плотного перемножения матриц (GEMM) в собственном тесте каждого отчёта, поэтому напрямую они несопоставимы. Сильно влияет лимит мощности: самый низкий прирост (+25%) показали карты, ограниченные 225 Вт. В примере с 3090 Ti использован плотный GEMM 8192³ при 450 Вт (медианы из пяти замеров, накопление в FP32). Отчёты охватывают до четырёх карт в одной машине, карту, к которой подключён монитор, и карты, проброшенные в виртуальную машину через vfio-pci.

Установка: клонировать репозиторий, выполнить make install (скрипт определяет семейство дистрибутива, Arch, Debian/Ubuntu или Fedora/RHEL, и собирает соответствующий пакет), затем добавить gpu_unlock.targets=all в командную строку ядра. Без этой опции модуль ничего не делает; можно указать и конкретные PCI-адреса карт через запятую. При сборке скачиваются закреплённые входные файлы NVIDIA/CachyOS по HTTPS с проверкой SHA-256. Пакеты помещают модуль и прошивку в initramfs, чтобы они загружались раньше драйвера nvidia.

Нюансы: ручная загрузка модуля после старта системы не влияет на карту, уже занятую nvidia. На карте, которая выводит изображение, экран будет чёрным от момента сброса до подхвата драйвером nvidia-drm. После выхода из ждущего режима (suspend to RAM) селекторы скорости сбрасываются, и модуль повторно разблокирует карты; это добавляет около секунды к пробуждению (отключается параметром gpu_unlock.resume=0). Гибернация не поддерживается. Все карты разблокируются параллельно примерно за секунду. Модуль и локальная упаковка распространяются под GPL-2.0-only; сгенерированная нагрузка основана на закреплённом эталоне CMP, а прошивка NVIDIA остаётся под собственными условиями.

Ключевые факты

  • Модуль ядра Linux gpu-unlock удваивает скорость выдачи инструкций FP/BF16 FMA в операциях FP32 на GA102, GA103, GA104 и GA106 (RTX 3000).
  • Работает до загрузки немодифицированного драйвера NVIDIA, поэтому патчить драйвер при каждом обновлении не нужно; включается опцией gpu_unlock.targets в командной строке ядра.
  • По отчётам пользователей, prefill в LLM ускоряется на 14-36%; декодирование LLM (упирается в память) и INT8 почти не меняются, результаты вычислений совпадают побитово.
  • Прирост плотного GEMM сильно зависит от лимита мощности: минимум +25% у карт, ограниченных 225 Вт.
  • Лицензия модуля, GPL-2.0-only; суспенд в ОЗУ поддержан (около секунды к пробуждению), гибернация нет.

Почему это важно

Игровые карты RTX 3000 широко используют для локального запуска нейросетей, и проект обещает ускорить их матричные вычисления вдвое по скорости выдачи инструкций FP/BF16 без смены оборудования. В отличие от прежних подходов, он не требует вручную патчить драйвер NVIDIA при каждом релизе: разблокировка выполняется до того, как драйвер займёт карту.

Кому это важно

Владельцам GeForce на чипах GA102, GA103, GA104 и GA106 с Linux, которые гоняют LLM, диффузионные модели или FlashAttention. Пользователям нескольких карт, виртуализации через vfio-pci и тем, кто следит за способами выжать больше из потребительских GPU.

Как это применить

Клонировать репозиторий, выполнить make install (в Arch, Debian/Ubuntu или Fedora/RHEL сборка и установка идут автоматически) и добавить gpu_unlock.targets=all в командную строку ядра, сохранив уже существующие опции; можно указать конкретные PCI-адреса. Результат проверяется командой journalctl -k -b | grep gpu_unlock. Чтобы отключить, достаточно убрать опцию. Проект распространяется под GPL-2.0-only. Автор просит добавлять в репозиторий отчёты о совместимости, независимо от успеха.

Можно ли доверять

Цифры ускорения взяты из пользовательских отчётов, которые собирает сам репозиторий, и автор подчёркивает, что они несопоставимы между собой: у каждого свой тест. Таблицы с результатами по картам в доступном тексте нет, а показатель именно для 3090 Ti в тексте не назван. Позиция NVIDIA по поводу такой разблокировки в материале не приведена. Заявление о побитовой идентичности результатов относится только к отчётам, где выходы сравнивали.

Риски и подводные камни

Это вмешательство в низкоуровневую работу GPU до запуска драйвера. У карты, выводящей изображение, экран остаётся чёрным от сброса до подхвата драйвером nvidia-drm. Если прошивка на карте не завершает работу, модуль сообщает об этом и держит DMA-буферы до выключения питания; повторять попытку нужно только после полного отключения. Риск повреждения оборудования в источнике не оценён. Гибернация не поддерживается, а ручная загрузка модуля после старта системы ничего не даёт. Прошивка NVIDIA остаётся под её собственными условиями.