みんなが知らない
pytorh-pfn-extras
2021/06/18 第二回分析コンペLT会 オンライン
@tawatawara
自己紹介
JTC Kaggler(絶滅危惧種)
◦ 研究開発(?)職
◦ 社会人からMLを始める
Kaggle Master
◦ GMになりたい. . .
最近の活動
◦ 宇宙人と discommunication
Q. PyTorch の Training で
何を使ってますか?
Q. PyTorch の Training で何を使ってますか?
選択肢 得票数
Lightning 56
Ignite 2
pfn-extras 4
Catalyst 7
自作ライブラリ 38
その他 36
合計 143
Lightning さんの僅か 1/14!
この発表の意味…
Q. PyTorch の Training で何を使ってますか?
選択肢 投票数
Lightning 56
Ignite 2
pfn-extras 4
Catalyst 7
自作ライブラリ 38
その他 36
合計 143
自作 + その他 が半分
この人たちを pfn-extras 勢に…
pytorch-pfn-extras?
“Supplementary components to accelerate research and
development in PyTorch.” (公式レポジトリより)
◦ 独自の Trainer を持たない
◦ 基本的に training loop は自前で書く(Ignite との連携は可能)
◦ 主な機能: 学習停止の制御(Early Stopping など), ログ出力, モデルの保存
◦ 各機能を Extensions と呼ばれる Classとして実装
◦ Extensions を管理する Extensions Manager を training loop に組み込むだけで利用可
「過度な抽象化はNG」「今まで Training Tool を使ったことが無い」
という方に向いてるかも
おことわり
どういう機能があるかといったイメージだけお伝えします
◦ 詳細な使い方については説明しません
PyTorch による NN の training の基本は既知とします
◦ 生の Training Loop を書いたことがあれば問題ないです
使用例は最後に紹介する Notebook で勘弁してください
◦ GitHub に examples を用意しようと思っていた時もありました...
Start from Basic Training Loop
必要最小限 の code
◦ max_epoch だけ mini batch training を行う
◦ 重みの更新と言う意味でこれが最小限
色々足りない . . .
◦ validation set での性能確認 (+Early Stopping)
◦ 学習の経過の確認 (標準出力, log ファイル)
◦ 学習途中の model の保存
◦ validation set に対する loss/metric が良いもの
これらを自分で書くと結構大変… -> ライブラリに頼ろう!
Basic Training Loop w/ ExtensionsManager
とりあえず組み込んでみた形
Training Loop に対する変更点
① 一番外側の loop
◦ 学習の停止を manager が管理
② mini batch loop 内の with 文
◦ 基本的に 1 iteration 毎に処理を行う
◦ iteration, epoch のカウント
③ loss の reporting
◦ 内部的に値を保持
◦ 後ほど紹介する Extensions で確認できる
Basic Training Loop w/ ExtensionsManager
この時点では Extensions 無し
◦ 各 Epoch での loss が(内部的に)保持さ
れてるくらいしか違いが無い
この後
◦ Manager に Extensions を追加すること
で様々な機能を使用する
◦ Training Loop の形には基本影響しない
◦ 複雑な学習方法を loop 内で実装したりする
際にやりやすい
Extensions の追加(一例)
◦ manger.extend で追加
◦ ※manager の初期化時に渡すや
り方もあります
◦ Trigger を指定することも可能
◦ Training Loop はいじらない
Trigger: Extensions のタイミング制御
◦ 基本: IntervalTrigger
◦ N epoch 毎, N iterations 毎 を指定
◦ 多くのものは 1 epoch 毎がデフォルト
◦ 例で挙げたもの(右) もそう
◦ よく使う:値を参照する Trigger
◦ MinValueTrigger, MaxValueTrigger など
◦ 主に Model の保存(右)で活躍
◦ EarlyStoppingTrigger
◦ 文字通り Early Stopping のためのもの
◦ Manager に紐づく少し例外的な Trigger
Evaluator: validation data に対する推論
◦ eval_func を定義する必要あり
◦ unpack した mini batch を引数に
取り推論を実行する
◦ eval_func を返す関数を実装するの
がおすすめ
◦ 注意点:loss/metric の集計
◦ LogReport の起動時に集計される
◦ macro 平均になってしまう
◦ AUCなど全体で計算するものが困る
◦ 解決方法はありますが割愛
Extensions for Standard Output
◦ PrintReport : 学習過程を標準出力
◦ これが見たくて使ってるところある
◦ ProgressBar: 学習の進捗を出力
◦ 所要時間が分かりやすい
◦ 注意:Evaluator の時間を無視して
残り時間を計算している
◦ TensorBoard 使えばいいのでは
Extensions for Logging
◦ LogReport : ログファイルを Json で出力
◦ 因みに TensorBoard にも対応できる(らしい)
◦ PlotReport: loss 等のグラフを .png で出力
◦ TensorBoard とかで(略)
Extensions for snapshot
◦ 任意の object を指定して途中経過を保存
◦ Trigger を指定しない場合は 1 epoch 毎
◦ 基本的には val metric[loss] を指定した Max[Min]ValueTrigger を併用
◦ loss と metric の両方を見て保存したいなら両方追加すれば良い(以下)
色々追加した結果
Code 量がそれなりに嵩む
◦ eval_func 含めて Basic Training
Loop の 5~6倍ぐらい?
◦ Training Loop そのものは短い
◦ 量は嵩むが、Manager, Extensions,
Trigger の概念で機能拡張がされるの
で全体としてまとまる
◦ 自前で書くと Loop 内がゴチャゴチャ
するのが容易に想像出来る
ここまで
pytorch-pfn-extras とは?
◦ PyTorch の開発を促進するための補助ツール
◦ 主な機能:学習の制御、ログの出力、model の保存など
◦ 初歩的な Training Loop から乖離の少ない形で導入が出来る
◦ Extensions とそれらを統制する Manager によって実現
◦ code 量は嵩むが、様々な機能を統一概念で追加できるので全体がまとまる
◦ 細かい書き方については実例を見た方が早いかも
◦ 公式レポジトリの example
◦ pytorch-pfn-extrasが便利という話 - deoxy’s diary
◦ 【pytorch-pfn-extras+Ignite】画像分類のワークフロー解説 - ころがる狸
みんなが更に知らない
Config Systems
Config Systems?
Config File のための拡張機能
pfn-extras 使いですら知らない可能性がある
◦ そもそも公式の examples で使われていない
◦ docs も非常に簡素 (どう使うの?)
◦ LT にあたって調査したところ予想以上に便利
自己流ですが使用例をちょっとだけ紹介します
基本的な使い方(公式 docs より)
dict と list がネストしたオブジェクトを引数として初期化
◦ 例えば読み込んだ YAML ファイルを入れる(左)
◦ 格納された値には path 形式でアクセス出来る(右)
根幹機能1:別の値の参照
◦ ”@” で path を指定することで、アクセス
時に指定先の値に置換される
◦ 右の例も公式 docs より
◦ config file 内で同じ値を書くことはしばしば
あるので、地味に嬉しい機能
◦ 例:augmentation のために同じ画像サイズを
複数の場所に書く
◦ 相対パスも指定可能(右下)
根幹機能2:callable な object での置換
◦ str -> callable object の辞書を用意することで object の置換ができる
◦ 該当する `type` と同階層にあるものを引数として call される
◦ types の辞書は必要だが、get_XXX 系の関数が必要なくなる
◦ ※この例には top level のものしか入ってませんが nest した構造の中でも適用されます
二つを組み合わせると. . .?
例えば model -> optimizer ->
scheduler を cfg から直に呼べる
◦ optimizer は model.parameters(),
scheduler は optimizer を引数にとるが、
置換機能を組み合わせることで置換後の
object を引数に取れる
他の使用例
◦ dataset -> dataloader もほぼ同様
◦ ※dataset に工夫が必要かも
◦ config file 内に albumentations による
data augmentation をそのまま書ける
◦ もうオレオレ parser は要らない
◦ 前半で紹介した extensions なども全部
config にぶち込める
◦ types の 辞書が膨れ上がるけど…
◦ ほぼ定型なので、どこかに固めておけばあま
り気にならない
Kaggle Notebooks での使用例
以下を Config 内で閉じ、cfg[“XXX”] でインスタンス取得
◦ Model, Optimizer, Scheduler
◦ Dataset(albumentations 込み), DataLoader
◦ Loss, Metric
◦ ExtensionsManager, Extensions(Evaluator 以外)
https://www.kaggle.com/ttahara/seti-e-t-resnet18d-baseline
Kaggle Notebook での使用例
◦ 前半の例でかなり場所を取っていた Manager,
Extensions は全て config file 内に
◦ 別の場所の記述が増えるもののスッキリ
◦ ※ここには記載してませんが、config_types や
config file(YAML) はかなり記述量が増えます
まとめ
pytorch-pfn-extras を紹介
◦ 様々な機能を manager と extensions の枠組みで追加できる
◦ 素の Training Loop をほぼ崩さないので、初学者には優しい?
知られざる Config Systems の紹介
◦ get_XXX 関数を撲滅し、Training を行う関数が更にスッキリ
一見良さそうだが…?
◦ システム的に複雑なことをするのは自前で頑張る必要あり
◦ 複数のGPUでの並列学習, AMP Training, Gradient Accumulation …

みんなが知らない pytorch-pfn-extras

  • 1.
  • 2.
    自己紹介 JTC Kaggler(絶滅危惧種) ◦ 研究開発(?)職 ◦社会人からMLを始める Kaggle Master ◦ GMになりたい. . . 最近の活動 ◦ 宇宙人と discommunication
  • 3.
    Q. PyTorch のTraining で 何を使ってますか?
  • 4.
    Q. PyTorch のTraining で何を使ってますか? 選択肢 得票数 Lightning 56 Ignite 2 pfn-extras 4 Catalyst 7 自作ライブラリ 38 その他 36 合計 143 Lightning さんの僅か 1/14! この発表の意味…
  • 5.
    Q. PyTorch のTraining で何を使ってますか? 選択肢 投票数 Lightning 56 Ignite 2 pfn-extras 4 Catalyst 7 自作ライブラリ 38 その他 36 合計 143 自作 + その他 が半分 この人たちを pfn-extras 勢に…
  • 6.
    pytorch-pfn-extras? “Supplementary components toaccelerate research and development in PyTorch.” (公式レポジトリより) ◦ 独自の Trainer を持たない ◦ 基本的に training loop は自前で書く(Ignite との連携は可能) ◦ 主な機能: 学習停止の制御(Early Stopping など), ログ出力, モデルの保存 ◦ 各機能を Extensions と呼ばれる Classとして実装 ◦ Extensions を管理する Extensions Manager を training loop に組み込むだけで利用可 「過度な抽象化はNG」「今まで Training Tool を使ったことが無い」 という方に向いてるかも
  • 7.
    おことわり どういう機能があるかといったイメージだけお伝えします ◦ 詳細な使い方については説明しません PyTorch によるNN の training の基本は既知とします ◦ 生の Training Loop を書いたことがあれば問題ないです 使用例は最後に紹介する Notebook で勘弁してください ◦ GitHub に examples を用意しようと思っていた時もありました...
  • 8.
    Start from BasicTraining Loop 必要最小限 の code ◦ max_epoch だけ mini batch training を行う ◦ 重みの更新と言う意味でこれが最小限 色々足りない . . . ◦ validation set での性能確認 (+Early Stopping) ◦ 学習の経過の確認 (標準出力, log ファイル) ◦ 学習途中の model の保存 ◦ validation set に対する loss/metric が良いもの これらを自分で書くと結構大変… -> ライブラリに頼ろう!
  • 9.
    Basic Training Loopw/ ExtensionsManager とりあえず組み込んでみた形 Training Loop に対する変更点 ① 一番外側の loop ◦ 学習の停止を manager が管理 ② mini batch loop 内の with 文 ◦ 基本的に 1 iteration 毎に処理を行う ◦ iteration, epoch のカウント ③ loss の reporting ◦ 内部的に値を保持 ◦ 後ほど紹介する Extensions で確認できる
  • 10.
    Basic Training Loopw/ ExtensionsManager この時点では Extensions 無し ◦ 各 Epoch での loss が(内部的に)保持さ れてるくらいしか違いが無い この後 ◦ Manager に Extensions を追加すること で様々な機能を使用する ◦ Training Loop の形には基本影響しない ◦ 複雑な学習方法を loop 内で実装したりする 際にやりやすい
  • 11.
    Extensions の追加(一例) ◦ manger.extendで追加 ◦ ※manager の初期化時に渡すや り方もあります ◦ Trigger を指定することも可能 ◦ Training Loop はいじらない
  • 12.
    Trigger: Extensions のタイミング制御 ◦基本: IntervalTrigger ◦ N epoch 毎, N iterations 毎 を指定 ◦ 多くのものは 1 epoch 毎がデフォルト ◦ 例で挙げたもの(右) もそう ◦ よく使う:値を参照する Trigger ◦ MinValueTrigger, MaxValueTrigger など ◦ 主に Model の保存(右)で活躍 ◦ EarlyStoppingTrigger ◦ 文字通り Early Stopping のためのもの ◦ Manager に紐づく少し例外的な Trigger
  • 13.
    Evaluator: validation dataに対する推論 ◦ eval_func を定義する必要あり ◦ unpack した mini batch を引数に 取り推論を実行する ◦ eval_func を返す関数を実装するの がおすすめ ◦ 注意点:loss/metric の集計 ◦ LogReport の起動時に集計される ◦ macro 平均になってしまう ◦ AUCなど全体で計算するものが困る ◦ 解決方法はありますが割愛
  • 14.
    Extensions for StandardOutput ◦ PrintReport : 学習過程を標準出力 ◦ これが見たくて使ってるところある ◦ ProgressBar: 学習の進捗を出力 ◦ 所要時間が分かりやすい ◦ 注意:Evaluator の時間を無視して 残り時間を計算している ◦ TensorBoard 使えばいいのでは
  • 15.
    Extensions for Logging ◦LogReport : ログファイルを Json で出力 ◦ 因みに TensorBoard にも対応できる(らしい) ◦ PlotReport: loss 等のグラフを .png で出力 ◦ TensorBoard とかで(略)
  • 16.
    Extensions for snapshot ◦任意の object を指定して途中経過を保存 ◦ Trigger を指定しない場合は 1 epoch 毎 ◦ 基本的には val metric[loss] を指定した Max[Min]ValueTrigger を併用 ◦ loss と metric の両方を見て保存したいなら両方追加すれば良い(以下)
  • 17.
    色々追加した結果 Code 量がそれなりに嵩む ◦ eval_func含めて Basic Training Loop の 5~6倍ぐらい? ◦ Training Loop そのものは短い ◦ 量は嵩むが、Manager, Extensions, Trigger の概念で機能拡張がされるの で全体としてまとまる ◦ 自前で書くと Loop 内がゴチャゴチャ するのが容易に想像出来る
  • 18.
    ここまで pytorch-pfn-extras とは? ◦ PyTorchの開発を促進するための補助ツール ◦ 主な機能:学習の制御、ログの出力、model の保存など ◦ 初歩的な Training Loop から乖離の少ない形で導入が出来る ◦ Extensions とそれらを統制する Manager によって実現 ◦ code 量は嵩むが、様々な機能を統一概念で追加できるので全体がまとまる ◦ 細かい書き方については実例を見た方が早いかも ◦ 公式レポジトリの example ◦ pytorch-pfn-extrasが便利という話 - deoxy’s diary ◦ 【pytorch-pfn-extras+Ignite】画像分類のワークフロー解説 - ころがる狸
  • 19.
  • 20.
    Config Systems? Config Fileのための拡張機能 pfn-extras 使いですら知らない可能性がある ◦ そもそも公式の examples で使われていない ◦ docs も非常に簡素 (どう使うの?) ◦ LT にあたって調査したところ予想以上に便利 自己流ですが使用例をちょっとだけ紹介します
  • 21.
    基本的な使い方(公式 docs より) dictと list がネストしたオブジェクトを引数として初期化 ◦ 例えば読み込んだ YAML ファイルを入れる(左) ◦ 格納された値には path 形式でアクセス出来る(右)
  • 22.
    根幹機能1:別の値の参照 ◦ ”@” でpath を指定することで、アクセス 時に指定先の値に置換される ◦ 右の例も公式 docs より ◦ config file 内で同じ値を書くことはしばしば あるので、地味に嬉しい機能 ◦ 例:augmentation のために同じ画像サイズを 複数の場所に書く ◦ 相対パスも指定可能(右下)
  • 23.
    根幹機能2:callable な objectでの置換 ◦ str -> callable object の辞書を用意することで object の置換ができる ◦ 該当する `type` と同階層にあるものを引数として call される ◦ types の辞書は必要だが、get_XXX 系の関数が必要なくなる ◦ ※この例には top level のものしか入ってませんが nest した構造の中でも適用されます
  • 24.
    二つを組み合わせると. . .? 例えばmodel -> optimizer -> scheduler を cfg から直に呼べる ◦ optimizer は model.parameters(), scheduler は optimizer を引数にとるが、 置換機能を組み合わせることで置換後の object を引数に取れる
  • 25.
    他の使用例 ◦ dataset ->dataloader もほぼ同様 ◦ ※dataset に工夫が必要かも ◦ config file 内に albumentations による data augmentation をそのまま書ける ◦ もうオレオレ parser は要らない ◦ 前半で紹介した extensions なども全部 config にぶち込める ◦ types の 辞書が膨れ上がるけど… ◦ ほぼ定型なので、どこかに固めておけばあま り気にならない
  • 26.
    Kaggle Notebooks での使用例 以下をConfig 内で閉じ、cfg[“XXX”] でインスタンス取得 ◦ Model, Optimizer, Scheduler ◦ Dataset(albumentations 込み), DataLoader ◦ Loss, Metric ◦ ExtensionsManager, Extensions(Evaluator 以外) https://www.kaggle.com/ttahara/seti-e-t-resnet18d-baseline
  • 27.
    Kaggle Notebook での使用例 ◦前半の例でかなり場所を取っていた Manager, Extensions は全て config file 内に ◦ 別の場所の記述が増えるもののスッキリ ◦ ※ここには記載してませんが、config_types や config file(YAML) はかなり記述量が増えます
  • 28.
    まとめ pytorch-pfn-extras を紹介 ◦ 様々な機能をmanager と extensions の枠組みで追加できる ◦ 素の Training Loop をほぼ崩さないので、初学者には優しい? 知られざる Config Systems の紹介 ◦ get_XXX 関数を撲滅し、Training を行う関数が更にスッキリ 一見良さそうだが…? ◦ システム的に複雑なことをするのは自前で頑張る必要あり ◦ 複数のGPUでの並列学習, AMP Training, Gradient Accumulation …