Tensor Cores, Triton, остаточные сети и vision transformer

С 2015 года по сегодняшний день глубокое обучение прошло путь от настраиваемого вручную GPU-кода на C++ и свёрточных сетей до аппаратно ускоряемых матричных движков и архитектур Transformer. Эти три вехи определяют, как проектируются и масштабируются современные модели ИИ.
1. Современная эволюция CUDA: Tensor Cores и OpenAI Triton
В 2012 году Алекс Крижевский написал низкоуровневый CUDA C++ (cuda-convnet) для вычисления отдельных операций с плавающей запятой на стандартных ядрах CUDA. Сегодня глубокое обучение опирается на специализированное матричное оборудование и высокоуровневые компиляторы.
- От ядер CUDA к Tensor Cores. Традиционные ядра CUDA выполняют одно скалярное умножение и сложение за такт. Начиная с архитектуры Volta (2017), NVIDIA представила Tensor Cores, которые за один такт умножают целые небольшие матрицы (например, блоки 4×4 или 16×16). Современные Tensor Cores используют форматы смешанной точности, такие как FP16, BF16 и FP8, обеспечивая ускорение матричных умножений на порядок.
- cuDNN и автоматический выбор ядер. Вместо того чтобы исследователи писали собственные свёртки на C++, библиотека NVIDIA cuDNN теперь содержит сотни заранее скомпилированных ассемблерных ядер. Во время выполнения фреймворки вроде PyTorch сравнивают разные алгоритмы для вашей конкретной формы тензора и автоматически выбирают самую быструю процедуру для Tensor Cores.
- OpenAI Triton (GPU-программирование на Python). Написание чистого CUDA C++ требует вручную управлять индексацией потоков, конфликтами банков разделяемой памяти и синхронизацией варпов. Triton, выпущенный OpenAI, позволяет исследователям писать высокопроизводительные GPU-ядра прямо на Python. Вы описываете операции на уровне блоков (тайлов данных), а компилятор Triton автоматически берёт на себя объединение обращений к памяти (coalescing), тайлинг в разделяемой памяти и планирование для Tensor Cores, часто не уступая вручную настроенному CUDA C++ или превосходя его.
2. Пропускные соединения ResNet и поток обратного распространения
До ResNet (2015) наращивание более ~20 свёрточных слоёв приводило к резкому росту ошибки обучения. Проходя назад через десятки шагов умножения, градиенты сжимались к нулю (затухающие градиенты) или становились нестабильными.
- Обучение остатков вместо необработанных выходов. В стандартном блоке сети уложенные слои пытаются выучить прямое отображение H(x) входа x. ResNet вводит пропускное соединение (тождественный обходной путь), которое добавляет исходный вход x прямо к выходу блока:
y=F(x)+x
Здесь F(x) представляет уложенные свёрточные слои. Вместо того чтобы заново строить всё представление с нуля, слоям нужно выучить лишь остаток (небольшую поправку F(x) = y - x). Если слой не нужен, сеть легко может подтолкнуть F(x) к нулю, оставив чистую тождественную передачу.
- Непрерывная магистраль градиента. При обратном распространении правило цепочки вычисляет градиент потерь (L) по входу x:
(∂ L)/(∂ x)=(∂ L)/(∂ y)((∂ F(x))/(∂ x)+1)
Благодаря слагаемому + 1, создаваемому тождественным обходным путём, градиент, приходящий сверху ((∂ L)/(∂ y)), течёт напрямую назад к более ранним слоям, не уменьшаясь из-за малых весовых матриц в (∂ F(x))/(∂ x). Это позволяет градиентам чисто распространяться через 100+ и даже 1 000+ слоёв.
3. Переход от CNN к Vision Transformer (ViT)
Почти десятилетие после AlexNet свёрточные нейронные сети (CNN) доминировали в компьютерном зрении, скользя небольшими локальными фильтрами по изображениям. В 2020 году Google представила Vision Transformer (ViT), адаптировав архитектуру Transformer из обработки естественного языка для изображений.
| Характеристика | Свёрточные нейронные сети (CNN) | Vision Transformer (ViT) |
|---|---|---|
| Обработка входа | Обрабатывает всю двумерную сетку изображения скользящими фильтрами (например, 3×3). | Разбивает изображение на патчи фиксированного размера (например, 16×16 пикселей) и разворачивает их в последовательность токенов. |
| Рецептивное поле | Сначала локальное. Ранние слои видят только соседние пиксели; глобальный контекст медленно накапливается в глубоких слоях. | Сразу глобальное. Самовнимание (self-attention) связывает каждый патч изображения с каждым другим патчем уже с первого слоя. |
| Индуктивное смещение | Высокое. Встроенные предположения об инвариантности к сдвигу и двумерной пространственной локальности помогают CNN хорошо обучаться на небольших наборах данных. | Низкое. Нет встроенных правил двумерного пространства (опора на позиционные эмбеддинги), поэтому для освоения визуальной структуры нужны огромные наборы данных. |
| Масштабирование на оборудовании | Опирается на специализированные свёрточные ядра и сложные схемы доступа к памяти. | Опирается почти полностью на плотные матричные умножения (GEMM), которые с максимальной эффективностью загружают Tensor Cores современных GPU. |
- Почему ViT завоевали современный ИИ. Хотя CNN остаются эффективными для лёгких мобильных и периферийных устройств, Vision Transformer масштабируются намного лучше при обучении на сотнях миллионов изображений. Кроме того, поскольку ViT представляют изображения в виде последовательностей токенов, то есть в том же формате, что используется для текста и аудио, они позволили современным мультимодальным моделям ИИ (таким как GPT-4o и Gemini) обрабатывать зрение и язык в единой архитектуре.