PyTorch 1.7.0 リリースノート

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

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

* 本ページは github PyTorch の releases の PyTorch 1.7.0 リリースノートに相当する、
“PyTorch 1.7 released w/ CUDA 11, New APIs for FFTs, Windows support for Distributed training and more” の Highlights を翻訳したものです:

 

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

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

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

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

 

CUDA 11、FFT のための新しい API、分散訓練のための Windows サポート等と共にリリースされた PyTorch 1.7

ハイライト

PyTorch 1.7 リリースは NumPy 互換 FFT 演算のためのサポートを含む多くの新しい API、プロファイリング・ツールそして分散データ並列 (DDP) と遠隔手続き呼び出し (RPC) の両者ベースの分散訓練への主要な更新を含みます。更に、stable に移された幾つかの特徴は、カスタム C++ クラス、メモリプロファイラー、カスタム tensor-like オブジェクの作成、RPC のユーザ非同期関数そして (Per-RPC タイムアウト、DDP 動的 bucketing と RRef ヘルパー) のようなtorch.distributed の多くの他の特徴を含みます。

幾つかのハイライトは以下を含みます :

  • CUDA 11 は今では PyTorch.org で利用可能なバイナリで公式にサポートされます。
  • RPC と autograd profiler の TorchScript と Stack トレースのためのプロファイリングとパフォーマンスへのアップデートと追加。
  • (Beta) torch.fft 経由の NumPy 互換高速フーリエ変換 (FFT) のためのサポート。
  • (Prototype) Nvidia A100 generation GPU とネイティブ TF32 形式のためのサポート。
  • (Prototype) Windows 上の分散訓練が今ではサポートされます。

 

フロントエンド API

[Beta] NumPy 互換 torch.fft モジュール

FFT-関連機能は信号処理のような様々な科学分野で一般に使用されます。PyTorch が歴史的に 2, 3 の FFT-関連関数をサポートしてきた一方で、1.7 リリースは NumPy と同じ API を持つ FFT-関連関数を実装する新しい torch.fft モジュールを追加します。

この新しいモジュールは 1.7 リリースで使用されるためにインポートされなければなりません、何故ならばその名前は歴史的な (そして今では deprecated な) torch.fft 関数とぶつかるからです。

サンプル使用方法 :

>>> import torch.fft
>>> t = torch.arange(4)
>>> t
tensor([0, 1, 2, 3])

>>> torch.fft.fft(t)
tensor([ 6.+0.j, -2.+2.j, -2.+0.j, -2.-2.j])

>>> t = tensor([0.+1.j, 2.+3.j, 4.+5.j, 6.+7.j])
>>> torch.fft.fft(t)
tensor([12.+16.j, -8.+0.j, -4.-4.j,  0.-8.j])

 

[Beta] Transformer NN モジュールのための C++ サポート

PyTorch 1.5 から、python と C++ フロントエンド API の間の等価性を維持し続けました。このアップデートは開発者に C++ フロントエンドからの nn.transformer モジュール抽象を利用することを可能にします。そして更に、開発者は python/JIT からモジュールをセーブして C++ にロードする必要がもはやありません、何故ならばそれは今では C++ で直接利用できるからです。

 

[Beta] torch.set_deterministic

プログラムをデバッグしてテストするとき再現性 (bit-for-bit 決定論) はエラーを識別するのに役立つかもしれません。再現性を容易にするため、PyTorch 1.7 は torch.set_deterministic(bool) を追加しています、これは PyTorch 演算子が (利用可能なときには) 決定論的アルゴリズムを選択して、そして演算子が非決定論的動作という結果になるかもしれない場合にはランタイムエラーを投げるように指示することができます、デフォルトでは、この関数が制御するフラグは false で挙動に変化はありません、PyTorch はデフォルトではその演算子を非決定論的に実装するかもしれないことを意味します。

より正確には、このフラグが true のときは :

  • 決定論的実装を持たないことが知られている演算子はランタイムエラーを投げる ;
  • 決定論的変数を持つ演算子はそれらの変数を使用する (通常はパフォーマンス・ペナルティ v.s. 非決定論的バージョンを伴います) ; そして
  • torch.backends.cudnn.deterministic = True が設定されます。

PyTorch プログラムの単一実行内 の決定論のためにこれは必要ですが、十分ではありません。乱数 generator のようなランダムネスの他のソース、未知の演算子、あるいは非同期や分散計算は依然として非決定論的動作を引き起こすかもしれません。

影響を受ける演算子のリストについては torch.set_deterministic(bool) のためのドキュメントを見てください。

 

パフォーマンス & プロファイリング

[Beta] プロファイラに追加されたスタック・トレース

ユーザは今ではプロファイラー出力テーブルの演算子名/入力だけでなく演算子がコードのどこにあるかも見ることができます。この機能を利用するためにワークフローは非常に少しの変更を要求します。ユーザは以前のように autograd プロファイラーを利用しますが、オプションの新しいパラメータ: with_stack and group_by_stack_n と共にです。

注意: 通常のプロファイリング実行はこの特徴を利用するべきではありません、それは著しいオーバーヘッドを追加するからです。

 

分散訓練 & RPC

[Stable] 今では PyTorch docker イメージにバンドルされた TorchElastic

Torchelastic はフォールト・トレランスと伸張性 (= elasticity) のための追加特徴を持つ、現在の torch.distributed.launch CLI の厳密なスーパーセットを供給します。ユーザがフォールト・トレランスに興味がない場合、(torch.distributed.launch で手動で指定されることに対して) 自動割当て RANK と MASTER_ADDR|PORT の追加された便利性とともに max_restarts=0 を設定することにより正確な機能/動作の等価を得ることができます。

torchelastic を PyTorch と同じ docker イメージにバンドルすることにより、ユーザは torchelastic を別途インストールしなければならないことなく torchelastic で実験をすぐに開始することができます。便利性に加えて、このワークは既存の Kubeflow の分散 PyTorch 演算子の elastic パラメータのためのサポートを追加するときあると助かります。

  • 使用例とどのように開始するか | リンク

 

[Beta] DDP の均質でないデータセットのためのサポート

PyTorch 1.7 は異なるプロセスに渡り均質でない (= uneven) データセットサイズによる訓練を可能にするため、torch.nn.parallel.DistributedDataParallel を使用して訓練されたモデルと併せて使用される新しいコンテキスト・マネージャを導入します。この特徴は DDP を使用するとき大きな柔軟性を有効にしてデータセットサイズが異なるプロセスに渡り同じであることをユーザが手動で確実にしなければならないことを防ぎます。このコンテキスト・マネージャで、DDP は均質でないデータセットサイズを自動的に処理します、これは訓練の最後にエラーやハングアップを回避できます。

 

[Beta] NCCL 信頼性 – 非同期エラー/タイムアウト処理

過去において、NCCL 訓練実行は stuck collectives により不明瞭にハングアップし、ユーザにとって非常に不愉快な経験に繋がりました。この特徴は潜在的なハングアップが検出された場合 stuck collectives を中断して例外を投げて/プロセスをクラッシュします。torchelastic (これは最後のチェックポイントから訓練プロセスをリカバーできます) のようなものと共に使用されるとき、ユーザは分散訓練について遥かに大きな信頼性を持つことができます。この特徴は完全に opt-in でこの機能を有効にするためには明示的に設定される必要がある環境変数の背後に居座ります (さもなければユーザは以前と同じ動作を見ます)。

 

[Beta] TorchScript remote と rpc_sync

torch.distributed.rpc.rpc_async は前のリリースで TorchScript で利用可能になりました。PyTorch 1.7 については、この機能は残りの 2 つのコア RPC API torch.distributed.rpc.rpc_sync と torch.distributed.rpc.remote で拡張されました。これは TorchScript のサポートのために対象とされた主要 RPC API を完了します、それは TorchScript 内で (script 関数か script メソッド内で、これは python グローバル Interpreter ロックを解放します) 既存の python RPC API を利用することをユーザに可能にしてそしてアプリケーション性能をマルチスレッド環境で多分改良する可能性があります。

 

[Beta] TorchScript サポートを持つ分散 optimizer

PyTorch は訓練アルゴリズムのための optimizer の広範なセットを提供し、そしてこれらは python API の一部として繰り返し使用されてきました。けれども、ユーザはしばしばマルチプロセス訓練の代わりにマルチスレッド訓練を使用することを望みます、何故ならばそれは大規模スケール分散訓練 (e.g. 分散モデル並列) や任意の RPC-ベースの訓練アプリケーションのコンテキストでより良いリソース使用と効率性を提供するからです。ユーザは以前の分散 optimizer ではこれを行なうことができませんでした、何故ならばこれを達成するには python グローバル Interpreter ロック (GIL) 制限を取り除く必要があるためです。

PyTorch 1.7 では、GIL を除去するために分散 optimizer で TorchScript サポートを有効にしています、そしてマルチスレッド化アプリケーションで optimizer を実行することを可能にしています。新しい分散 optimizer は以前と正確に同じインターフェイスを持ちますが、それは各 GIL をフリーにするため各ワーカーの optimizer を自動的に TorchScript に変換します。これは functional optimizer コンセプトを利用して optimizer の計算部分を TorchScript に変換することを分散 optimizer に可能にすることにより成されます。これは分散モデル並列訓練のようなユースケースに役立ちそしてマルチスレッディングを使用してパフォーマンスを改良します。

現在、TorchScript による自動変換をサポートする唯一の optimizer は Adagrad でそして総ての他の optimizer は TorchScript サポートなしに依然として以前のように動作します。私達は総ての PyTorch optimizer に範囲を広げるために作業していて将来的なリリースでより多くのものが生じることを予期しています。TorchScript サポートを有効にする使用方法は自動的で既存の python API と正確に同じです、これをどのように使用するかのサンプルがここにあります :

import torch.distributed.autograd as dist_autograd
import torch.distributed.rpc as rpc
from torch import optim
from torch.distributed.optim import DistributedOptimizer

with dist_autograd.context() as context_id:
  # Forward pass.
  rref1 = rpc.remote("worker1", torch.add, args=(torch.ones(2), 3))
  rref2 = rpc.remote("worker1", torch.add, args=(torch.ones(2), 1))
  loss = rref1.to_here() + rref2.to_here()

  # Backward pass.
  dist_autograd.backward(context_id, [loss.sum()])

  # Optimizer, pass in optim.Adagrad, DistributedOptimizer will
  # automatically convert/compile it to TorchScript (GIL-free)
  dist_optim = DistributedOptimizer(
     optim.Adagrad,
     [rref1, rref2],
     lr=0.05,
  )
  dist_optim.step(context_id)

 

[Beta] RPC-ベースのプロファイリングへの拡張

RPC フレームワークとともに PyTorch プロファイラを使用するためのサポートは PyTorch 1.6 で最初に導入されました。PyTorch 1.7 では、以下の拡張が行なわれました :

  • RPC に渡る TorchScript 関数のプロファイリングのためのより良いサポートを実装しました
  • RPC とともに動作するプロファイラ特徴の視点からパリティを得ました。
  • サーバ側で非同期 RPC 関数のためのサポートを追加しました (rpc.functions.async_execution で修飾された関数)。

ユーザは今では torch.autograd.profiler.profile() と torch.autograd.profiler.record_function によるような馴染みのあるプロファイリング・ツールを使用できます、そしてこれは full 特徴サポートを持つ RPC フレームワークで透過的に動作し、非同期関数と TorchScript 関数をプロファイリングします。

 

[Prototype] 分散訓練のための Windows サポート

PyTorch 1.7 は Windows プラットフォーム上の DistributedDataParallel と collective な通信のためのプロトタイプ・サポートをもたらします。このリリースでは、サポートは Gloo-based ProcessGroup と FileStore だけをカバーします。複数マシンに渡りこの特徴を利用するためには、init_process_group で共有ファイルシステムからファイルを供給してください。

# initialize the process group
dist.init_process_group(
    "gloo",
    # multi-machine example:
    # Shared files need six "/"
    # init_method = `"file://////{machine}/{share_folder}/file"`
    # Local file need three "/"
    init_method="file:///{your local file path}",
    rank=rank,
    world_size=world_size
)

model = DistributedDataParallel(local_model, device_ids=[rank])

 

モバイル

PyTorch Mobile は CocoapodsJCenter のそれぞれで利用可能なバイナリパッケージで iOSAndroid の両者をサポートします。PyTorch-Mobile については ここ でより多くを学習できます。

 

[Beta] パフォーマンス改良のための PyTorch Mobile キャッシング・アロケータ

Pixel のような幾つかのモバイル・プラットフォームでは、メモリがシステムにより積極的に返されることを観察しました。これは頻度の高いページフォルトという結果になります、何故ならば functional フレームワークである PyTorch は演算子のための状態を維持しないからです。このため殆どの ops について、op の各実行上の出力は動的に割当てられます。これによるパフォーマンス・ペナルティを改良するため、PyTorch 1.7 は CPU のための単純なキャッシング・アロケータを提供します。アロケータは tensor サイズによる割当てをキャッシュし、そして現在は PyTorch C++ API を通してのみ利用可能です。キャッシング・アロケータ自身はクライアントにより所有されてそのためアロケータのライフタイムはまたクライアント・コードにより維持されます。そのようなクライアントが所持したキャシング・アロケータはそれからスコープガード, c10::WithCPUCachingAllocatorGuard によりそのスコープ内でキャッシュされた割当ての利用を可能にするために利用できます。

サンプル使用方法

#include <c10/mobile/CPUCachingAllocator.h>
.....
c10::CPUCachingAllocator caching_allocator;
  // Owned by client code. Can be a member of some client class so as to tie the
  // the lifetime of caching allocator to that of the class.
.....
{
  c10::optional<c10::WithCPUCachingAllocatorGuard> caching_allocator_guard;
  if (FLAGS_use_caching_allocator) {
    caching_allocator_guard.emplace(&caching_allocator);
  }
  ....
  model.forward(..);
}
.....

NOTE: キャッシング・アローケータはモバイルビルド上でのみ利用可能です、そのためモバイルビルド外のキャッシング・アロケータの使用は有効ではありません。

 

以上