CUDA
CUDA — программная платформа NVIDIA для вычислений на GPU
CUDA связывает программы с видеокартами NVIDIA. Через её runtime, драйвер и библиотеки фреймворки запускают матричные операции, свёртки и attention на GPU. Пользователю AI-приложения обычно не нужно писать CUDA-код, но важно подобрать совместимые видеокарту, драйвер и сборку фреймворка.
Коротко
Коротко. CUDA — платформа NVIDIA для параллельных вычислений на её GPU. PyTorch, TensorFlow, ComfyUI и другие программы вызывают CUDA-библиотеки вместо того, чтобы вручную управлять тысячами потоков видеокарты. Для запуска чаще всего нужны поддерживаемая NVIDIA GPU, достаточно новый драйвер и подходящая сборка приложения.
Что это такое
Название расшифровывается как Compute Unified Device Architecture. Под словом CUDA обычно смешивают несколько связанных вещей:
- модель программирования для GPU;
- runtime и driver API;
- компилятор и инструменты разработки;
- библиотеки для линейной алгебры, нейросетей и других задач;
- готовые вычислительные функции — kernels, которые выполняются на GPU.
CUDA работает только с поддерживаемыми видеокартами NVIDIA. На другом оборудовании используются другие средства выполнения вычислений, или бэкенды: ROCm у AMD, MPS и Metal у Apple, DirectML в Windows, Vulkan и другие варианты. Их возможности зависят от фреймворка и конкретной операции, поэтому универсального рейтинга совместимости нет.
Почему GPU ускоряет нейросети
CPU хорошо выполняет сложный последовательный код и управляет всей системой. GPU рассчитан на множество однотипных операций над большими массивами данных. Нейросети постоянно перемножают матрицы и обрабатывают тензоры, поэтому такой параллелизм им подходит.
Упрощённая цепочка выглядит так:
- Python-код вызывает операцию во фреймворке.
- Фреймворк выбирает подходящую CUDA-реализацию.
- Драйвер ставит kernel в очередь выполнения.
- GPU читает данные из VRAM и обрабатывает их параллельно.
- Результат остаётся в памяти устройства для следующей операции либо копируется на CPU.
Передача данных между RAM и VRAM тоже занимает время. Поэтому маленькая одиночная операция не обязательно ускоряется: выгода появляется, когда вычислений достаточно много и данные не приходится постоянно гонять туда и обратно.
Driver, runtime и Toolkit
Эти три слоя часто путают.
Драйвер NVIDIA устанавливается в операционную систему и даёт приложениям доступ к GPU. Он должен быть достаточно новым для runtime, с которым собрана программа.
CUDA runtime — библиотеки, которые нужны готовому приложению во время работы. Python-пакет или дистрибутив программы нередко приносит совместимый runtime с собой.
CUDA Toolkit — набор для разработки: компилятор nvcc, заголовки, профилировщики и библиотеки. Он нужен при сборке собственных CUDA-расширений, но не всегда нужен для запуска готовой программы.
Как устроена совместимость
Новые драйверы обычно запускают приложения, собранные с более старым CUDA runtime. Обратное направление ограничено: свежему runtime может понадобиться более новый драйвер.
CUDA поддерживает совместимость между минорными версиями одной основной ветки при соблюдении минимальной версии драйвера, но отдельные новые функции и PTX-код могут требовать более свежего окружения. Точные границы публикуются в CUDA Compatibility Guide.
Практически это означает:
- сначала выбирается официальная сборка приложения или фреймворка;
- затем проверяется её требование к драйверу;
- системный Toolkit добавляется только при необходимости компиляции;
- после обновления проверяются важные расширения, потому что у них могут быть собственные бинарные зависимости.
Совет «поставить самую новую CUDA» редко решает проблему сам по себе. Важно, чтобы версии всех компонентов подходили друг другу.
Пример на практике
Пользователь запускает ComfyUI и видит в журнале:
device: cuda:0
total VRAM: ...
cuda:0 означает первое доступное CUDA-устройство. Если GPU несколько, они получают следующие индексы. Как именно выбирается карта, зависит от программы и переменных окружения.
Если PyTorch не видит GPU, полезная проверка идёт по слоям:
- отображается ли карта в диспетчере устройств и
nvidia-smi; - соответствует ли драйвер требованиям сборки;
- установлена ли CUDA-сборка фреймворка, а не CPU-only-вариант;
- возвращает ли
torch.cuda.is_available()значениеTrue; - поддерживает ли расширение архитектуру этой видеокарты;
- не смешаны ли пакеты из разных окружений Python.
Такая последовательность обычно быстрее случайной переустановки нескольких Toolkit подряд.
Библиотеки и kernels
Основную скорость дают не только ядра GPU, но и программные библиотеки:
- cuBLAS ускоряет операции линейной алгебры;
- cuDNN содержит реализации типовых операций нейросетей;
- NCCL выполняет коллективные операции и обмен данными между GPU;
- TensorRT оптимизирует инференс поддерживаемых моделей;
- специализированные функции ускоряют вычисление внимания и работу с квантованными данными.
Пользовательский пакет может содержать заранее собранное расширение под ограниченный набор архитектур GPU (compute capability). Если в нём нет ни совместимого машинного кода, ни подходящего промежуточного PTX-кода для компиляции драйвером, одного обновления драйвера недостаточно. Понадобится другая сборка или компиляция из исходников при поддержке этой карты.
С чем часто путают
- CUDA и GPU. GPU — устройство, CUDA — программная платформа для NVIDIA GPU.
- CUDA и CUDA cores. Cores — аппаратные блоки; CUDA описывает способ использовать устройство и его библиотеки.
- Driver и Toolkit. Драйвер нужен готовому приложению, Toolkit главным образом нужен разработчику и компилятору.
- CUDA и cuDNN. cuDNN — одна из библиотек поверх CUDA.
- CUDA и VRAM. CUDA управляет вычислениями и памятью, но не увеличивает физический объём VRAM.
- CUDA и PyTorch. PyTorch поддерживает несколько бэкендов, а CUDA — один из них.
Другие способы запуска на GPU
ROCm даёт стек вычислений для поддерживаемых AMD GPU. MPS позволяет PyTorch выполнять операции через Metal на Apple Silicon. DirectML и Vulkan помогают запускать часть задач на другом оборудовании.
Одинаковая модель может поддерживаться не полностью: одна операция имеет оптимизированную реализацию, другая откатывается на CPU, а сторонняя нода ожидает только CUDA. Поэтому совместимость оценивают по полной схеме работы, а скорость — на нужном размере и точности.
Частые ошибки и заблуждения
«Перед PyTorch обязательно нужен системный Toolkit». Для готовой бинарной сборки часто хватает драйвера и runtime, который приходит с пакетом. Toolkit нужен, если установка или расширение компилирует CUDA-код.
«Новая версия CUDA всегда быстрее». Обновление может принести оптимизации, но скорость определяется также моделью, вычислительной реализацией, точностью, драйвером и архитектурой GPU.
«Любой CUDA-код работает на любой NVIDIA-карте». Старые и новые архитектуры поддерживают разный набор инструкций, а сборка может не содержать код для нужной compute capability.
«Если nvidia-smi работает, PyTorch тоже увидит GPU». Это подтверждает работу драйвера, но не правильность Python-окружения и установленного варианта фреймворка.
«Другие бэкенды всегда медленнее». Результат зависит от операции и устройства. CUDA обладает большой экосистемой, но конкретный Apple, AMD или специализированный ускоритель может быть удачнее в своей задаче.
Частые вопросы
Какую версию CUDA ставить для ComfyUI? Обычно сначала выбирают поддерживаемую сборку PyTorch или готовый дистрибутив ComfyUI: нужные библиотеки CUDA приходят с ними. Отдельный Toolkit добавляют, если он нужен для сборки расширений. Требования к драйверу указаны в документации выбранного пакета.
Нужен ли Toolkit для обычного запуска? Не всегда. Если все зависимости поставляются готовыми бинарными пакетами, достаточно совместимого драйвера. Компиляция custom node может добавить требование Toolkit.
Почему после обновления драйвера всё ещё ошибка? Причина может быть в CPU-only-сборке, несовместимом расширении, старой архитектуре GPU или смешанных пакетах. Сообщение об ошибке и версии внутри активного окружения полезнее номера установленного Toolkit.
Можно ли запустить CUDA-программу на AMD или Apple GPU? Не напрямую. Нужен другой бэкенд либо специально адаптированная сборка программы.
Что такое compute capability? Это обозначение аппаратных возможностей поколения NVIDIA GPU. Компилятор использует его, чтобы включить подходящий машинный код и инструкции.
Главное
CUDA — программный путь от AI-фреймворка к NVIDIA GPU. Для готовой модели важна не «самая новая версия», а совместимая цепочка: видеокарта, драйвер, runtime, фреймворк и расширения. Если эту цепочку проверять по слоям, установка становится предсказуемой и не требует бесконечной смены Toolkit.