0 まえがき
-
PyTorch Lightning は Pytorch から完全に継承されており、Pytorch にあるものはすべて PyTorch Lightning で使用でき、PyTorch Lightning のすべてのアイテムも Pytorch で使用できます。
-
PyTorch Lightning は、Pytorch の高レベル パッケージとして、完全で変更可能なトレーニング ロジックを含んでいます。
-
PyTorch Lightning のハードウェア検出は Pytorch に基づいており、Trainer を使用して変更することもできます。
-
PyTorch Lightning ではデータ型が自動的に変更されるため、.cpu や .cuda は必要ありません。
1. Pytorch の Dataset と DataLoader を使用してデータセットを定義する
2. LightningModule を使用してモデルを定義し、トレーニング ロジックを実装します。
- LightningModule: Pytorch Lightning の 2 つの主要 API の 1 つであり、torch.nn.Module の高レベルのカプセル化です。
(1) モデルの定義
-
__init__()
: torch.nn.Module の __init__ と同じで、モデルの構築に使用されます。 -
forward(*args, **kwargs)
:torch.nn.Module の forward と同様に、順伝播は __init__ の各モジュールを通じて実装されます。
(2) トレーニングモデル
#训练模型
training_step(*args, **kwargs)
"""
训练一批数据并反向传播。参数如下:
- batch (Tensor | (Tensor, …) | [Tensor, …]) – 数据输入,一般为x, y = batch。
- batch_idx (int) – 批次索引。
- optimizer_idx (int) – 当使用多个优化器时,会使用本参数。
- hiddens (Tensor) – 当truncated_bptt_steps > 0时使用。
"""
#举个例子:
def training_step(self, batch, batch_idx): # 数据类型自动转换,模型自动调用.train()
x, y = batch
_y = self(x)
loss = criterion(_y, y) # 计算loss
return loss # 返回loss,更新网络
def training_step(self, batch, batch_idx, hiddens):
# hiddens是上一次截断反向传播的隐藏状态
out, hiddens = self.lstm(data, hiddens)
return {
"loss": loss, "hiddens": hiddens}
#--------------------------------------
training_step_end(*args, **kwargs)
"""一批数据训练结束时的操作。一般用不着,分布式训练的时候会用上。参数如下:
- batch_parts_outputs – 当前批次的training_step()的返回值
"""
#举个例子:
def training_step(self, batch, batch_idx):
x, y = batch
_y = self(x)
return {
"output": _y, "target": y}
def training_step_end(self, training_step_outputs): # 多GPU分布式训练,计算loss
gpu_0_output = training_step_outputs[0]["output"]
gpu_1_output = training_step_outputs[1]["output"]
gpu_0_target = training_step_outputs[0]["target"]
gpu_1_target = training_step_outputs[1]["target"]
# 对所有GPU的数据进行处理
loss = criterion([gpu_0_output, gpu_1_output], [gpu_0_target, gpu_1_target])
return loss
#--------------------------------------
training_epoch_end(outputs)
"""一轮数据训练结束时的操作。主要针对于本轮所有training_step的输出。参数如下:
- outputs (List[Any]) – training_step()的输出。
"""
#举个例子:
def training_epoch_end(self, outs): # 计算本轮的loss和acc
loss = 0.
for out in outs: # outs按照训练顺序排序
loss += out["loss"].cpu().detach().item()
loss /= len(outs)
acc = self.train_metric.compute()
self.history["loss"].append(loss)
self.history["acc"].append(acc)
3 つのコアコンポーネント:
- モデル
- オプティマイザ
- トレーニング/検証/テストステップ
データ フローの疑似コード:
outs = []
for batch in data:
out = training_step(batch)
outs.append(out)
training_epoch_end(outs)
同等の Lightning コード:
def training_step(self, batch, batch_idx):
prediction = ...
return prediction
def training_epoch_end(self, training_step_outputs):
for prediction in predictions:
# do something with these
必要なのは、空白を埋めるのと同じようにこれらの関数を埋めることだけです。
3. 自動トレーニングに Trainer 設定パラメータを使用する
- Pytorch Lightning の 2 つの主要な API の 1 つは、「接着剤」に似ており、LightningModule のさまざまな部分を接続して完全なロジックを形成します。
(1) 方法
__init__(logger=True, checkpoint_callback=True, callbacks=None, \
default_root_dir=None, gradient_clip_val=0, process_position=0, num_nodes=1, \
num_processes=1, gpus=None, auto_select_gpus=False, tpu_cores=None, \
log_gpu_memory=None, progress_bar_refresh_rate=1, overfit_batches=0.0, \
track_grad_norm=-1, check_val_every_n_epoch=1, fast_dev_run=False, \
accumulate_grad_batches=1, max_epochs=1000, min_epochs=1, max_steps=None, \
min_steps=None, limit_train_batches=1.0, limit_val_batches=1.0, \
limit_test_batches=1.0, val_check_interval=1.0, flush_logs_every_n_steps=100, \
log_every_n_steps=50, accelerator=None, sync_batchnorm=False, precision=32, \
weights_summary='top', weights_save_path=None, num_sanity_val_steps=2, \
truncated_bptt_steps=None, resume_from_checkpoint=None, profiler=None, \
benchmark=False, deterministic=False, reload_dataloaders_every_epoch=False, \
auto_lr_find=False, replace_sampler_ddp=True, terminate_on_nan=False, \
auto_scale_batch_size=False, prepare_data_per_node=True, plugins=None, \
amp_backend='native', amp_level='O2', distributed_backend=None, \
automatic_optimization=True, move_metrics_to_cpu=False)
トレーナーを初期化するには多くのパラメーターがあります。これらについては以下で紹介します。
-
ハードウェアパラメータ:
- gpu[なし]:
- CPU を使用するには、0 または None に設定します。
- 0 より大きい整数 n に設定すると、n 個の GPU が使用されることを示します。
- 0 より大きい整数文字列「n」に設定し、ID n の GPU を使用することを示します。
- すべての GPU を使用するには、-1 または '-1' に設定します。
- 整数配列 [a, b] または整数配列文字列 'a, b' に設定し、ID a と b の GPU が使用されることを示します。
- auto_select_gpus[False]:
- True に設定すると、必要な GPU が自動的に選択されます。
- False に設定すると、目的の GPU が順番に選択されます。
- ノード数[1]:
- 現在の GPU ノードを選択するには、1 に設定します。
- 0 より大きい整数 n に設定すると、n 個のノードが使用されることを示します。
- tpu_cores[なし]:
- TPU を使用しない場合は、None に設定します。
- 1 つの tpu コアを使用するには、1 に設定します。
- 0 より大きい整数配列 [n] に設定すると、ID n の TPU コアが使用されることを示します。
- すべての TPU コアを使用するには、8 に設定します。
- gpu[なし]:
-
精度パラメータ:
- precision[32]: 2、4、8、16、または 32 に設定され、それぞれ異なる精度を示します。
- amp_backend[“ネイティブ”]:
- ネイティブ混合精度を使用するには、「native」に設定します。
- 頂点混合精度を使用するには、「apex」に設定します。
- amp_level[“O2”]: それぞれ O0、O1、O2、または O3 に設定します。
- O0: 純粋な FP32 トレーニング。精度のベースラインとして使用できます。
- O1: 混合精度トレーニング (推奨)。ブラック リストとホワイト リストに基づいて、計算に FP16 (GEMM、畳み込み) と FP32 (Softmax) のどちらを使用するかを自動的に決定します。
- O2: 「ほぼ FP16」混合精度トレーニング。バッチ ノルムを除いて白黒リストはなく、ほぼすべての計算が FP16 で行われます。
- O3: 純粋な FP16 トレーニングは非常に不安定ですが、スピードのベースラインとして使用できます。
-
トレーニングのハイパーパラメータ:
- max_epochs[1000]: トレーニング ラウンドの最大数。
- min_epochs[1]: トレーニング ラウンドの最小数。
- max_steps[なし]: ラウンドごとのトレーニング ステップの最大数。
- min_steps[None]: ラウンドごとのトレーニング ステップの最小数。
-
ログパラメータとチェックポイントパラメータ:
- チェックポイント_コールバック[True]:
- True に設定すると、チェックポイントの保存が自動的に実行されます。
- チェックポイントの保存を行わない場合は、False に設定します。
- logger[TensorBoardLogger]: ログツールを設定します。False はロガーを使用しないことを意味します。
- default_root_dir[os.getcwd()]: ログとチェックポイントの保存に使用されるデフォルトのルート ディレクトリ。
- lush_logs_every_n_steps[100]: ディスクにログを更新するステップ数。
- log_every_n_steps[50]: ログをメモリに更新するステップ数。
- log_gpu_memory[なし]:
- GPU メモリ情報を記録しない場合は、None に設定します。
- すべての GPU メモリ情報を記録するには、「all」に設定します。
- 「min_max」に設定すると、GPU メモリ情報の最大値が記録されます。
- check_val_every_n_epoch[1]: 検証のラウンド数。
- val_check_interval[1.0]:
- 小数に設定すると、検証セットの特定の割合を取得することになります。
- 整数に設定すると、特定の数の検証セットが取得されることを示します。
- resume_from_checkpoint[None]: チェックポイント再開、入力パス。
- progress_bar_refresh_rate[1]: プログレス バーのリフレッシュ レート。
- 重み_概要[「トップ」]:
- モデル情報を出力しない場合は、None に設定します。
- 「top」に設定すると、モデルの概要情報が出力されます。
- 「full」に設定すると、すべてのモデル情報が出力されます。
- 重み保存パス[os.getcwd()]:
- 重みを保存するパス。
- チェックポイント_コールバック[True]:
-
テストパラメータ:
- num_sanity_val_steps[2]: トレーニング前に確認する検証データのバッチ数。
- fast_dev_run[False]: 一連の単体テスト。
- reload_dataloaders_every_epoch[False]: 各ラウンドでデータをリロードするかどうか。
-
分散パラメータ:
-
アクセラレータ[なし]:
-
dp (DataParallel) は、同じコンピュータの GPU 間でバッチ処理を分割することです。
-
ddp (DistributedDataParallel) は各ノードの各 GPU でトレーニングされ、勾配を同期します。TPU のデフォルト オプション。
-
ddp_cpu (CPU 上の DistributedDataParallel) は ddp と同じですが、GPU を使用しません。マルチノードの CPU トレーニングまたは単一ノードのデバッグに役立ちます。
-
ddp2 はノード上の dp およびノード間の dp です。
-
-
accumulate_grad_batches[1]: 勾配を蓄積するために使用されるバッチの数。
-
sync_batchnorm[False]: 同期バッチ処理。通常、複数の GPU で分散される場合に使用されます。
-
-
自動パラメータ:
- automatic_optimization[True]: 自動最適化を有効にするかどうか。
- auto_scale_batch_size[None]: 最大バッチ サイズを自動的に検出するかどうか。
- auto_lr_find[False]: 最適な学習率を自動的に見つけるかどうか。
-
決定論的パラメータ:
- benchmark[False]: cudnn.benchmark を使用するかどうか。
- deterministic[False]: 決定論を有効にするかどうか。
-
制限パラメータとサンプリングパラメータ:
- gradient_clip_val[0.0]: グラデーションクリッピング。
- limit_train_batches[1.0]: ラウンドごとのトレーニング バッチの数を制限します。
- limit_val_batches[1.0]: 各ラウンドの検証バッチの数を制限します。
- limit_test_batches[1.0]: ラウンドごとのテスト バッチの数を制限します。
- overfit_batches[0.0]: バッチ内の重複の数を制限します。
- prepare_data_per_node[True]: 各ノードにデータを準備するかどうか。
- replace_sampler_ddp[True]: 分散サンプラー自動追加機能を有効にするかどうか。
-
その他のパラメータ:
- callbacks[]: 皆さん、コールバックです。
- process_position[0]: プログレスバーを順番に処理します。
- プロファイラー[なし]
- トラック_グラッド_ノルム[-1]
- truncated_bptt_steps[なし]
-
fit(model, train_dataloader=None, val_dataloaders=None, datamodule=None) は
トレーニングを開始します。パラメータは次のとおりです。- datamodule (Optional[LightningDataModule]) – LightningDataModule インスタンス。
- モデル (LightningModule) – トレーニングされたモデル。
- train_dataloader (オプション[DataLoader]) – トレーニング データ。
- val_dataloaders (Union[DataLoader, List[DataLoader], None]) – データを検証します。
-
test(model=None, test_dataloaders=None, ckpt_path='best',verbose=True, datamodule=None) は
テストをオンにします。パラメータは次のとおりです。- ckpt_path (オプション[str]) – 最もテストしたいチェックポイントの重みを含むパス。None は最後の重みを使用します。
- datamodule (Optional[LightningDataModule]) – LightningDataModule インスタンス。
- model (Optional[LightningModule]) – テストするモデル。
- test_dataloaders (Union[DataLoader, List[DataLoader], None]) – テストデータ。
- verbose (bool) – 結果を出力するかどうか。
-
tune(model, train_dataloader=None, val_dataloaders=None, datamodule=None) は
トレーニング前にハイパーパラメータを調整します。パラメータは次のとおりです。- datamodule (Optional[LightningDataModule]) – LightningDataModule インスタンス。
- モデル (LightningModule) – 調整されたモデル。
- train_dataloader (オプション[DataLoader]) – トレーニング データ。
- val_dataloaders (Union[DataLoader, List[DataLoader], None]) – データを検証します。
(2) 属性
- callback_metrics コールバック メトリック。例えば:
def training_step(self, batch, batch_idx):
self.log('a_val', 2)
callback_metrics = trainer.callback_metricpythons
assert callback_metrics['a_val'] == 2
- current_epoch 現在のエポック番号。例えば:
def training_step(self, batch, batch_idx):
current_epoch = self.trainer.current_epoch
if current_epoch > 100:
# do something
pass
- ロガーの現在のログ。例えば:
def training_step(self, batch, batch_idx):
logger = self.trainer.logger
tensorboard = logger.experiment
- logged_metrics ログに送信されるメトリック。例えば:
def training_step(self, batch, batch_idx):
self.log('a_val', 2, log=True)
logged_metrics = trainer.logged_metrics
assert logged_metrics['a_val'] == 2
- log_dir 画像などの保存に使用される現在のディレクトリ。例えば:
def training_step(self, batch, batch_idx):
img = ...
save_img(img, self.trainer.log_dir)
-
is_global_zero は最初のグローバルです。
-
progress_bar_metrics プログレスバーに送信されるメトリクス。例えば:
def training_step(self, batch, batch_idx):
self.log('a_val', 2, prog_bar=True)
progress_bar_metrics = trainer.progress_bar_metrics
assert progress_bar_metrics['a_val'] == 2
4.コールバック
- Pytorch Lightning の最も nb プラグインは、ユニバーサルで無敵で、どこにでも接続でき、プラグ アンド プレイが可能です。
(1) トレーニング方法
-
on_train_start(trainer, pl_module)
最初のトレーニング開始時の動作。 -
on_train_end(trainer, pl_module)
最後のトレーニングが終了したときの動作。 -
on_train_batch_start(trainer, pl_module,batch,batch_idx,dataloader_idx)
データトレーニングのバッチが開始されるときの操作。 -
on_train_batch_end(trainer, pl_module,outputs,batch,batch_idx,dataloader_idx)
データトレーニングのバッチが終了したときの操作。 -
on_train_epoch_start(trainer, pl_module)
データ トレーニングのラウンドが開始されるときの操作。 -
データ トレーニングのラウンドが終了したときのon_train_epoch_end(trainer, pl_module, Outputs)オペレーション。
(2) 検証方法
-
on_validation_start(trainer, pl_module)
初回検証開始時の動作。 -
on_validation_end(self,trainer,pl_module)
最後の検証終了時の動作。 -
on_validation_batch_start(trainer, pl_module,batch,batch_idx,dataloader_idx)
データ検証のバッチが開始されるときの操作。 -
on_validation_batch_end(trainer, pl_module,outputs,batch,batch_idx,dataloader_idx)
データ検証のバッチが終了するときの操作。 -
on_validation_epoch_start(trainer, pl_module)
データ検証のラウンドが開始されるときの操作。 -
on_validation_epoch_end(trainer, pl_module)
データ検証のラウンドが終了したときの動作。
(3) 試験方法
-
on_test_start(trainer, pl_module)
最初のテスト開始時の動作。 -
on_test_end(self,trainer,pl_module)
最後のテストが終了したときの動作。 -
on_test_batch_start(trainer, pl_module,batch,batch_idx,dataloader_idx)
データテストのバッチが開始されるときの操作。 -
on_test_batch_end(trainer、pl_module、outputs、batch、batch_idx、dataloader_idx)
データ テストのバッチが終了するときの操作。 -
on_test_epoch_start(trainer, pl_module)
データ テストのラウンドが開始されるときの操作。 -
on_test_epoch_end(trainer, pl_module)
データ テストのラウンドが終了したときの動作。
(4) その他の方法
-
.fit を呼び出すときのon_fit_start(trainer, pl_module)オペレーション。 -
on_fit_end(trainer, pl_module) :
フィット終了時の操作。
setup(trainer, pl_module, stage)
teardown(trainer, pl_module, stage)
on_init_start(trainer)
on_init_end(trainer)
on_sanity_check_start(trainer, pl_module)
on_sanity_check_end(trainer, pl_module)
on_batch_start(trainer, pl_module)
on_batch_end(trainer, pl_module)
on_epoch_start(trainer, pl_module)
on_epoch_end(trainer, pl_module)
on_keyboard_interrupt(trainer, pl_module)
on_save_checkpoint(trainer, pl_module)
on_load_checkpoint(checkpointed_state)