Igniteでpytorchの訓練コードを減らす
こんにちは。
ディープラーニングの訓練では、モデルを作って、データを準備して、訓練コードを回すとい順番になるかと思います。
pytorchはとてもロウ・レベルなAPIを提供していて、柔軟性に富んでいて素晴らしいのです。でも、訓練コードを書くときに詳細まで書かないといけなくて、少し大変だと感じています。
特に僕はKerasを多用していたから、pytorchで訓練コードを書いてると、もうちょっと簡単にできないかなと、ついつい思ってしまっていました。
で、調べてみるとpytorchの訓練コードを簡単に書けるようにしてくれるライブラリが何個かありました。
1.fast.ai : https://www.fast.ai/
2. Catalyst : https://catalyst-team.github.io/catalyst/
3. Lightining : https://www.pytorchlightning.ai/
4. Ignite : https://pytorch.org/ignite/index.html
どれも、それぞれ特徴があり場合によって使いわけが良いかと思いますが、この記事ではIgniteを紹介したいと思います。
僕が考えるIgniteの利点こんな感じです。
1. pytochのGitHubリポジトリ内になる
https://github.com/pytorch/ignite
Pytochのチームと関係しているかな?なんとなく安心感。
2. pytochのnn.Moduleを継承したモデル、DataLoaderをそのまま使って学習できる
fast.ai、Catalyst、Lightiningでは、独自のModuleを継承してモデルを作るみたいだけど、Igniteではpytochの純粋なnn.Moduleを使って学習できるし、Data Loaderもそのまんま使える。
3. コードからバッチ単位の処理のForループがなくなる
for X, target in train_loader:
optimizer.zero_grad()
output = model(X)
loss = loss_func(output, target)
loss.backward() optimizer.step()
pytorchではの訓練コードでは、こんな感じでバッチ単位でforループを回すのが一般的かと思います。多分この後に検証データのforループが来て。。。みたいな感じに。また、バッチ単位の処理やエポック単位の処理をこの間に挟んでいくと、コードの見通しがだんだん悪くなっていきます(僕の場合だけかもしれませんが)
Igniteでは、forループ処理はEngineという単位で書いて、その後にバッチ単位の処理やエポック単位の処理を書いていくスタイルです。
書き方はまた、別の記事で紹介できればと思っています。
4. Early Stopping、Metric計算、loggingなどの訓練に必要なものが一通りそろっている
僕は、keras出身なんでこういうのをいつも、準備されているAPIにお任せしていました。pytochではこういったの自分で書くのが主流みたいだけど、ちょっと大変。
loggingは、tensorboard、mlflowなどに対応していてだいたい共通の書き方で書けるので楽です。
今日はこの辺で終わります。また、Igniteの使い方とか書こうと思っています。ではでは。