Github: https://github.com/taolei87/sru
約
SRUは、cuDNN LSTMよりも10倍以上高速に実行できる繰り返し単位であり、多くのタスクで精度のテストを行います。
GTX 1070でテストされたLSTM、conv2d、SRUの平均処理時間
たとえば、上の図は、32サンプルの単一ミニバッチの処理時間を示しています。 SRUはLSTMと比較して10倍から16倍のスピードアップを実現し、conv2dを使用したワードレベルのコンボリューションと同じ速さ(または高速)で動作します。
参照:
@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を参照してください。
- 分類
- 質問応答(SQuad)
- PTB上の言語モデリング
- 音声認識 ( 注: PyTorchではなくCNTKで実装)
- 機械翻訳: SRNはJianyu ZhanとSasha Rushの OpenNMT-pyに含まれています。 テストのための@jingxilにも感謝します。 ここの結果を参照してください。
貢献者
https://github.com/taolei87/sru/graphs/contributors
その他の実装
@musyokuはchainerに非常に素晴らしいSRU実装を持っていました。