GPU и CUDA
| CUDA | Compute Unified Device Architecture (NVIDIA, 2007) |
|---|---|
| Модель программирования | ядра (kernels), сетка блоков потоков, варпы по 32 потока |
| Библиотеки | cuBLAS, cuDNN, NCCL, TensorRT |
| Альтернативы | AMD ROCm/HIP, Apple Metal (MPS), Intel oneAPI, Google TPU |
| Ключевые параметры | объём и пропускная способность памяти, FLOPS в FP16/BF16/FP8 |
| Утилита мониторинга | nvidia-smi |
GPU (англ. graphics processing unit — графический процессор) — процессор с тысячами простых вычислительных ядер, изначально созданный для отрисовки графики и ставший главным ускорителем для нейросетей. CUDA — платформа и модель программирования NVIDIA, позволяющая запускать на GPU произвольные вычисления. Почти всё современное глубокое обучение, от обучения больших языковых моделей до их инференса, выполняется на GPU NVIDIA через CUDA, хотя альтернативы постепенно развиваются.[1]
Почему GPU
Центральный процессор (CPU) — несколько десятков мощных ядер, оптимизированных для последовательной логики с ветвлениями. GPU — тысячи упрощённых ядер, выполняющих одну и ту же операцию над разными данными. Нейросети в основном состоят из умножений матриц, которые идеально распараллеливаются, поэтому GPU выполняет их в десятки и сотни раз быстрее.
Поворотным моментом стала сеть AlexNet (2012): обученная на двух игровых видеокартах, она с большим отрывом выиграла конкурс ImageNet и запустила бум глубокого обучения.[3]
CUDA
NVIDIA выпустила CUDA в 2007 году. Программист пишет ядро (kernel) — функцию, которая выполняется параллельно множеством потоков; потоки организованы в блоки, блоки — в сетку. Аппаратно потоки исполняются группами по 32 (варпы), а у каждого блока есть быстрая общая память.[1]
На практике ядра пишут редко: фреймворки вроде PyTorch вызывают оптимизированные библиотеки — cuBLAS (линейная алгебра), cuDNN (операции нейросетей), NCCL (обмен данными между GPU), TensorRT (оптимизация инференса). Для собственных ядер всё чаще используют язык Triton от OpenAI, генерирующий код из Python. Пример оптимизированного ядра — FlashAttention, ускоряющий механизм внимания трансформеров за счёт работы в быстрой памяти чипа.[7]
import torch
print(torch.cuda.is_available(), torch.cuda.get_device_name(0))
x = torch.randn(8192, 8192, device="cuda", dtype=torch.bfloat16)
y = x @ x # выполняется на GPU через cuBLAS
torch.cuda.synchronize() # вызовы асинхронны — ждём завершения
nvidia-smi # загрузка, память, температура, процессы
nvidia-smi -l 1 # обновление раз в секунду
Что важно в GPU для ML
- Объём видеопамяти (VRAM) — часто главный ограничитель: модель, активации, градиенты и состояние оптимизатора должны поместиться. Для инференса модели в 7 млрд параметров в 16-битной точности нужно около 14 ГБ на веса плюс память на KV-кэш.[6]
- Пропускная способность памяти — при генерации текста LLM упирается именно в неё, а не в вычисления.
- Тензорные ядра — специализированные блоки для матричных операций в пониженной точности (FP16, BF16, FP8, FP4), дающие основной прирост скорости.
- Связь между GPU — NVLink и InfiniBand для обучения на многих картах.
| Класс | Примеры | Память |
|---|---|---|
| Игровые | RTX 4090, RTX 5090 | 24–32 ГБ |
| Рабочие станции | RTX 6000 Ada / Blackwell | 48–96 ГБ |
| Дата-центр | A100, H100, H200, B200 | 40–192 ГБ HBM |
Смешанная точность
Обучение в 16-битных форматах (BF16, FP16) вдвое сокращает память и многократно ускоряет вычисления на тензорных ядрах; критичные части (накопление сумм, главная копия весов) остаются в FP32.[4] Для инференса веса сжимают ещё сильнее — до 8 и 4 бит; см. Квантизация моделей.
Альтернативы CUDA
- AMD ROCm и язык HIP, близкий к CUDA; PyTorch поддерживает ROCm официально.[5]
- Apple Silicon — общая память CPU и GPU, бэкенд MPS в PyTorch и фреймворк MLX; удобен для локального запуска моделей.
- Google TPU, AWS Trainium, Intel Gaudi — специализированные ускорители в облаках.
Привязка экосистемы к CUDA («CUDA lock-in») — одна из причин доминирования NVIDIA на рынке.
В контейнерах
GPU пробрасывается в Docker-контейнер через NVIDIA Container Toolkit (docker run --gpus all), в Kubernetes — через device plugin, после чего поды запрашивают ресурс nvidia.com/gpu. Версия драйвера на хосте должна быть не ниже требуемой версией CUDA в образе.
См. также
- PyTorch
- Квантизация моделей
- Локальный запуск LLM (llama.cpp, Ollama)
- vLLM и инференс-серверы
- Сервинг моделей