Pytorch-Lightning-Learning

0 まえがき

  • ここから移動しました

  • Pytorch-Lightning の簡潔なチュートリアル

  • ピトーチライトニング完全ガイド

  • 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 に設定します。
  • 精度パラメータ:

    • 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()]:
      • 重みを保存するパス。
  • テストパラメータ:

    • 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)

おすすめ

転載: blog.csdn.net/fb_941219/article/details/131556467