PyTorch Lightning 1.1 : 概要

PyTorch Lightning 1.1 : 概要 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 02/01/2021 (1.1.x)

* 本ページは、PyTorch Lightning ドキュメントの以下のページを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

無料セミナー実施中 クラスキャット主催 人工知能 & ビジネス Web セミナー

人工知能とビジネスをテーマにウェビナー (WEB セミナー) を定期的に開催しています。スケジュールは弊社 公式 Web サイト でご確認頂けます。
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
  • Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。
クラスキャットは人工知能・テレワークに関する各種サービスを提供しております :

人工知能研究開発支援 人工知能研修サービス テレワーク & オンライン授業を支援
PoC(概念実証)を失敗させないための支援 (本支援はセミナーに参加しアンケートに回答した方を対象としています。)

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/
Facebook: https://www.facebook.com/ClassCatJP/

 

PyTorch Lightning 1.1 : 概要

高パフォーマンス AI 研究のための軽量 PyTorch ラッパーです。モデルをスケールし、ボイラープレートではありません。

 

ニュース

 

PyTorch Lightning は単なる体系化された PyTorch です

Lightning はエンジニアリングからサイエンスを分離するために PyTorch コードのもつれを解きます。

 

Lightning 哲学

Lightning はこれらの原則を念頭において設計されています :

原則 1 : 最大限の柔軟性を可能にする。原理 2 : 不要なボイラープレートを取り去りますが、必要なときにはアクセス可能にします。原理 3 : システムは自己充足的であるべきです (i.e. optimizer、計算コード等)。原理 4 : 深層学習コードは 4 つの異なるカテゴリーに体系化されるべきです。

  • 研究コード (LightningModule)。
  • エンジニアリング・コード ( 除去し、そして Trainer により処理されます)。
  • 本質的でない研究コード (ロギング等… これは Callback に行きます)。
  • データ (PyTorch Dataloader を使用するかそれらを LightningDataModule に体系化します)。

ひとたびこれを行えば、貴方のコードを変更することなくマルチ GPU, TPU, CPU 上、そして 16-bit precision 内でさえ訓練できます。

2 ステップガイド で始めてください。

 

推論

Lightning はまた AI 研究者とプロダクション・チームが BERT と自己教師あり学習のようなものをスケールアップする必要がある高速な推論のためにも設計されています。Lightning はそれらのケースのために ONNX や TorchScript に自動的にエクスポートできます。

 

How To Use

ステップ 0: インストール

PyPI からの単純なインストール :

pip install pytorch-lightning

完全なパッケージ経験を得るには、pytorch-lightning[‘extra’] あるいは CPU ユーザのためには pytorch-lightning[‘cpu-extra’] で総てのオプションの依存性をインストールすることもできます。

From Conda

conda install pytorch-lightning -c conda-forge

 

ステップ 1 : これらのインポートを追加する

import os
import torch
from torch import nn
import torch.nn.functional as F
from torchvision.datasets import MNIST
from torch.utils.data import DataLoader, random_split
from torchvision import transforms
import pytorch_lightning as pl

 

ステップ 2 : LightningModule (nn.Module サブクラス) を定義する

LightningModule は完全なシステム (ie: a GAN, オートエンコーダ, BERT or 単純な画像分類器) を定義します。

class LitAutoEncoder(pl.LightningModule):

    def __init__(self):
        super().__init__()
        self.encoder = nn.Sequential(nn.Linear(28 * 28, 128), nn.ReLU(), nn.Linear(128, 3))
        self.decoder = nn.Sequential(nn.Linear(3, 128), nn.ReLU(), nn.Linear(128, 28 * 28))

    def forward(self, x):
        # in lightning, forward defines the prediction/inference actions
        embedding = self.encoder(x)
        return embedding

    def training_step(self, batch, batch_idx):
        # training_step defined the train loop. It is independent of forward
        x, y = batch
        x = x.view(x.size(0), -1)
        z = self.encoder(x)
        x_hat = self.decoder(z)
        loss = F.mse_loss(x_hat, x)
        self.log('train_loss', loss)
        return loss

    def configure_optimizers(self):
        optimizer = torch.optim.Adam(self.parameters(), lr=1e-3)
        return optimizer

Note: training_step は訓練ループを定義します。forward は推論/予測の間に LightningModule がどのように動作するかを定義します。

 

ステップ 3 : 訓練!

dataset = MNIST(os.getcwd(), download=True, transform=transforms.ToTensor())
train, val = random_split(dataset, [55000, 5000])

autoencoder = LitAutoEncoder()
trainer = pl.Trainer()
trainer.fit(autoencoder, DataLoader(train), DataLoader(val))

そしてコードの単一行を変更することなしに、GPU/TPU 上で実行できるでしょう。

# 8 GPUs
trainer = Trainer(max_epochs=1, gpus=8)

# 256 GPUs
trainer = Trainer(max_epochs=1, gpus=8, num_nodes=32)

# TPUs
trainer = Trainer(tpu_cores=8)

そして onnx や torchscript を通してプロダクションのためにエクスポートさえできるでしょう。

# torchscript
autoencoder = LitAutoEncoder()
torch.jit.save(autoencoder.to_torchscript(), "model.pt")

# onnx
with tempfile.NamedTemporaryFile(suffix='.onnx', delete=False) as tmpfile:
    autoencoder = LitAutoEncoder()
    input_sample = torch.randn((1, 64))
    autoencoder.to_onnx(tmpfile.name, input_sample, export_params=True)
    os.path.isfile(tmpfile.name)

上級ユーザのためには、依然として複雑な訓練ループを所有できます。

class LitAutoEncoder(pl.LightningModule):
    def training_step(self, batch, batch_idx, optimizer_idx):
        # access your optimizers with use_pl_optimizer=False. Default is True
        (opt_a, opt_b) = self.optimizers(use_pl_optimizer=True)

        loss_a = ...
        self.manual_backward(loss_a, opt_a)
        opt_a.step()
        opt_a.zero_grad()

        loss_b = ...
        self.manual_backward(loss_b, opt_b, retain_graph=True)
        self.manual_backward(loss_b, opt_b)
        opt_b.step()
        opt_b.zero_grad()

 

主要な特徴

  • モデルを変更することなく任意のハードウェア (CPU, GPU, TPU) 上で実行するために貴方のモデルをスケールできます。
  • 研究コードをエンジニアリングから切り離すことによりコードの可読性を高めます。
  • より容易に再現する
  • 訓練ループとトリッキーなエンジニアリングを自動化することによりエラーを少ない傾向にします。
  • 総ての柔軟性を保持しながら (LightningModule は依然として PyTorch モジュールです)、多くのボイラープレートは取り除きます。
  • Lightning はポピュラーなロギング/可視化フレームワーク (Tensorboard, MLFlow, Neptune.ai, Comet.ml, Wandb) との out-of-the-box な統合を持ちます。
  • 総ての新しい PR で厳密にテストしました。PyTorch と Python サポート・バージョン、総ての OS、マルチ GPU そして TPU とさえも総ての組合せをテストしています。
  • 最小限の実行スピードのオーバーヘッド (純粋な PyTorch に比べてエポック毎に約 300 ms)。

 

Lightning は DL/ML 研究の 40+ パーツを自動化する

  • GPU 訓練
  • 分散 GPU (クラスタ) 訓練
  • TPU 訓練
  • EarlyStopping
  • ロギング / 可視化
  • チェックポインティング
  • 実験管理
  • 完全なリストはここです
 

以上