Эффективное обучение LLM: от управления памятью до LoRA 0:05
Лекция Шихара Мурти (Shikhar Murty) в рамках курса Stanford CS224N посвящена практическим аспектам обучения больших языковых моделей (LLM) на графических процессорах (GPU). Автор подробно разбирает стратегии снижения потребления видеопамяти и оптимизации процесса дообучения, когда вычислительных ресурсов становится недостаточно для стандартных методов.
💾 Представление чисел и смешанная точность (Mixed Precision) 2:01
Эффективное обучение начинается с понимания того, как компьютер оперирует числами и весами нейросетей. По словам Мурти, переход от классического формата FP32 (32 бита) к форматам с пониженной точностью является критически важным.
- FP32 (32-bit floating point): Стандартный формат, требующий 4 байта памяти на параметр. Он обеспечивает широкий динамический диапазон и высокую точность.
- FP16 (16-bit floating point): Позволяет сократить потребление памяти вдвое, однако имеет меньший диапазон и точность, что часто приводит к возникновению значений
0илиNaNпри вычислениях. - BFloat16 (Brain Float 16): Лектор настоятельно рекомендует использовать этот формат на современных GPU архитектуры Ampere (H100, A100, A6000). Он обладает тем же динамическим диапазоном, что и FP32, но меньшей точностью, что приемлемо для обучения нейросетей и позволяет избежать использования градиентных скалеров.
Для борьбы с потерей точности при использовании FP16 применяется смешанная точность (mixed precision training): создание копии весов в FP32 (master weights), вычисления в FP16 и последующее обновление master weights с использованием более точных градиентов.
🌐 Распределенное обучение на нескольких GPU 14:09
При использовании нескольких GPU задача усложняется необходимостью синхронизации градиентов.
- DDP (Distributed Data Parallel): Стандартный подход, при котором каждый GPU имеет полную копию модели, но обрабатывает свою часть данных. Синхронизация происходит через операцию
all reduce. - ZeRO (Zero Redundancy Optimizer): Серия техник, разработанная Microsoft для проекта DeepSpeed, направленная на устранение избыточности в хранении состояния оптимизатора.
- ZeRO Stage 1: Шардирование состояния оптимизатора (память, momentum, variance) между GPU.
- ZeRO Stage 2: Дополнительное шардирование градиентов.
- ZeRO Stage 3 (FSDP - Fully Sharded Data Parallel): Шардирование не только оптимизатора и градиентов, но и самих параметров модели.
Мурти отмечает, что all reduce эквивалентен комбинации reduce scatter и all gather, поэтому ZeRO Stage 1 и 2 позволяют экономить память практически без накладных расходов на коммуникацию. FSDP же требует более сложной стратегии, связанной с операциями all gather и reduce scatter в процессе прямого и обратного проходов.
💡 Параметрически эффективное дообучение (PEFT) и LoRA 38:04
Когда даже использование ZeRO Stage 3 и активационного чекпоинтинга не позволяет уместить модель в память, Мурти предлагает переходить к методам эффективного дообучения.
- LoRA (Low-Rank Adaptation): Метод, основанный на наблюдении, что обновления весов при дообучении обладают низким внутренним рангом (intrinsic rank).
- Вместо изменения всей матрицы весов $W_0$ обучаются две маленькие низкоранговые матрицы $A$ и $B$.
- Преимущества: Значительная экономия памяти, возможность быстрого переключения между задачами путем замены маленьких матриц и низкая задержка вывода (inference latency).
- Рекомендации: Применять LoRA к матрицам Query и Value в блоках Self-Attention, устанавливая ранг $R=8$ и $\alpha=1$ как базовую точку.
В завершение лекции Мурти приводит алгоритм действий для финальных проектов студентов: всегда использовать mixed precision (желательно BFloat16), начинать с batch size 1, использовать ZeRO Stage 2 для масштабирования, и только при нехватке памяти — подключать FSDP или LoRA.