PyTorch Ignite 0.4.8 : 概要 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/01/2022 (0.4.8)
* 本ページは、PyTorch Ignite の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
PyTorch Ignite 0.4.8 : 概要
TL;DR
Ignite は柔軟に透過的に PyTorch のニューラルネットワークを訓練して評価するのに役立つ高位ライブラリです。
特徴
- 最大限の制御と単純性を保証しながら、純粋な PyTorch よりも少ないコード
- ライブラリ・アプローチ、そしてプログラムの制御反転はありません – 必要なところで必要なときに ignite を使用してください。
- メトリクス、実験マネージャ、そして他のコンポーネントのための拡張可能な API
Why Ignite?
Ignite は 3 つの高位の機能を提供する ライブラリ です :
- 非常に単純なエンジンとイベントシステム
- モデルを容易に評価するための out-of-the-box なメトリクス
- 訓練パイプラインを構成し、アーティファクトをセーブしてパラメータとメトリクスをログ記録するための組込みハンドラ
単純化された訓練と検証ループ
エポックと反復の for/while ループをコーディングする必要は最早ありません。ユーザはエンジンをインスタンス化してそれらを実行します。
from ignite.engine import Engine, Events, create_supervised_evaluator
from ignite.metrics import Accuracy
# Setup training engine:
def train_step(engine, batch):
# Users can do whatever they need on a single iteration
# Eg. forward/backward pass for any number of models, optimizers, etc
# ...
trainer = Engine(train_step)
# Setup single model evaluation engine
evaluator = create_supervised_evaluator(model, metrics={"accuracy": Accuracy()})
def validation():
state = evaluator.run(validation_data_loader)
# print computed metrics
print(trainer.state.epoch, state.metrics)
# Run model's validation at the end of each epoch
trainer.add_event_handler(Events.EPOCH_COMPLETED, validation)
# Start the training
trainer.run(training_data_loader, max_epochs=100)
イベント & ハンドラのパワー
ハンドラによるクールなことはそれらが (例えばコールバックと比較して) 比類ない柔軟性を提供することです。ハンドラは任意の関数であり得ます : e.g. lambda, 単純な関数、クラスメソッド等。これにより、インターフェイスから継承してその抽象メソッドを override する必要はありません、それは貴方のコードとその複雑さを不必要に増大させる可能性があります。
望むときにはいつでも任意の数の関数を実行します
trainer.add_event_handler(Events.STARTED, lambda _: print("Start training"))
# attach handler with args, kwargs
mydata = [1, 2, 3, 4]
logger = ...
def on_training_ended(data):
print(f"Training is ended. mydata={data}")
# User can use variables from another scope
logger.info("Training is ended")
trainer.add_event_handler(Events.COMPLETED, on_training_ended, mydata)
# call any number of functions on a single event
trainer.add_event_handler(Events.COMPLETED, lambda engine: print(engine.state.times))
@trainer.on(Events.ITERATION_COMPLETED)
def log_something(engine):
print(engine.state.output)
組込みイベント・フィルタリング
# run the validation every 5 epochs
@trainer.on(Events.EPOCH_COMPLETED(every=5))
def run_validation():
# run validation
# change some training variable once on 20th epoch
@trainer.on(Events.EPOCH_STARTED(once=20))
def change_training_variable():
# ...
# Trigger handler with customly defined frequency
@trainer.on(Events.ITERATION_COMPLETED(event_filter=first_x_iters))
def log_gradients():
# ...
幾つかのアクションを共有するためにイベントをスタックする
複数の呼び出しを有効にするためにイベントは一緒にスタックできます :
@trainer.on(Events.COMPLETED | Events.EPOCH_COMPLETED(every=10))
def run_validation():
# ...
標準イベントを越えるためのカスタムイベント
backward と optimizer ステップに関連するカスタムイベント :
from ignite.engine import EventEnum
class BackpropEvents(EventEnum):
BACKWARD_STARTED = 'backward_started'
BACKWARD_COMPLETED = 'backward_completed'
OPTIM_STEP_COMPLETED = 'optim_step_completed'
def update(engine, batch):
# ...
loss = criterion(y_pred, y)
engine.fire_event(BackpropEvents.BACKWARD_STARTED)
loss.backward()
engine.fire_event(BackpropEvents.BACKWARD_COMPLETED)
optimizer.step()
engine.fire_event(BackpropEvents.OPTIM_STEP_COMPLETED)
# ...
trainer = Engine(update)
trainer.register_events(*BackpropEvents)
@trainer.on(BackpropEvents.BACKWARD_STARTED)
def function_before_backprop(engine):
# ...
- 完全なスニペットは ここ で見つかります。
- カスタムイベントの他のユースケース: Truncated Backprop Through Time のための trainer。
Out-of-the-box メトリクス
- 様々なタスクのための メトリクス : Precision, Recall, Accuracy, 混同行列, IoU 等, ~20 回帰メトリクス。
- ユーザは算術演算 or torch メソッドを使用して既存のものから 独自のメトリクス を容易に構成することもできます。
precision = Precision(average=False)
recall = Recall(average=False)
F1_per_class = (precision * recall * 2 / (precision + recall))
F1_mean = F1_per_class.mean() # torch mean method
F1_mean.attach(engine, "F1")
インストール
From pip:
pip install pytorch-ignite
From conda:
conda install ignite -c pytorch
From source:
pip install git+https://github.com/pytorch/ignite
Getting Started
Few pointers to get you started:
- クイック・スタートガイド : Essentials of getting a project up and running
- ライブラリのコンセプト : エンジン, イベント & ハンドラ, State, メトリクス
- Full-featured テンプレート・サンプル (coming soon …)
ドキュメント
- Stable API ドキュメントとライブラリの概要 : https://pytorch.org/ignite/
- 開発版 API ドキュメント : https://pytorch.org/ignite/master/
- FAQ, “Questions on Github” と “Questions on Discuss.PyTorch“.
- プロジェクトのロードマップ
追加資料
- Distributed Training Made Easy with PyTorch-Ignite
- PyTorch エコシステム Day 2021 Breakout セッション・プレゼンテーション
- PyTorch-Ignite についてのチュートリアル・ブログ投稿
- 8 Creators and Core Contributors Talk About Their モデル訓練ライブラリ From PyTorch エコシステム
- Ignite Posters from Pytorch 開発者コンファレンス :
サンプル
チュートリアル
- 畳込みニューラルネットワークを使用するテキスト分類
- 変分オートエンコーダ
- Fashion-MNIST データセットを分類するための畳込みニューラルネットワーク
- 馬からシマウマへ Nvidia/Apex で Cycle-GAN を訓練する – W&B 上のログ
- 馬からシマウマへ Native Torch CUDA AMP で Cycle-GAN のもう一つの訓練 – W&B 上のログ
- CIFAR100 上で EfficientNet-B0 を再調整する
- Ax でハイパーパラメータ調整
- MNIST 上の LR finder の基本サンプル
- ベンチマーク Cifar100 上の混合精度訓練 : torch.cuda.amp vs nvidia/apex
- 単一 TPU 上の MNIST 訓練
- マルチ TPU 上の CIFAR10 訓練
- MNIST 訓練サンプル上のハンドラ time profiling の基本サンプル
再現性のある訓練サンプル
torchvision/references に触発され、ビジョンタスクのための幾つかの再現性のあるベースラインを提供します :
- ImageNet – logs on Ignite Trains server coming soon …
- Pascal VOC2012 – logs on Ignite Trains server coming soon …
機能 :
- 分散訓練 : native or horovod and using PyTorch native AMP
コード生成アプリケーション
PyTorch-Ignite で訓練スクリプトを作成する最も簡単な方法は :
Citing Ignite
(訳注: 原文 参照)
以上