CuDNN

Материал из Неолурк, народный Lurkmore
Перейти к навигации Перейти к поиску

cuDNN (CUDA Deep Neural Network library) — это проприетарная библиотека примитивов для глубокого обучения от NVIDIA, являющаяся тем самым магическим кристаллом, который превращает видеокарту из средства для отрисовки сисек в Ведьмаке в мощнейший инструмент порабощения человечества через нейросети. Представляет собой прослойку между твоим быдлокодом на Python и низкоуровневой архитектурой CUDA, позволяя перемножать матрицы с такой скоростью, что счетчик электроэнергии начинает вращаться быстрее, чем кулеры в системном блоке.

Без cuDNN любой современный фреймворк вроде PyTorch или TensorFlow — это просто громоздкий калькулятор, способный обучать сетку размером с инфузорию-туфельку примерно вечность.

Суть[править]

В основе всего лежит простая истина: центральный процессор (CPU) для обучения нейросетей подходит чуть менее, чем никак. Он слишком умный, сложный и последовательный. Видеокарта (GPU) же — это армия из тысяч тупых, но очень исполнительных землекопов, которые умеют делать ровно одну вещь: брать число A, умножать на число B и прибавлять C. И делают они это одновременно.

Однако писать на голой CUDA — занятие для истинных мазохистов, готовых вручную управлять памятью и писать кернелы на C++. Дженсен Хуанг, поправив свою легендарную кожаную куртку, решил эту проблему, выкатив cuDNN. Эта библиотека содержит уже готовые, максимально оптимизированные реализации сверток (convolutions), пулинга, нормализации и прочих страшных слов из матана.

Фактически, cuDNN — это набор эвристик. Когда ты запускаешь обучение, библиотека смотрит на твою видеокарту, на размеры тензоров и говорит: Ага, тут у нас матрица 3x3, памяти мало, значит используем алгоритм Винограда. А тут у нас огромный тензор, врубаем FFT. Этот процесс называется автотюнингом, и именно благодаря ему нейронки обучаются не годами, а часами.

Установка[править]

Процесс установки связки Драйвер + CUDA Toolkit + cuDNN + Фреймворк является отдельной дисциплиной Специальной Олимпиады. Это тот самый момент, когда юный дата-саентист впервые понимает, что Data Science — это на 80% настройка окружения и на 20% просмотр прогресс-бара.

Типичный алгоритм страдания:

  1. Ты ставишь свежие драйверы NVIDIA, потому что любишь новизну.
  2. Ты ставишь PyTorch, который, как выясняется, собран под CUDA 11.8.
  3. Ты скачиваешь CUDA 13.0, потому что больше — значит лучше.
  4. Ты пытаешься запустить `import torch`, и питон посылает тебя в пешее эротическое путешествие с ошибкой `cublas64_11.dll not found`.
  5. Ты начинаешь гуглить, качаешь cuDNN с сайта NVIDIA (предварительно продав душу и зарегистрировавшись в их Developer Program), вручную раскидываешь DLL-файлы по папкам `System32` и `bin`, ломая переменную окружения `PATH` окончательно.

RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR
— Сообщение, которое может означать что угодно: от битой плашки памяти до неудачного расположения звезд в созвездии Козерога.

С выходом cuDNN 9 ситуация изменилась: библиотека разделилась на кучу подмодулей (Graph API, Legacy API), добавив новый слой абстракции и новые способы выстрелить себе в ногу. Теперь вместо одного файла ты ищешь пять, а документация написана на языке, который понимают только инженеры NVIDIA и, возможно, ChatGTP (и то не всегда).

Внутреннее устройство[править]

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

  • Tensor Cores — специальные блоки в архитектуре Volta, Turing, Ampere и Hopper, заточенные исключительно под матричное умножение смешанной точности (FP16, BF16, а теперь и FP8). Это позволяет ускорить обучение в разы, пожертвовав точностью, которую нейросеть всё равно не заметит.
  • Graph API — нововведение последних версий. Вместо того чтобы запускать операции по одной (imperative mode), ты описываешь граф вычислений целиком, и драйвер оптимизирует его, склеивая (fusing) мелкие операции в одну большую супер-операцию. Это снижает оверхед на запуск ядер, но увеличивает время компиляции до значений, когда можно успеть заварить кофе.
  • Algorithmic Intelligence — библиотека сама решает, как именно считать свертку: через прямое умножение (GEMM), через преобразование Фурье (FFT) или через алгоритм Винограда (Winograd). Если она ошибется с выбором, ты получишь `Out Of Memory` на ровном месте.

Красные альтернативы (ROCm)[править]

У Корпорации Зла (NVIDIA) есть конкурент в лице Корпорации Добра (AMD), который пытается продвигать свой аналог — ROCm (Radeon Open Compute) и библиотеку MIOpen.

Ситуация с ROCm описывается аксиомой Эскобара. Теоретически, это открытый код, свобода и братство. Практически — это боль, унижение и бесконечный бета-тест. Если cuDNN работает по принципу поставил и забыл, то ROCm работает по принципу поставил, пересобрал ядро Linux, пропатчил PyTorch, получил segfault, заплакал. Хотя с выходом чипов MI300X ситуация начала меняться, для домашнего пользователя с какой-нибудь RX 7900 XTX попытка запустить Stable Diffusion всё ещё превращается в увлекательный квест с чтением логов на GitHub.

Культурное влияние[править]

  • OOM (Out Of Memory) — главный враг пользователя cuDNN. Библиотека любит откусывать память большими кусками для своих внутренних буферов. Попытка увеличить batch size на единичку часто приводит к краху всего процесса обучения спустя 5 часов работы.
  • Благодаря cuDNN зеленые подсадили всю индустрию ИИ на свою иглу. Переход на другое железо означает переписывание оптимизированного кода, чего никто делать не хочет. В итоге акции NVIDIA летят на Луну, а геймеры сидят без видеокарт.

См. также[править]

  • NVIDIA — те, кто продает лопаты во время золотой лихорадки.
  • Искусственный интеллект — то, ради чего мы терпим эти страдания.
  • Матан — то, что на самом деле происходит внутри черной коробки.
  • Линукс — единственная ОС, где это работает стабильно (но это не точно).

Ссылки[править]

  • developer.nvidia.com/cudnn — вход только по паспорту и с анализом крови.
  • github.com/nvidia/cudnn-frontend — для тех, кто хочет страдать с C++.