GitHubじゃ!Pythonじゃ!

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

pytorch

fairseq – Facebook AI Research Pythonで書かれたSequence-to-Sequence Toolkit

投稿日:

Facebook AI Research Pythonで書かれたSequence-to-Sequence Toolkitです。

前書き

Fairseq(-py)は、研究者や開発者が翻訳、要約、その他のテキスト生成タスク用のカスタムモデルを訓練できるようにするシーケンスモデリングツールキットです。 以下のものを含む、さまざまなシーケンス・ツー・シーケンス・モデルのリファレンス・インプリメンテーションを提供します。

Fairseqは、1つのマシンまたは複数のマシンでのマルチGPU(分散)トレーニング、CPUとGPUでの高速ビーム検索の生成、およびいくつかのベンチマーク変換データセットの事前訓練モデルを備えています。

要件とインストール

現在fairseqにはPyTorchバージョン> = 0.4.0が必要です。 こちらの手順に従ってください: https : //github.com/pytorch/pytorch#installation

Dockerを使用する場合は、共有メモリのサイズを、 – --ipc=hostまたは--shm-size nvidia-docker run --shm-sizeコマンドラインオプションとして--shm-size

PyTorchをインストールした後、次のようにfairseqをインストールできます。

pip install -r requirements.txt
python setup.py build
python setup.py develop

クイックスタート

次のコマンドラインツールが提供されています。

  • python preprocess.py :データ前処理:ボキャブラリの作成とトレーニングデータのバイナリ化
  • python train.pyつまたは複数のGPUで新しいモデルをpython train.py
  • python generate.py :訓練されたモデルで前処理されたデータを変換する
  • python interactive.py :訓練されたモデルで原文を翻訳する
  • python score.py :参照翻訳に対する生成された翻訳のBLEU採点

事前訓練を受けたモデルの評価

まず、あらかじめ訓練されたモデルをそのボキャブラリと一緒にダウンロードします。

$ curl https://s3.amazonaws.com/fairseq-py/models/wmt14.v2.en-fr.fconv-py.tar.bz2 | tar xvjf -

このモデルでは、 BPE(Byte Pair Encoding)ボキャブラリが使用されるため、変換前にソーステキストにエンコーディングを適用する必要があります。 これは、 wmt14.en-fr.fconv-cuda/bpecodesファイルを使用してapply_bpe.pyスクリプトを使用してwmt14.en-fr.fconv-cuda/bpecodesできます。 @@は継続マーカーとして使用され、オリジナルのテキストは、例えばsed s/@@ //g--remove-bpeフラグをgenerate.py渡すことで簡単に回復できます。 BPEの前に、入力テキストをmosesdecoderの tokenizer.perlを使用してtokenizer.perlする必要があります。

python interactive.pyを使ってpython interactive.pyに翻訳を生成しましょう。 ここでは、ビームサイズを5とします。

$ MODEL_DIR=wmt14.en-fr.fconv-py
$ python interactive.py \
 --path $MODEL_DIR/model.pt $MODEL_DIR \
 --beam 5
| loading model(s) from wmt14.en-fr.fconv-py/model.pt
| [en] dictionary: 44206 types
| [fr] dictionary: 44463 types
| Type the input sentence and press return:
> Why is it rare to discover new marine mam@@ mal species ?
O       Why is it rare to discover new marine mam@@ mal species ?
H       -0.06429661810398102    Pourquoi est-il rare de découvrir de nouvelles espèces de mammifères marins ?
A       0 1 3 3 5 6 6 8 8 8 7 11 12

この生成スクリプトは、4つのタイプの出力を生成します.Sを先頭に付けた行は、ボキャブラリを適用した後に供給されたソース文を示します。 Oは元の原文のコピーです。 Hは平均対数尤度とともに仮説である。 Aは、テキストから省略された文末マーカを含む、仮説における各単語の注目最大値である。

利用可能な事前訓練されたモデルの完全なリストについては、 以下をご確認ください。

新しいモデルのトレーニング

データ前処理

Fairseqには、IWSLT 2014(ドイツ語 – 英語)、WMT 2014(英語 – フランス語)、WMT 2014(英語 – ドイツ語)などのいくつかの翻訳データセットのサンプル前処理スクリプトが含まれています。 IWSLTデータセットを前処理して二値化するには:

$ cd data/
$ bash prepare-iwslt14.sh
$ cd ..
$ TEXT=data/iwslt14.tokenized.de-en
$ python preprocess.py --source-lang de --target-lang en \
  --trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \
  --destdir data-bin/iwslt14.tokenized.de-en

これにより、model data-bin/iwslt14.tokenized.de-en training data-bin/iwslt14.tokenized.de-enモデルトレーニングに使用できる2進化されたデータが書き込まれdata-bin/iwslt14.tokenized.de-en

トレーニング

python train.pyを使って新しいモデルを訓練する。 ここでは、IWSLT 2014データセットでうまくいくいくつかの設定例を示します。

$ mkdir -p checkpoints/fconv
$ CUDA_VISIBLE_DEVICES=0 python train.py data-bin/iwslt14.tokenized.de-en \
  --lr 0.25 --clip-norm 0.1 --dropout 0.2 --max-tokens 4000 \
  --arch fconv_iwslt_de_en --save-dir checkpoints/fconv

デフォルトでは、 python train.pyはマシン上で利用可能なすべてのGPUを使用します。 特定のGPUを選択したり、使用するGPUデバイスの数を変更するには、 CUDA_VISIBLE_DEVICES環境変数を使用します。

また、バッチサイズはバッチあたりのトークンの最大数( --max-tokens )で指定されます。 お使いのシステムで使用可能なGPUメモリに応じて、より小さい値を使用する必要があります。

世代

モデルを訓練したら、 python generate.py (バイナリ化されたデータの場合)またはpython interactive.py (生のテキストの 場合)を使って翻訳を生成することができます

$ python generate.py data-bin/iwslt14.tokenized.de-en \
  --path checkpoints/fconv/checkpoint_best.pt \
  --batch-size 128 --beam 5
  | [de] dictionary: 35475 types
  | [en] dictionary: 24739 types
  | data-bin/iwslt14.tokenized.de-en test 6750 examples
  | model fconv
  | loaded checkpoint trainings/fconv/checkpoint_best.pt
  S-721   danke .
  T-721   thank you .
  ...

CPUのみで翻訳を生成するには、– --cpuフラグを使用します。 BPE継続マーカーは--remove-bpeフラグで削除できます。

事前訓練を受けたモデル

事前にトレーニングされた完全畳み込みシーケンス・シーケンス・モデルを提供します。

さらに、上記のモデルには、前処理済みおよび二値化されたテストセットが用意されています。

バイナリ化されたテストセットの生成は、次のようにバッチモードで実行できます。たとえば、GTX-1080tiのWMT 2014英語 – フランス語:

$ curl https://s3.amazonaws.com/fairseq-py/models/wmt14.v2.en-fr.fconv-py.tar.bz2 | tar xvjf - -C data-bin
$ curl https://s3.amazonaws.com/fairseq-py/data/wmt14.v2.en-fr.newstest2014.tar.bz2 | tar xvjf - -C data-bin
$ python generate.py data-bin/wmt14.en-fr.newstest2014  \
  --path data-bin/wmt14.en-fr.fconv-py/model.pt \
  --beam 5 --batch-size 128 --remove-bpe | tee /tmp/gen.out
...
| Translated 3003 sentences (96311 tokens) in 166.0s (580.04 tokens/s)
| Generate test with beam=5: BLEU4 = 40.83, 67.5/46.9/34.4/25.5 (BP=1.000, ratio=1.006, syslen=83262, reflen=82787)

# Scoring with score.py:
$ grep ^H /tmp/gen.out | cut -f3- > /tmp/gen.out.sys
$ grep ^T /tmp/gen.out | cut -f2- > /tmp/gen.out.ref
$ python score.py --sys /tmp/gen.out.sys --ref /tmp/gen.out.ref
BLEU4 = 40.83, 67.5/46.9/34.4/25.5 (BP=1.000, ratio=1.006, syslen=83262, reflen=82787)

分散バージョン

fairseqの分散トレーニングはtorch.distributedの上に実装されています。 トレーニングは、GPUごとに1つのワーカープロセスを起動することから始まります。 これらのワーカーは、初期接続を確立するために使用できる一意のホストとポート(必須)を介してお互いを発見します。 さらに、各作業者にはランクが与えられます。ランクは0からn-1までの一意の数値で、nはGPUの総数です。

SLURMで管理されているクラスタで実行する場合は、次のコマンドを使用して、8つのGPU(合計128 GPU)を持つ16ノードのWMT 2014データセットで大規模な英語 – フランス語モデルをトレーニングできます。

$ DATA=... # path to the preprocessed dataset, must be visible from all nodes
$ PORT=9218 # any available tcp port that can be used by the trained to establish initial connection
$ sbatch --job-name fairseq-py --gres gpu:8 --nodes 16 --ntasks-per-node 8 \
    --cpus-per-task 10 --no-requeue --wrap 'srun --output train.log.node%t \
    --error train.stderr.node%t.%j python train.py $DATA --distributed-world-size 128 \
    --distributed-port $PORT --force-anneal 50 --lr-scheduler fixed --max-epoch 55 \
    --arch fconv_wmt_en_fr --optimizer nag --lr 0.1,4 --max-tokens 3000 \
    --clip-norm 0.1 --dropout 0.1 --criterion label_smoothed_cross_entropy \
    --label-smoothing 0.1 --wd 0.0001'

あるいは、各GPUごとに1つのプロセスを手動で開始する必要があります。

$ DATA=... # path to the preprocessed dataset, must be visible from all nodes
$ HOST_PORT=your.devserver.com:9218 # has to be one of the hosts that will be used by the job \
    and the port on that host has to be available
$ RANK=... # the rank of this process, has to go from 0 to 127 in case of 128 GPUs
$ python train.py $DATA --distributed-world-size 128 \
      --force-anneal 50 --lr-scheduler fixed --max-epoch 55 \
      --arch fconv_wmt_en_fr --optimizer nag --lr 0.1,4 --max-tokens 3000 \
      --clip-norm 0.1 --dropout 0.1 --criterion label_smoothed_cross_entropy \
      --label-smoothing 0.1 --wd 0.0001 \
      --distributed-init-method='tcp://$HOST_PORT' --distributed-rank=$RANK

fairseqコミュニティに参加する

引用

あなたの論文でコードを使用する場合は、次のように引用してください。

@inproceedings{gehring2017convs2s,
  author    = {Gehring, Jonas, and Auli, Michael and Grangier, David and Yarats, Denis and Dauphin, Yann N},
  title     = "{Convolutional Sequence to Sequence Learning}",
  booktitle = {Proc. of ICML},
  year      = 2017,
}

ライセンス

fairseq(-py)はBSDライセンスです。 ライセンスは、事前に訓練されたモデルにも適用されます。 我々はまた、追加の特許付与を提供する。

クレジット

これは、Facebook AI Researchのシーケンスツーシーケンスラーニングツールキットである、fairseqのPyTorchバージョンです。 この再実装の原作者は(特別な順序はない)Sergey Edunov、Myle Ott、Sam Grossである。







-pytorch
-, ,

執筆者: