GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

taolei87

sru – RNNsをCNNs( )と同じくらい速くトレーニングする

投稿日:

RNNsをCNNs( https://arxiv.org/abs/1709.02755 )と同じくらい速くトレーニングする

SRUは、cuDNN LSTMよりも10倍以上高速に実行できる繰り返し単位であり、多くのタスクで精度のテストを行います。


GTX 1070でテストされたLSTM、conv2d、SRUの平均処理時間

たとえば、上の図は、32サンプルの単一ミニバッチの処理時間を示しています。 SRUはLSTMと比較して10倍から16倍のスピードアップを実現し、conv2dを使用したワードレベルのコンボリューションと同じ速さ(または高速)で動作します。

参照:

RNNをCNNと同じくらい速くトレーニングする

@article{lei2017sru,
  title={Training RNNs as Fast as CNNs},
  author={Tao Lei, Yu Zhang and Yoav Artzi},
  journal={arXiv preprint arXiv:1709.02755},
  year={2017}
}

要件

pip install -r requirements.txt requirements.txtを介して要件をpip install -r requirements.txt CuPyとpynvrtcは、実行時にCUDAコードを呼び出し可能な関数にコンパイルする必要がありました。 単一のGPUトレーニングのみがサポートされています。

SRUの使用法はnn.LSTM似ていnn.LSTM SRUは、LSTMより多くのスタッキング層を必要とする可能性が高い。 必要に応じて2つのレイヤーから開始し、必要に応じて詳細を使用することをおすすめします(詳細は実験の詳細をご覧ください)。

import torch
from torch.autograd import Variable
from cuda_functional import SRU, SRUCell

# input has length 20, batch size 32 and dimension 128
x = Variable(torch.FloatTensor(20, 32, 128).cuda())

input_size, hidden_size = 128, 128

rnn = SRU(input_size, hidden_size,
    num_layers = 2,          # number of stacking RNN layers
    dropout = 0.0,           # dropout applied between RNN layers
    rnn_dropout = 0.0,       # variational dropout applied on linear transformation
    use_tanh = 1,            # use tanh?
    use_relu = 0,            # use ReLU?
    use_selu = 0,            # use SeLU?
    bidirectional = False,   # bidirectional RNN ?
    weight_norm = False,     # apply weight normalization on parameters
    layer_norm = False,      # apply layer normalization on the output of each layer
    highway_bias = 0         # initial bias of highway gate (<= 0)
)
rnn.cuda()

output_states, c_states = rnn(x)      # forward pass

# output_states is (length, batch size, number of directions * hidden size)
# c_states is (layers, batch size, number of directions * hidden size)

cuda_functional.pyと共有ライブラリcuda/lib64がシステムによって見つけられることを確認してください。

export LD_LIBRARY_PATH=/usr/local/cuda/lib64
export PYTHONPATH=path_to_repo/sru

PYTHONPATHを使用PYTHONPATH代わりに、SRUモジュールをpython setup.py installまたはpip install介して標準パッケージとしてインストールすることができます。 このPRを参照してください。

貢献者

https://github.com/taolei87/sru/graphs/contributors

その他の実装

@musyokuchainerに非常に素晴らしいSRU実装を持っていました。

@adrianbgCPUバージョンを実装しました。

To-do

  • ReLU活性化
  • nn.DataParallelを介してマルチGPUをサポートしnn.DataParallelここの例を参照
  • 層正規化
  • 重量正規化
  • SeLU活性化
  • 残余
  • パックされたシーケンスをサポートする







-taolei87
-, , ,

執筆者: