Share
Embed
社内CV輪講資料 / PyTorch Lightning
社内のCV輪講で PyTorch Lightningについて共有したときの資料です
「今日から始める PyTorch Lightning」
サンプルレポ:https://github.com/karasawatakumi/monodepth-dev
Takumi Karasawa
April 26, 2021
Transcript
27 slides
-
confidential Mobility Technologies Co., PyTorch Lightning [Docs] ▪ 3月にPLデビューしていい感じだったので共有。 タイトル通り「今日から始める」人向け、な気がします。 ▪
ちなみにですが、こういう系の他フレームワークも使ったことない人です。 そのため他フレームワークに比べて、とかはわからず。 はじめに -
confidential Mobility Technologies Co., 「さっくり使用機能の豊富さ+不要な頑張りコード排除」 w/ 移行のしやすさ ▪ 形式に則って実装しておけば、引数与えるだけ、とかで豊富な機能を使用できる。 ▪
ターミナル表示やロギングなど、毎回書くコードの排除。メイン部分だけ実装すれば良い ▪ (個人的には)楽さだけでなく、不要な頑張りコードがないと(=フォーマット整う と)本質部分のコード見やすい ▪ 移行が簡単だった ▪ 移行すること自体に重きが置かれており、それ系の説明わりと整ってる よかったところ -
confidential Mobility Technologies Co., あまりないが、 ▪ 自動化されているぶん、 「これって結局どう実行されてるんだっけ、コードの中まで見て確認しないと」 みたいなことは個人的には最初わりとあった ▪
(バージョン更新まだ多い。) Q. 柔軟性に欠けるかどうか? A. 今のところ、そう感じたことはなし。 ▪ 用途に合わせて自動更新止めたりも ▪ こういう実装に困った、みたいな話あったら聞きたい 不便だったところ -
confidential Mobility Technologies Co., “decoupling the research code from the
engineering” (docsより) PLの基本:LightningModule と Trainer LightningModule 基本的にこちらを実装 • init(__init__) • Train loop (training_step) • Validation loop (validation_step) • Test loop (test_step) • Optimizers (configure_optimizers) Trainer こちらはほぼ引数与えるだけ 今までのコードは消してよし • device設定 • logging設定 • profiler設定 • etc. 基本的な使い方 -
confidential Mobility Technologies Co., データ周りは LightningDataModule 推奨(前スライドのように、DataLoaderのままでも可) 基本的には、 今までの内容を移すだけ ▪
prepare_data (download, etc) ▪ setup (split, etc) ▪ train_dataloader ▪ val_dataloader ▪ test_dataloader データ周り:LightningDataModule 継承して自分のクラスを実装 -
confidential Mobility Technologies Co., データ周りは LightningDataModule 推奨(前スライドのように、DataLoaderのままでも可) 基本的には、 今までの内容を移すだけ ▪
prepare_data (download, etc) ▪ setup (split, etc) ▪ train_dataloader ▪ val_dataloader ▪ test_dataloader データ周り:LightningDataModule クラス名揃ってないのすいません笑 基本三点セット:Trainer・LightningModule・LightningDataModule -
confidential Mobility Technologies Co., LightningModule の基本実装(基本関数) モデル定義など。 training loop。 batchを受け取ってロスを返す。
optimizerの設定。 schedulerもここ。 inference用。 Minimal Example これだけ書けば、学習開始 LightningModuleを継承して自分のクラスを実装 -
confidential Mobility Technologies Co., LightningModule の基本実装(基本関数) モデル定義など。 training loop。 batchを受け取ってロスを返す。
optimizerの設定。 schedulerもここ。 inference用。 Minimal Example LightningModuleを継承して自分のクラスを実装 必須なのは training_step だが、 training/validation/testループそれぞれに3つのhook -
confidential Mobility Technologies Co., 各ループはそれぞれ3つのhook関数が定義できる *X=traning/validataion/test ▪ X_step ▪ X_step_end
▪ X_epoch_end *X_step_endは data parallelのときとか training/validation/test ループとデータフロー 擬似コード。X=trainの場合。 backwardとか含めると trainingの擬似コードはこう -
confidential Mobility Technologies Co., loggerの種類によらず共通の書き方。(どのlogger使うかとかはTrainerで) いつloggingするか、も引数で与えるだけ。 ▪ self.log() ▪ self.log_dict():まとめてdictで。
*他にも引数はあり(docs) logging の仕方 logの記載場所ごとのデフォルト設定 -
confidential Mobility Technologies Co., どのgpu使用するかはTrainerの引数で。 ▪ 学習コードからは、`.cuda()` などのコードは削除 ▪ 新たなtensorを定義するときは
`.type_as()` Device LightningModule側の扱い to(self.device) 使ってもよいかと -
confidential Mobility Technologies Co., precision=16指定するだけで使用可能 amp_level でレベル指定(参考:nvidia/apex amp level) ▪
pytorchネイティブのamp機能使うのであれば torch >= 1.6 AMP -
confidential Mobility Technologies Co., Checkpoint周り、デフォルトでは最後のエポックを保存。 カスタマイズするならcallbackのひとつである ModelCheckpointを使用 ▪ ディレクトリ名やファイル名 `epoch`とloggingしているメトリック名使える
▪ スコアが良いときのみ保存、とかするのであれば monitorでメトリックを指定 ▪ etc. Trainerにcallback引数として与える Callback - ModelCheckpoint -
confidential Mobility Technologies Co., 学習コードは変えずにTrainerへの引数変えるだけ ▪ tensorboard (default) ▪ wandb
▪ … Logger サポートされているLogger コード変えなくていいのは導入簡単でやはり嬉しい (selfからアクセス可能なので明示的に使用も可能) -
confidential Mobility Technologies Co., データセットサイズに応じて、気軽にValのタイミングやデータセットの使用量を決めたい Validation settings また、デバッグしたいときとかは 何エポックごとにvalするか 1エポック以下の場合や、
batch数で決めたり 使用するデータセットの割合 *shuffle=Trueだと 毎回違うサブセットになる -
confidential Mobility Technologies Co., 引数指定で簡単にプロファイリング ▪ ”simple” と ”advanced” 選べる
▪ ”advanced”は、テキスト出力選ばないと 長すぎてきつかった Profiler ”simple” profilerの結果例 ↓ %の上位から並べてくれるが、ちょっと包含関係とかが分かりづらかったり -
confidential Mobility Technologies Co., よかったところ:「さっくり使用機能の豊富さ+不要な頑張りコード排除」 w/ 移行のしやすさ まとめ LightningModule 基本的にこちらを実装
• init(__init__) • Train loop (training_step) • Validation loop (validation_step) • Test loop (test_step) • Optimizers (configure_optimizers) Trainer こちらはほぼ引数与えるだけ 今までのコードは消してよし • device設定 • logging設定 • profiler設定 • etc. LightningDataModule 基本三点セット