Обучение с переменной точностью

Тема дорожной карты · Глубокое обучение

Обучение с переменной точностью (mixed precision training) представляет собой метод, который позволяет ускорить процесс обучения нейронных сетей, используя более низкую точность для вычислений, чем для хранения весов. Этот подход позволяет значительно увеличить производительность вычислений, особенно на современных графических процессорах (GPU) и тензорных процессорах (TPU), благодаря использованию tensor cores, которые поддерживают вычисления с половинной точностью (float16) и усеченной точностью (bfloat16). Mixed precision training позволяет примерно удвоить пропускную способность и сократить потребление памяти для активаций в два раза, что делает его особенно полезным для больших и сложных моделей.

Как это работает

Mixed precision training использует float32 для хранения весов модели, но выполняет большинство матричных умножений и свёрток в float16 или bfloat16. Это позволяет использовать tensor cores современных GPU и TPU, что значительно ускоряет вычисления. Однако, для использования float16 требуется динамическое масштабирование потерь (dynamic loss scaling), чтобы предотвратить обнуление малых градиентов из-за underflow. Bfloat16 же имеет тот же диапазон экспоненты, что и float32, и обычно масштабирование не требуется. Автоматизация mixed precision training осуществляется с помощью PyTorch torch.cuda.amp и TensorFlow mixed-precision policy, что позволяет легко внедрить этот метод в существующие проекты.

Когда применять

Mixed precision training особенно полезен для современных GPU (Ampere+), где он может обеспечить бесплатный 1.5-2x speedup без потери качества. Для многопоточной обработки на нескольких GPU используется Distributed Data Parallel (DDP), который реплицирует модель по GPU. Для обучения очень больших моделей, которые не помещаются на одну GPU, используются методы Fully Sharded Data Parallel (FSDP/ZeRO), которые обеспечивают шардинг параметров, градиентов и состояния оптимизатора. DeepSpeed также предлагает шардинг, offload и activation checkpointing для управления памятью. Самообучение (self-supervised learning) предобучает модели на ненумерованных данных, что является фундаментальной частью многих современных foundation моделей.

Типичные ошибки

Типичные ошибки при использовании mixed precision training включают FP16 NaN losses, которые могут возникнуть из-за underflow, если не применять динамическое масштабирование потерь. При использовании DDP может произойти несогласованное генерирование случайных чисел (RNG) между rank, что может привести к разным аугментациям и нарушению согласия градиентов. При использовании FSDP без activation checkpointing может возникнуть проблема с переполнением памяти (OOM) на больших моделях. Наконец, самообучение предобучения на малых данных может привести к неэффективному использованию вычислительных ресурсов.

Связанные понятия

Полезные ресурсы