PyTorch 0.1.12 リリースノート (翻訳)
翻訳 : (株)クラスキャット セールスインフォメーション
日時 : 05/05/2017
* 本ページは、github PyTorch の releases の PyTorch 0.1.12 リリースノートに該当する、”Sparse support for CUDA, bug fixes, performance improvements” を翻訳したものです:
https://github.com/pytorch/pytorch/releases/tag/v0.1.12
API 変更
- torch.range は torch.arange を支持するために deprecated となりました、それは numpy 及び python range と首尾一貫するものです。
- sparse Tensor において、contiguous は coalesce と名前変更されて coalesce は今では不適当です (out-of-place) (注意しておくと、sparse API は依然として実験的で進化中です、そのため後方互換性は提供しません)。
新しい特徴
新しい層と関数
- torch.topk は今では全ての CUDA タイプのためにサポートされています、torch.cuda.FloatTensor のためだけではなく。
- three-way ranking loss が追加されました : nn.TripletMarginLoss
- インスタンス毎の正規化層を追加しました : nn.InstanceNorm1d, nn.InstanceNorm2d, nn.InstanceNorm3d。各チャネルは正規化するためのインスタンスとして扱われ、mean-subtraction と std-division が行なわれます。これは、BatchNorm のような効果が望まれる、より大きな画像とより小さなミニバッチを処理する時に有用です。
- nn.ZeroPad2d と nn.ConstantPad2d が追加されました。
- nn.Bilinear が追加されました、これは Y = X1 * W * X2 + b を計算します。
全ての関数のための負次元サポート
次元引数を取る全ての単一の関数は負次元を取ることもまた可能でしょう。
負次元はテンソルを最後の次元からインデックスします。
例えば :
x = torch.randn(10, 20, 30) y = torch.mean(x, dim = -1)
ここで、x は 3 次元を持ちそして dim=-1、 最後の次元、i.e. dim=3 が平均 (mean) を取るために選択されます。
次元引数を持つ関数は :
narrow, transpose, size, cat, chunk, gather, index_select, split, squeeze, stack, unbind, unsqueeze, cumprod, cumsum, mean, median, mode, norm, prod, std, sum, var, kthvalue, max, min, sort, topk, renorm, index_add, index_copy, index_fill, scatter, select, unfold
Sparse Tensor (疎テンソル) のための CUDA サポート、より速い CPU sparse
今では torch.sparse API の一部はまた torch.cuda.sparse.*Tensor のためにもサポートされます。
CUDA 上でサポートされる関数は :
sparse_mask, to_dense, coalesce, transpose, spaddmm spcadd, mul, div, cadd, csub, cmul
nn.Embedding は今では sparse を (sparse=True フラグで) CUDA 上でさえもサポートし、これらの sparse 関数を梃子入れします。
新しいハイブリッドな行列乗算 hspmm 演算は疎行列に密行列を掛けてハイブリッド・テンソル形式で返します (i.e. 1 sparse dimension, 1 dense dimension)。
CPU sparse 関数の幾つかはより効率的な実装を持ちます。
Table times of seconds / batch | ||
_ | CPU | CUDA |
Dense | 10 | 0.86 |
Sparse | 0.15 | 0.13 |
特定のパラメータ型をフィルタ除去する named_parameters
仮に、貴方のモデルのバイアスを除く全てのパラメータに重み減衰を付加することを望むとします。モデルのバイアスだけをどのように得ますか?このために nn.Module.named_parameters を導入します。それは、モデルの特定の属性をフィルタすることを助けるために named_children と named_modules を結合します。
モデルのバイアスをフィルタ除去する例でそれらには 0 の weight_decay を与えます :
import torch import torch.nn as nn import torch.optim as optim m = nn.Sequential( nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 20), nn.ReLU(), ) weights, biases = [], [] for name, p in m.named_parameters(): if 'bias' in name: biases += [p] else: weights += [p] optim.SGD([ {'params': weights}, {'params': biases, weight_decay=0} ], lr=1e-2, momentum=0.9, weight_decay=1e-5)
パフォーマンス改良
- cumsum と cumprod は適切な場所で幾つかの thrust primitive の使用を通して GPU 上で本質的に高速化されました。
- LSTMCell と GRUCell は今では fused kernel を通して GPU 上で本質的に高速化されました。
- CuDNN のためのデフォルト・アルゴリズムは PRECOMP_GEMM に変更されました、これはわずかな作業領域を必要としますが遥に高速なアルゴリズムです。以前は、作業領域ゼロの IMPLICIT_GEMM を使用していましたがこれは本質的により遅いです。
- バッチの共有メモリとの直接照合によりデータ・ローダにおいて 5 % から 10 % の改善。
- SVD は今では divide-and-conquer (sgesdd) を通して GPU 上で計算されます、これは 2x から 5x の高速化を与えます。
- より小さいモデルでより良い性能を持つために、一般に使用される関数 expand は C に移されました。
バグ修正
- THNN 関数の巨大な範囲のために重みとバイアス上で連続的なチェックを追加しました。
- lower と upper bound が指定された時に random_ correct の範囲を作成します。
- parallel_apply は今では unhashable な引数を取ることができます。
- Dot 関数で grad を正しく reshape します (入力が 1D ベクトルである必要はありません…)。
- Added Variable.type_as を追加しました。
- p=norm_type, dim=dim を持つように norm と renorm の引数名を統一しました。
- btrisolve は CPU double 上で動作します。
- __dir__ を実装することで torch.nn.Module のための ipython autocomplete が修正されました。
- F.data_parallel において device_ids は今では再度 None を取ることが可能で、利用可能な GPU を使用できます。
- BatchNorm (<5.1.10) と Dilation (6.0.20) における cudnn バグの回避。
- Conv1d CPU における Padding バグ修正。
- remainder and cremainder は integer 型のために修正されました。
- btrisolve と getri におけるメモリ・リークを修正。
- 任意の例外により nn.Module のソースが取得できない時、シリアライゼーションを no-fatal として処理します。
- collate_fn は今では numpy 配列の型を保持します。
- is_tensor and is_storage は今では old-style Python クラスのために修正されました。
- torch.cat は今ではキーワード引数をサポートします。
- CUDA collectives は coalescing をサポートしていましたが、入力は全て同じテンソル型であると仮定されていました。これは修正されました。
- 特定の linux ディストロ (特に ArchLinux) において基礎となる glibc バグによる autograd の deadlock バグを修正しました。
- abs は今では char と short cuda 型のために修正されました。
- 次元引数が与えられた時の torch.diag autograd を修正。
- bias=False の時の CPU 上の grouped convolution を修正しました。
- ConvTranspose*d のための dilated convolutions を公開しました。
- HingeEmbeddingLoss のバグを修正、今ではそこで margin が kwargs 経由で指定可能です。
改善されたエラー・メッセージ
- CUDA デバイスが利用可能でない時のエラーとメッセージを修正しました。
以上