PyTorch Ignite 0.4.2 : 概要 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 02/07/2021 (0.4.2)
* 本ページは、PyTorch Ignite ドキュメントの以下のページを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。
人工知能研究開発支援 | 人工知能研修サービス | テレワーク & オンライン授業を支援 |
PoC(概念実証)を失敗させないための支援 (本支援はセミナーに参加しアンケートに回答した方を対象としています。) |
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション |
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/ |
Facebook: https://www.facebook.com/ClassCatJP/ |
PyTorch Ignite 0.4.2 : 概要
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 # E.g. 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“.
- プロジェクトのロードマップ
サンプル
サンプルの完全なリストは ここ で見つけられます。
チュートリアル
- 畳込みニューラルネットワークを使用するテキスト分類
- 変分オートエンコーダ
- 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 の基本サンプル
以上