PyTorch 1.4.0 リリースノート

PyTorch 1.4.0 リリースノート (翻訳)

翻訳 : (株)クラスキャット セールスインフォメーション
日時 : 01/17/2020

* 本ページは github PyTorch の releases の PyTorch 1.4.0 リリースノートに相当する、
“Mobile build customization, Distributed model parallel training, Java bindings, and more” の Highlights と New Features を翻訳したものです:

 

モバイル構築カスタマイゼーション、分散モデル並列訓練、Java バインディング, and more

ハイライト

PyTorch モバイル – ビルドレベル・カスタマイゼーション

1.3 リリースの PyTorch モバイル の試験的リリースに追随して、PyTorch 1.4 はきめ細かいレベルでビルドスクリプトをカスタマイズするための機能を含む追加のモバイル・サポートを追加します。これはモバイル開発者に、モデルで使用される演算子だけを含むことによりライブラリサイズを最適化し、そしてプロセス内でオンデバイスのリソースを著しく減じることを可能にします。初期の結果は例えば、カスタマイズされた MobileNetV2 は事前ビルドされた PyTorch モバイル・ライブラリよりも 40 % から 50% 小さいことを示しています。貴方自身のカスタムビルドをどのように作成するかについて 更に学習 してください、そして貴方が持つどのようなフィードバックでも提供するために PyTorch フォーラム 上のコミュニティと関わってください。

 

分散モデル並列訓練 [試験的]

RoBERTa のようなモデルのスケールとともに、数十億のパラメータへと増えて続け、モデル並列訓練は研究者が限界を越えることを助けるためにかつてなくより重要になっています。このリリースは分散モデル並列訓練をサポートするために分散 RPC フレームワークを提供します。それは関数を遠隔に実行して (リアルデータ周りをコピーすることなく) リモートオブジェクトを参照することを可能にし、透過に後方実行して RPC 境界に渡りパラメータを更新するために autograd と optimizer API を提供します。

API とこの特徴の設計について更に学習するために、下のリンクを見てください :

完全なチュートリアルについては、下のリンクを見てください :

いつものように、コミュニティ・メンバーと接続して フォーラム で更に議論することができます。

 

Java バインディング [試験的]

Python と C++ のサポートに加えて、このリリースは Java バインディングのための試験的サポートを追加します。PyTorch モバイルで Android のために開発されたインターフェイスに基づいて、新しいバインディングは任意の Java プログラムから TorchScript model を起動することを可能にします。Java バインディングはこのリリースについては Linux のためだけに、そして推論のためだけに利用可能であることに注意してください。サポートが続くリリースで拡充されることを予期しています。Java 内でどのように PyTorch を使用するかについては下のコードスニペットを見てください :

(訳注: スニペット欠落)

Java から PyTorch をどのように使用するかについて ここ で更に学習してください、そして完全な javadoc API ドキュメントをここ で見てください。

 

Pruning (枝刈り)

pruning 機能が PyTorch に nn.utils.prune モジュールで追加されました。これは一般的な大きさ (= magnitude) ベースとランダムな pruning テクニック、構造化そして非構造化の両者、層-wise とグローバルの両者のための独創的なサポートを提供し、そしてそれはまたユーザにより提供されたマスクからカスタム pruning も可能にします。

tensor を prune するためには、最初に nn.utils.prune で利用可能なものの中の pruning テクニックを選択します (あるいは BasePruningMethod をサブクラス化して貴方自身のものを実装します)。

from torch.nn.utils import prune
t = torch.rand(2, 5)
p = prune.L1Unstructured(amount=0.7)
pruned_tensor = p.prune(t)

モジュールを prune するためには、nn.utils.prune で利用可能な pruning 関数の一つを選択して (あるいは貴方自身のものを実装して) そしてどのモジュールそしてそのモジュール内のどのパラメータ上で pruning が作用するべきであるかを指定します。

m = nn.Conv2d(3, 1, 2)
prune.ln_structured(module=m, name='weight', amount=5, n=2, dim=1)

pruning は (上のサンプル内の) 重みをパラメータから属性に変えて、そしてそれを weight_orig (i.e. 初期パラメータ名に “_orig” を付加します) と呼ばれる新しいパラメータ (これは tensor の unpruned バージョンをストアします) と置き換えることによってモジュールを再パラメータ化します。pruning マスクは weight_mask (i.e. 初期パラメータ名に “_mask” を付加します) という名前のバッファとしてストアされます。pruning は、PyTorch の forward_pre_hooks を使用して更新されたマスクを伴う乗算を通して重みを再計算することにより各 forward パスの前に適用されます。

iterative pruning は同じパラメータ上で pruning 関数を繰り返し呼び出すことによりシームレス有効にされます (これは内部で PruningContainer を使用することにより連続するマスクの組み合わせを自動的に処理します)。

nn.utils.prune は BasePruningMethod 基底クラスをサブクラス化してそして新しい pruning テクニックのロジックに従ってマスクを計算するための手順を持つ compute_mask メソッドを実装することにより、新しい pruning 関数をサポートするために容易に拡張可能です。

 

新しい特徴

torch.optim

学習率スケジューラ (torch.optim.lr_scheduler) は今では “chaining” をサポートします。これは 2 つのスケジューラが定義されてそれらの効果を組み合わせるために次々にステップされます、下のサンプルを見てください。以前は、スケジューラはお互いに上書きするでしょう。

>>> import torch
>>> from torch.optim import SGD
>>> from torch.optim.lr_scheduler import ExponentialLR, StepLR
>>>
>>> model = [torch.nn.Parameter(torch.randn(2, 2, requires_grad=True))]
>>> optimizer = SGD(model, 0.1)
>>>
>>> scheduler1 = ExponentialLR(optimizer, gamma=0.9)
>>> scheduler2 = StepLR(optimizer, step_size=3, gamma=0.1)
>>>
>>> for epoch in range(4):
>>>     print(epoch, scheduler2.get_last_lr()[0])
>>>
>>>     optimizer.step()
>>>     scheduler1.step()
>>>     scheduler2.step()
    
0 0.1
1 0.09000000000000001
2 0.08100000000000002
3 0.00729000000000002
4 0.00656100000000002

 

分散

  • allgather_coalesced API を ProcessGroup に追加します。
  • ProcessGroupGloo Send/Recv Work で abort API を追加します。
  • launch コマンドで bash スクリプト・ラッパーを使用することを可能にするために –no_python を追加します。

 

RPC [試験的]

torch.distributed.rpc は新しく導入されたパッケージです。それはモデル訓練や推論で関数を遠隔に実行するための基本的なビルディングブロックを含みます、これらは分散モデル並列のようなシナリオやパラメータサーバ・フレームワークを実装するために有用でしょう。より具体的には、それは 4 つの柱を含みます : RPC、リモート参照、分散 Autograd そして分散 Optimizer です。より多くの詳細については ドキュメントチュートリアル を参照してください。

  • 組込み演算子と Python ユーザ関数のために rpc_sync と rpc_async を追加します。
  • 組込み演算子と Python ユーザ関数のために remote と RRef を追加します。
  • 分散 Autograd – FAST モード backward パス実装。
  • remote と RRef を分散 autograd と統合します。
  • 分散 optimizer を追加します。
  • 分散 autograd コンテキストから勾配を取得する get_gradients() メソッドのために python API を追加します。
  • ローカル値上のローカル RRef と to-self リモート呼び出しを作成するサポート。
  • RPC のためにカスタム pickler のサポート。
  • backend タイプに基づくデフォルト RPC エージェントオプションの追加。
  • ProcessGroup エージェントにローカルシャットダウンを追加する。

 

JIT

  • script::Module: nn.Module API の多くを実装する。
    • 特に、サブモジュール、パラメータ etc. に渡り反復する (オプションで再帰的な) メソッドを追加します。
    • 属性アクセスを単純化するために pybind-like な attr() メソッドを追加します。
  • ScriptModules 上の @staticmethod のためのサポートを追加します。
  • Iterable として Module Container をサポートする。
  • リスト内包での Iterable のサポート。
  • 辞書は今では挿入順序を保存します、そして OrderedDict がサポートされます。
  • hasattr() のためのサポートを追加する。
  • TorchScript クラスは今では callable になり得ます。
  • ScriptModule のために clone_instance を追加します。
  • TorchScript に torch.memory_format サポートを追加します。
  • container モジュール上で今ではカスタム forward() が許容されます。
  • サブモジュールへの呼び出しは今では traced グラフに保存されます。
  • モジュールコンテナが iterable として使用されるためのサポートを追加します。
  • JIT Serialization に任意の std::function<> IO をサポートさせる。
  • スクリプトで layout() をサポートする。
  • メソッドと関数はもはや serialized ファイル形式にインラインされません。

 

モバイル

  • ビルドレベルのカスタマイゼーション
  • selected 演算子を含めるためだけにカスタム・ビルドスクリプトを追加します。
  • スクリプトモジュールにより使用される演算子名をダンプする。
  • モバイル・カスタムビルドのために Android ラッパーで JIT optimizer を無効にする。
  • FBJNI Gradle ABI_FILTERS パラメータ。
 

以上