On this page
Высокоуровневый фреймворк PyTorch с классом Trainer, автоматическим распределённым обучением (DDP/FSDP/DeepSpeed), системой колбэков и минимальным шаблонным кодом. Масштабируется от ноутбука до суперкомпьютера на одном и том же коде. Используйте, когда нужны чистые тренировочные циклы со встроенными лучшими практиками.
Метаданные навыка¶
|
---|---
Источник| Опционально — установка: hermes skills install official/mlops/pytorch-lightning
Путь| optional-skills/mlops/pytorch-lightning
Версия| 1.0.0
Автор| Orchestra Research
Лицензия| MIT
Зависимости| lightning, torch, transformers
Теги| PyTorch Lightning, Training Framework, Distributed Training, DDP, FSDP, DeepSpeed, High-Level API, Callbacks, Best Practices, Scalable
Справочник: полный SKILL.md¶
info Ниже приведено полное описание навыка, которое Hermes загружает при его активации. Это то, что агент видит в качестве инструкций, когда навык активен.
PyTorch Lightning — Высокоуровневый фреймворк для обучения¶
Быстрый старт¶
PyTorch Lightning организует код PyTorch, устраняя шаблонный код, сохраняя при этом гибкость.
Установка:
[code] pip install lightning
[/code]
Преобразование PyTorch в Lightning (3 шага):
[code]
import lightning as L
import torch
from torch import nn
from torch.utils.data import DataLoader, Dataset
# Шаг 1: Определите LightningModule (организуйте свой PyTorch-код)
class LitModel(L.LightningModule):
def __init__(self, hidden_size=128):
super().__init__()
self.model = nn.Sequential(
nn.Linear(28 * 28, hidden_size),
nn.ReLU(),
nn.Linear(hidden_size, 10)
)
def training_step(self, batch, batch_idx):
x, y = batch
y_hat = self.model(x)
loss = nn.functional.cross_entropy(y_hat, y)
self.log('train_loss', loss) # Автоматически логируется в TensorBoard
return loss
def configure_optimizers(self):
return torch.optim.Adam(self.parameters(), lr=1e-3)
# Шаг 2: Создайте данные
train_loader = DataLoader(train_dataset, batch_size=32)
# Шаг 3: Обучайте с Trainer (он обрабатывает всё остальное!)
trainer = L.Trainer(max_epochs=10, accelerator='gpu', devices=2)
model = LitModel()
trainer.fit(model, train_loader)
[/code]
Вот и всё! Trainer обрабатывает:
- Переключение GPU/TPU/CPU
- Распределённое обучение (DDP, FSDP, DeepSpeed)
- Смешанную точность (FP16, BF16)
- Накопление градиентов
- Сохранение контрольных точек
- Логирование
- Индикаторы выполнения
Типовые рабочие процессы¶
Процесс 1: От PyTorch к Lightning¶
Исходный код PyTorch:
[code]
model = MyModel()
optimizer = torch.optim.Adam(model.parameters())
model.to('cuda')
for epoch in range(max_epochs):
for batch in train_loader:
batch = batch.to('cuda')
optimizer.zero_grad()
loss = model(batch)
loss.backward()
optimizer.step()
[/code]
Версия Lightning:
[code]
class LitModel(L.LightningModule):
def init(self):
super().init()
self.model = MyModel()
def training_step(self, batch, batch_idx):
loss = self.model(batch) # .to('cuda') не нужен!
return loss
def configure_optimizers(self):
return torch.optim.Adam(self.parameters())
# Обучение
trainer = L.Trainer(max_epochs=10, accelerator='gpu')
trainer.fit(LitModel(), train_loader)
[/code]
Преимущества: 40+ строк → 15 строк, никакого управления устройствами, автоматическое распределённое обучение
Процесс 2: Валидация и тестирование¶
[code]
class LitModel(L.LightningModule):
def init(self):
super().init()
self.model = MyModel()
def training_step(self, batch, batch_idx):
x, y = batch
y_hat = self.model(x)
loss = nn.functional.cross_entropy(y_hat, y)
self.log('train_loss', loss)
return loss
def validation_step(self, batch, batch_idx):
x, y = batch
y_hat = self.model(x)
val_loss = nn.functional.cross_entropy(y_hat, y)
acc = (y_hat.argmax(dim=1) == y).float().mean()
self.log('val_loss', val_loss)
self.log('val_acc', acc)
def test_step(self, batch, batch_idx):
x, y = batch
y_hat = self.model(x)
test_loss = nn.functional.cross_entropy(y_hat, y)
self.log('test_loss', test_loss)
def configure_optimizers(self):
return torch.optim.Adam(self.parameters(), lr=1e-3)
# Обучение с валидацией
trainer = L.Trainer(max_epochs=10)
trainer.fit(model, train_loader, val_loader)
# Тестирование
trainer.test(model, test_loader)
[/code]
Автоматические возможности:
- Валидация выполняется каждую эпоху по умолчанию
- Метрики логируются в TensorBoard
- Сохранение лучшей модели на основе val_loss
Процесс 3: Распределённое обучение (DDP)¶
[code]
# Тот же код, что и для одного GPU!
model = LitModel()
# 8 GPU с DDP (автоматически!)
trainer = L.Trainer(
accelerator='gpu',
devices=8,
strategy='ddp' # Или 'fsdp', 'deepspeed'
)
trainer.fit(model, train_loader)
[/code]
Запуск:
[code]
# Одна команда, Lightning делает всё остальное
python train.py
[/code]
Никаких изменений не требуется:
- Автоматическое распределение данных
- Синхронизация градиентов
- Поддержка нескольких узлов (просто укажите
num_nodes=2)
Процесс 4: Колбэки для мониторинга¶
[code] from lightning.pytorch.callbacks import ModelCheckpoint, EarlyStopping, LearningRateMonitor
# Создание колбэков
checkpoint = ModelCheckpoint(
monitor='val_loss',
mode='min',
save_top_k=3,
filename='model-{epoch:02d}-{val_loss:.2f}'
)
early_stop = EarlyStopping(
monitor='val_loss',
patience=5,
mode='min'
)
lr_monitor = LearningRateMonitor(logging_interval='epoch')
# Добавление в Trainer
trainer = L.Trainer(
max_epochs=100,
callbacks=[checkpoint, early_stop, lr_monitor]
)
trainer.fit(model, train_loader, val_loader)
[/code]
Результат:
- Автосохранение 3 лучших моделей
- Досрочная остановка, если нет улучшений в течение 5 эпох
- Логирование скорости обучения в TensorBoard
Процесс 5: Планирование скорости обучения¶
[code]
class LitModel(L.LightningModule):
# ... (training_step, и т.д.)
def configure_optimizers(self):
optimizer = torch.optim.Adam(self.parameters(), lr=1e-3)
# Cosine annealing
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
optimizer,
T_max=100,
eta_min=1e-5
)
return {
'optimizer': optimizer,
'lr_scheduler': {
'scheduler': scheduler,
'interval': 'epoch', # Обновление каждую эпоху
'frequency': 1
}
}
# Скорость обучения логируется автоматически!
trainer = L.Trainer(max_epochs=100)
trainer.fit(model, train_loader)
[/code]
Когда использовать и сравнение с альтернативами¶
Используйте PyTorch Lightning, когда:
- Нужен чистый, организованный код
- Требуются готовые к продакшену тренировочные циклы
- Переключаетесь между одним GPU, несколькими GPU и TPU
- Нужны встроенные колбэки и логирование
- Работаете в команде (стандартизированная структура)
Ключевые преимущества:
- Организованность: Отделяет исследовательский код от инженерного
- Автоматизация: DDP, FSDP, DeepSpeed одной строкой
- Колбэки: Модульные расширения для обучения
- Воспроизводимость: Меньше шаблонного кода = меньше ошибок
- Проверен: 1M+ загрузок в месяц, проверен в бою
Используйте альтернативы вместо этого:
- Accelerate: Минимальные изменения существующего кода, больше гибкости
- Ray Train: Оркестрация на нескольких узлах, настройка гиперпараметров
- Чистый PyTorch: Максимальный контроль, в учебных целях
- Keras: Экосистема TensorFlow
Часто встречающиеся проблемы¶
Проблема: Loss не уменьшается
Проверьте данные и настройку модели:
[code]
# Добавьте в training_step
def training_step(self, batch, batch_idx):
if batch_idx == 0:
print(f"Batch shape: {batch[0].shape}")
print(f"Labels: {batch[1]}")
loss = ...
return loss
[/code]
Проблема: Не хватает памяти
Уменьшите размер батча или используйте накопление градиентов:
[code]
trainer = L.Trainer(
accumulate_grad_batches=4, # Эффективный батч = batch_size × 4
precision='bf16' # Или 'fp16', уменьшает потребление памяти на 50%
)
[/code]
Проблема: Валидация не запускается
Убедитесь, что вы передаёте val_loader:
[code]
# НЕПРАВИЛЬНО
trainer.fit(model, train_loader)
# ПРАВИЛЬНО
trainer.fit(model, train_loader, val_loader)
[/code]
Проблема: DDP неожиданно порождает несколько процессов
Lightning автоматически определяет GPU. Явно укажите устройства:
[code]
# Сначала тест на CPU
trainer = L.Trainer(accelerator='cpu', devices=1)
# Затем GPU
trainer = L.Trainer(accelerator='gpu', devices=1)
[/code]
Продвинутые темы¶
Колбэки: См. references/callbacks.md для EarlyStopping, ModelCheckpoint, пользовательских колбэков и хуков колбэков.
Стратегии распределённого обучения: См. references/distributed.md для DDP, FSDP, интеграции DeepSpeed ZeRO, настройки нескольких узлов.
Настройка гиперпараметров: См. references/hyperparameter-tuning.md для интеграции с Optuna, Ray Tune и WandB sweeps.
Требования к оборудованию¶
- CPU: Работает (хорошо для отладки)
- Один GPU: Работает
- Несколько GPU: DDP (по умолчанию), FSDP или DeepSpeed
- Несколько узлов: DDP, FSDP, DeepSpeed
- TPU: Поддерживается (8 ядер)
- Apple MPS: Поддерживается
Варианты точности:
- FP32 (по умолчанию)
- FP16 (V100, старые GPU)
- BF16 (A100/H100, рекомендуется)
- FP8 (H100)
Ресурсы¶
- Документация: https://lightning.ai/docs/pytorch/stable/
- GitHub: https://github.com/Lightning-AI/pytorch-lightning ⭐ 29,000+
- Версия: 2.5.5+
- Примеры: https://github.com/Lightning-AI/pytorch-lightning/tree/master/examples
- Discord: https://discord.gg/lightning-ai
-
Используется: победителями Kaggle, исследовательскими лабораториями, продакшен-командами
- Справочник: полный SKILL.md
- Быстрый старт
- Типовые рабочие процессы
- Когда использовать и сравнение с альтернативами
- Часто встречающиеся проблемы
- Продвинутые темы
- Требования к оборудованию
- Ресурсы