# Системная оптимизация DNN: от матриц до Tensor Cores

Источник: https://www.youtube.com/watch?v=qbKtU0X6-WU
Канал: Stanford Online
Опубликовано: 21.09.2024

---

## Эффективное выполнение глубоких нейронных сетей (DNN) на GPU 🚀
[[JUMP:06:11]]

В лекции Stanford CS149 преподаватель подробно разбирает инженерные подходы к оптимизации глубоких нейронных сетей (DNN) для современных процессоров и графических ускорителей (GPU). Основная идея заключается в том, что высокопроизводительное выполнение нейросетей требует глубокой интеграции алгоритмических решений, оптимизации на уровне системного программирования и использования специализированного аппаратного обеспечения.

---

### 🧠 Природа нагрузки: от нейронов к матрицам
[[JUMP:07:57]]

Современные нейронные сети, несмотря на всю сложность архитектур, в своей вычислительной основе сводятся к матричной алгебре.

*   **Фундамент:** Базовая единица «нейрон» выполняет скалярное произведение вектора весов на вектор входных данных, после чего результат проходит через нелинейную функцию (например, ReLU — rectified linear unit, которую в лекции для простоты называют `max`).
*   **Слои:** В полносвязных слоях каждый нейрон связан со всеми входами, тогда как в сверточных (ConvNets) используется «скользящее окно».
*   **Свертки:** Свертка (convolution) в 2D — это операция, где каждый выходной пиксель является взвешенной комбинацией окружающих входных пикселей. При изменении весов одна и та же операция может либо размывать изображение, либо выступать в роли детектора градиентов (вертикальных или горизонтальных).

---

### 🛠 Авеню оптимизации: алгоритмы, системы и железо
[[JUMP:19:01]]

Для ускорения работы нейросетей существуют три ключевых пути, которые тесно переплетены:

1.  **Алгоритмическая топология:** Разработка более совершенных архитектур (например, ResNet или MobileNet), которые требуют меньше операций (FLOPs) и памяти при сохранении точности. За 4 года этот подход позволил сократить потребности в вычислениях примерно в 25 раз.
2.  **Системная оптимизация:** Эффективная реализация заданного алгоритма на конкретном «железе» (CPU/GPU).
3.  **Специализированное оборудование:** Применение аппаратных ускорителей, спроектированных для специфических операций нейросетей.

---

### 💻 Матричное умножение — сердце системной оптимизации
[[JUMP:27:53]]

Большинство сверточных слоев можно свести к операции умножения матриц (GEMM), для которой уже существуют высокооптимизированные библиотеки.

*   **Проблема кэша:** Наивный подход с тремя вложенными циклами имеет плохую локальность данных. Из-за большого объема матриц (часто гигабайты) данные не помещаются в кэш, что превращает задачу в ограниченную полосой пропускания памяти (bandwidth-bound).
*   **Блокировка (Blocking):** Ключевое решение — разбиение матриц на блоки, которые помещаются в кэш процессора. Это позволяет увеличить арифметическую интенсивность, выполняя больше операций на каждый байт, прочитанный из памяти.
*   **Implicit GEMM:** Современный способ выполнения свертки, где данные не копируются в промежуточную большую матрицу, а «извлекаются» из исходного тензора на лету с использованием сложной индексации.

---

### ⚡️ Продвинутые приемы и fused-операции
[[JUMP:1:01:21]]

Поскольку многие операции в DNN (например, масштабирование или Max Pool) являются узким местом из-за работы с памятью, инженеры стремятся к «слиянию» (fusion) операций.

*   **Fusion:** Выполнение нескольких последовательных операций (например, свертка + масштабирование + ReLU) за один проход по данным. Это экономит огромное количество операций записи и чтения в DRAM.
*   **Трюк с Softmax:** В трансформерах вычисление Softmax традиционно требовало ожидания всех элементов вектора. Однако математически его можно разбить на части и вычислять блоками, что позволило увеличить длину последовательностей в GPT-4.

---

### 🏗 Аппаратная адаптация: почему GPU?
[[JUMP:1:15:16]]

GPU стали стандартом для DNN благодаря сочетанию высокой параллельности, множества ALUs и SIMD-возможностей.

*   **Tensor Cores:** Специализированные блоки в GPU NVIDIA, которые выполняют сразу матричное умножение (например, 8x4x8x4) за одну инструкцию.
*   **Эффективность:** Использование специализированных инструкций для матриц позволяет достичь на порядок большей производительности (терафлопс) по сравнению с выполнением отдельных операций сложения и умножения.