Обучение со смешанной точностью и AMP
torch.cuda.amp.autocast(), GradScaler, FP16 и BF16, экономия памяти, прирост скорости
«Обучение со смешанной точностью и AMP» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.
Что такое смешанная точность
При обучении со смешанной точностью большинство операций выполняется с 16-битными числами с плавающей точкой (FP16), а не с 32-битными (FP32). FP16 использует вдвое меньше памяти и работает быстрее на тензорных ядрах современных GPU, тогда как несколько чувствительных к точности операций для стабильности остаются в FP32.
Преимущества
Смешанная точность обеспечивает:
- экономию памяти примерно в 2 раза, что позволяет использовать более крупные пакеты или модели
- Более быстрое умножение матриц на тензорных ядрах
- Незначительное или нулевое снижение итоговой точности модели при корректном применении
Проблема потери точности FP16
FP16 имеет узкий диапазон представимых значений. Небольшие значения градиентов могут обнулиться из-за выхода за нижнюю границу диапазона, незаметно остановив обучение. Это основная проблема, которую должна решать смешанная точность, и причина, по которой нельзя просто преобразовать всё в FP16.
torch.cuda.amp
Автоматическая смешанная точность (AMP) в PyTorch обрабатывает эти детали с помощью двух инструментов: autocast выбирает точность для каждой операции, а GradScaler предотвращает потерю значимости градиентов.
import torch
from torch.cuda.amp import autocast, GradScalerКонтекст autocast
Оберните прямой проход в autocast(). Внутри него PyTorch автоматически выполняет каждую операцию с наиболее безопасной точностью: умножение матриц — в FP16, а операции сокращения, такие как softmax и вычисление функции потерь, — в FP32.
with autocast():
output = model(x)
loss = criterion(output, y)Знакомство с GradScaler
GradScaler борется с потерей значимости градиентов, умножая функцию потерь на большой коэффициент масштабирования перед обратным распространением ошибки. Это переносит малые градиенты в диапазон, представимый в FP16; перед шагом оптимизатора масштабирование отменяется.
scaler = GradScaler()Масштабирование функции потерь
scaler.scale(loss).backward() увеличивает масштаб функции потерь, а затем запускает обратное распространение ошибки. Получившиеся градиенты также масштабируются, что не позволяет малым значениям исчезнуть.
scaler.scale(loss).backward()scaler.step
scaler.step(optimizer) сначала возвращает градиентам их истинный масштаб, а затем вызывает optimizer.step(), но только если не появились бесконечности или NaNs. Если произошло переполнение градиентов, шаг пропускается.
scaler.step(optimizer)scaler.update
scaler.update() корректирует коэффициент масштабирования для следующей итерации: увеличивает его при успешном выполнении шагов и уменьшает после переполнения. Такое адаптивное масштабирование автоматически поддерживает стабильность обучения.
scaler.update()Полный цикл AMP
Объединив все элементы, мы получаем полный шаг обучения со смешанной точностью.
scaler = GradScaler()
for x, y in loader:
x, y = x.cuda(), y.cuda()
optimizer.zero_grad()
with autocast():
out = model(x)
loss = criterion(out, y)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()Практические советы
Помните о следующем:
- Вызывайте
backward()только для масштабированной функции потерь - autocast оборачивает только прямой проход, но не обратное распространение ошибки и не шаг оптимизатора
- AMP особенно эффективен на GPU с тензорными ядрами; на старом оборудовании прирост меньше
Проверка знаний
Проверьте свои знания об AMP.
Итоги
Вы изучили обучение со смешанной точностью с помощью AMP:
autocast()выбирает FP16 или FP32 для каждой операции прямого прохода- GradScaler масштабирует функцию потерь, чтобы предотвратить потерю значимости градиентов
- Цикл состоит из
scaler.scale(loss).backward(),scaler.step(optimizer),scaler.update() - Результат: экономия памяти примерно в 2 раза и более быстрое обучение
Часто задаваемые вопросы
Урок «Обучение со смешанной точностью и AMP» бесплатный?
Да — полный текст урока «Обучение со смешанной точностью и AMP» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.
Чему я научусь в уроке «Обучение со смешанной точностью и AMP»?
torch.cuda.amp.autocast(), GradScaler, FP16 и BF16, экономия памяти, прирост скорости Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn AI with Python?
Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Обучение со смешанной точностью и AMP»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn AI with Python?
Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обучение на нескольких GPU с DataParallel
- DistributedDataParallel (DDP)
- Обучение со смешанной точностью и AMP
- Эффективное обучение с Hugging Face Accelerate