Slide 1

Slide 1 text

今日から始める PyTorch Lightning 2021.4.23 カラサワ 社内のCV輪講で使用した資料です

Slide 2

Slide 2 text

confidential Mobility Technologies Co., PyTorch Lightning [Docs] ■ 3月にPLデビューしていい感じだったので共有。 タイトル通り「今日から始める」人向け、な気がします。 ■ ちなみにですが、こういう系の他フレームワークも使ったことない人です。 そのため他フレームワークに比べて、とかはわからず。 はじめに

Slide 3

Slide 3 text

confidential Mobility Technologies Co., 「さっくり使用機能の豊富さ+不要な頑張りコード排除」 w/ 移行のしやすさ ■ 形式に則って実装しておけば、引数与えるだけ、とかで豊富な機能を使用できる。 ■ ターミナル表示やロギングなど、毎回書くコードの排除。メイン部分だけ実装すれば良い ■ (個人的には)楽さだけでなく、不要な頑張りコードがないと(=フォーマット整う と)本質部分のコード見やすい ■ 移行が簡単だった ■ 移行すること自体に重きが置かれており、それ系の説明わりと整ってる よかったところ

Slide 4

Slide 4 text

confidential Mobility Technologies Co., あまりないが、 ■ 自動化されているぶん、 「これって結局どう実行されてるんだっけ、コードの中まで見て確認しないと」 みたいなことは個人的には最初わりとあった ■ (バージョン更新まだ多い。) Q. 柔軟性に欠けるかどうか?  A. 今のところ、そう感じたことはなし。 ■ 用途に合わせて自動更新止めたりも ■ こういう実装に困った、みたいな話あったら聞きたい 不便だったところ

Slide 5

Slide 5 text

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. 基本的な使い方

Slide 6

Slide 6 text

confidential Mobility Technologies Co., データ周りは LightningDataModule 推奨(前スライドのように、DataLoaderのままでも可) 基本的には、 今までの内容を移すだけ ■ prepare_data (download, etc) ■ setup (split, etc) ■ train_dataloader ■ val_dataloader ■ test_dataloader データ周り:LightningDataModule  継承して自分のクラスを実装

Slide 7

Slide 7 text

confidential Mobility Technologies Co., データ周りは LightningDataModule 推奨(前スライドのように、DataLoaderのままでも可) 基本的には、 今までの内容を移すだけ ■ prepare_data (download, etc) ■ setup (split, etc) ■ train_dataloader ■ val_dataloader ■ test_dataloader データ周り:LightningDataModule  クラス名揃ってないのすいません笑 基本三点セット:Trainer・LightningModule・LightningDataModule

Slide 8

Slide 8 text

LightningModule Trainer

Slide 9

Slide 9 text

・・・ 元々書いてたコード

Slide 10

Slide 10 text

・・・ LightningModuleで書くコード ざっくりですが。

Slide 11

Slide 11 text

confidential Mobility Technologies Co., LightningModule の基本実装(基本関数) モデル定義など。 training loop。 batchを受け取ってロスを返す。 optimizerの設定。 schedulerもここ。 inference用。 Minimal Example これだけ書けば、学習開始 LightningModuleを継承して自分のクラスを実装

Slide 12

Slide 12 text

confidential Mobility Technologies Co., LightningModule の基本実装(基本関数) モデル定義など。 training loop。 batchを受け取ってロスを返す。 optimizerの設定。 schedulerもここ。 inference用。 Minimal Example LightningModuleを継承して自分のクラスを実装 必須なのは training_step だが、 training/validation/testループそれぞれに3つのhook

Slide 13

Slide 13 text

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の擬似コードはこう

Slide 14

Slide 14 text

confidential Mobility Technologies Co., loggerの種類によらず共通の書き方。(どのlogger使うかとかはTrainerで) いつloggingするか、も引数で与えるだけ。 ■ self.log() ■ self.log_dict():まとめてdictで。 *他にも引数はあり(docs) logging の仕方 logの記載場所ごとのデフォルト設定

Slide 15

Slide 15 text

confidential Mobility Technologies Co., https://github.com/karasawatakumi/monodepth-dev/blob/master/src/plmodel.py サンプル

Slide 16

Slide 16 text

confidential Mobility Technologies Co., (+α)Manual optimization Manual Optimization 自分はまだ使ったことないです

Slide 17

Slide 17 text

LightningModule Trainer

Slide 18

Slide 18 text

とりあえず先に、 使ってるコード こうした方がいいとかあれば教えて下さい !

Slide 19

Slide 19 text

confidential Mobility Technologies Co., どのgpu使用するかはTrainerの引数で。 ■ 学習コードからは、`.cuda()` などのコードは削除 ■ 新たなtensorを定義するときは `.type_as()` Device LightningModule側の扱い to(self.device) 使ってもよいかと

Slide 20

Slide 20 text

confidential Mobility Technologies Co., precision=16指定するだけで使用可能 amp_level でレベル指定(参考:nvidia/apex amp level) ■ pytorchネイティブのamp機能使うのであれば torch >= 1.6 AMP

Slide 21

Slide 21 text

confidential Mobility Technologies Co., Checkpoint周り、デフォルトでは最後のエポックを保存。 カスタマイズするならcallbackのひとつである ModelCheckpointを使用 ■ ディレクトリ名やファイル名 `epoch`とloggingしているメトリック名使える ■ スコアが良いときのみ保存、とかするのであれば monitorでメトリックを指定 ■ etc. Trainerにcallback引数として与える Callback - ModelCheckpoint

Slide 22

Slide 22 text

confidential Mobility Technologies Co., Callbackを継承して、使用するhookを実装 Callback - Custom 使用可能なhook一覧 ModelCheckpointの例

Slide 23

Slide 23 text

confidential Mobility Technologies Co., 学習コードは変えずにTrainerへの引数変えるだけ ■ tensorboard (default) ■ wandb ■ … Logger サポートされているLogger コード変えなくていいのは導入簡単でやはり嬉しい (selfからアクセス可能なので明示的に使用も可能)

Slide 24

Slide 24 text

confidential Mobility Technologies Co., データセットサイズに応じて、気軽にValのタイミングやデータセットの使用量を決めたい Validation settings また、デバッグしたいときとかは 何エポックごとにvalするか 1エポック以下の場合や、 batch数で決めたり 使用するデータセットの割合 *shuffle=Trueだと 毎回違うサブセットになる

Slide 25

Slide 25 text

confidential Mobility Technologies Co., 引数指定で簡単にプロファイリング ■ ”simple” と ”advanced” 選べる ■ ”advanced”は、テキスト出力選ばないと 長すぎてきつかった Profiler ”simple” profilerの結果例 ↓ %の上位から並べてくれるが、ちょっと包含関係とかが分かりづらかったり

Slide 26

Slide 26 text

confidential Mobility Technologies Co., おまけ:Time comparison +3%くらい [引用元]

Slide 27

Slide 27 text

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 基本三点セット