pytorch-lightning について
研究者やチーム向けの PyTorch トレーニングフレームワークです。モデルコードを整理し、対応ハードウェアや分散方式での学習ループを自動化します。
主な機能
- 01PyTorch の学習コードを整理
- 02CPU、GPU、TPU、MPS に対応
- 03DDP、FSDP、DeepSpeed による分散学習
- 04混合精度と勾配累積
- 05コールバックによるチェックポイント保存と早期停止
- 06検証と TensorBoard ロギング
活用シーン
- 01PyTorch の学習ループを Lightning に移行
- 02複数 GPU またはノードでの学習
- 03検証指標の監視とモデルチェックポイントの保存
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ davila7/ claude-code-templates --skill pytorch-lightningインストール後、Claude Code で/pytorch-lightningを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/callbacks.mddistributed.mdhyperparameter-tuning.md詳細
PyTorch Lightning - 高水準トレーニングフレームワーク
クイックスタート
PyTorch Lightning は、柔軟性を保ちながら定型コードを排除するように PyTorch コードを整理します。
インストール:
pip install lightning
PyTorch を Lightning に変換(3 ステップ):
import lightning as L
import torch
from torch import nn
from torch.utils.data import DataLoader, Dataset
# Step 1: Define LightningModule (organize your PyTorch code)
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) # Auto-logged to TensorBoard
return loss
def configure_optimizers(self):
return torch.optim.Adam(self.parameters(), lr=1e-3)
# Step 2: Create data
train_loader = DataLoader(train_dataset, batch_size=32)
# Step 3: Train with Trainer (handles everything else!)
trainer = L.Trainer(max_epochs=10, accelerator='gpu', devices=2)
model = LitModel()
trainer.fit(model, train_loader)
これだけです! Trainer が以下を処理します:
- GPU/TPU/CPU の切り替え
- 分散トレーニング(DDP、FSDP、DeepSpeed)
- 混合精度(FP16、BF16)
- 勾配累積
- チェックポイント
- ロギング
- プログレスバー
一般的なワークフロー
ワークフロー 1: PyTorch から Lightning へ
元の PyTorch コード:
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()
Lightning 版:
class LitModel(L.LightningModule):
def __init__(self):
super().__init__()
self.model = MyModel()
def training_step(self, batch, batch_idx):
loss = self.model(batch) # No .to('cuda') needed!
return loss
def configure_optimizers(self):
return torch.optim.Adam(self.parameters())
# Train
trainer = L.Trainer(max_epochs=10, accelerator='gpu')
trainer.fit(LitModel(), train_loader)
利点: 40 行以上 → 15 行、デバイス管理が不要、自動的な分散処理
ワークフロー 2: 検証とテスト
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)
# Train with validation
trainer = L.Trainer(max_epochs=10)
trainer.fit(model, train_loader, val_loader)
# Test
trainer.test(model, test_loader)
自動的に行われる機能:
- デフォルトでは検証がエポックごとに実行されます
- メトリクスは TensorBoard に記録されます
- val_loss に基づいて最良のモデルをチェックポイントとして保存します
ワークフロー 3: 分散トレーニング(DDP)
# Same code as single GPU!
model = LitModel()
# 8 GPUs with DDP (automatic!)
trainer = L.Trainer(
accelerator='gpu',
devices=8,
strategy='ddp' # Or 'fsdp', 'deepspeed'
)
trainer.fit(model, train_loader)
起動:
# Single command, Lightning handles the rest
python train.py
変更は不要:
- データの自動分散
- 勾配の同期
- マルチノードのサポート(
num_nodes=2を設定するだけです)
ワークフロー 4: 監視のためのコールバック
from lightning.pytorch.callbacks import ModelCheckpoint, EarlyStopping, LearningRateMonitor
# Create callbacks
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')
# Add to Trainer
trainer = L.Trainer(
max_epochs=100,
callbacks=[checkpoint, early_stop, lr_monitor]
)
trainer.fit(model, train_loader, val_loader)
結果:
- 最良の 3 つのモデルを自動保存します
- 5 エポック改善がない場合は早期に停止します
- 学習率を TensorBoard に記録します
ワークフロー 5: 学習率スケジューリング
class LitModel(L.LightningModule):
# ... (training_step, etc.)
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', # Update per epoch
'frequency': 1
}
}
# Learning rate auto-logged!
trainer = L.Trainer(max_epochs=100)
trainer.fit(model, train_loader)
使うべき場面と代替手段
PyTorch Lightning を使うべき場合:
- 整理されたクリーンなコードが欲しい
- 本番環境に対応したトレーニングループが必要
- シングル GPU、マルチ GPU、TPU を切り替えて使いたい
- 組み込みのコールバックとロギングが欲しい
- チームでの協業(標準化された構造)
主な利点:
- 整理されている: 研究用コードとエンジニアリングを分離します
- 自動化: DDP、FSDP、DeepSpeed を 1 行で利用できます
- コールバック: モジュール化されたトレーニングの拡張機能
- 再現性: 定型コードが少ないほどバグも少なくなります
- 実績: 月間 100 万以上のダウンロード、実戦で検証済み
代わりに使うべきもの:
- Accelerate: 既存コードへの変更は最小限で、柔軟性が高い
- Ray Train: マルチノードのオーケストレーション、ハイパーパラメータチューニング
- 素の PyTorch: 最大限の制御、学習目的
- Keras: TensorFlow エコシステム
よくある問題
問題: 損失が減少しない
データとモデルの設定を確認してください:
# Add to 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
問題: メモリ不足(Out of memory)
バッチサイズを減らすか、勾配累積を使用してください:
trainer = L.Trainer(
accumulate_grad_batches=4, # Effective batch = batch_size × 4
precision='bf16' # Or 'fp16', reduces memory 50%
)
問題: 検証が実行されない
val_loader を渡していることを確認してください:
# WRONG
trainer.fit(model, train_loader)
# CORRECT
trainer.fit(model, train_loader, val_loader)
問題: DDP が予期せず複数のプロセスを起動する
Lightning は GPU を自動検出します。devices を明示的に設定してください:
# Test on CPU first
trainer = L.Trainer(accelerator='cpu', devices=1)
# Then GPU
trainer = L.Trainer(accelerator='gpu', devices=1)
応用トピック
コールバック: EarlyStopping、ModelCheckpoint、カスタムコールバック、コールバックフックについては references/callbacks.md を参照してください。
分散戦略: DDP、FSDP、DeepSpeed ZeRO の統合、マルチノードのセットアップについては references/distributed.md を参照してください。
ハイパーパラメータチューニング: Optuna、Ray Tune、WandB sweeps との統合については references/hyperparameter-tuning.md を参照してください。
ハードウェア要件
- 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 の優勝者、研究機関、本番チーム