Fairseq (for PyTorch) : README.md
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 07/10/2018 (0.1.0)
* 本ページは、github 上の pytorch/fairseq の README.md を動作確認・翻訳した上で適宜、補足説明したものです:
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
Python で書かれた Facebook AI Research Sequence-to-Sequence ツールキットです。
Fairseq(-py) は翻訳、要約、言語モデリングとテキスト生成タスクのためのカスタムモデルの訓練を研究者と開発者に可能にするシークエンス・モデリング・ツールキットです。それは以下を含む、様々な sequence-to-sequence モデルのリファレンス実装を提供します :
- 畳み込みニューラルネットワーク (CNN)
- Dauphin et al. (2017): Language Modeling with Gated Convolutional Networks
- Gehring et al. (2017): Convolutional Sequence to Sequence Learning
- New Edunov et al. (2018): Classical Structured Prediction Losses for Sequence to Sequence Learning
- New Fan et al. (2018): Hierarchical Neural Story Generation
- Long Short-Term Memory (LSTM) ネットワーク
- Transformer (self-attention) ネットワーク
Fairseq の特徴 :
- 一つのマシン上または複数のマシンに渡る、マルチ GPU (分散) 訓練
- CPU と GPU 両者上の高速ビームサーチ生成
- 遅延更新を通した巨大なミニバッチ訓練 (シングル GPU 上でさえも)
- 高速な半精度浮動小数点数 (FP16) 訓練
私達はまた各種のベンチマーク・翻訳データセットのための事前訓練されたモデルも提供します (後述)。
要件とインストール
- PyTorch インストール
- 新しいモデルを訓練するためには、NVIDIA GPU と NCCL もまた必要でしょう。
- Python version 3.6
現在 fairseq は PyTorch バージョン >= 0.4.0 を必要とします。ここの手順をフォローしてください :
Docker を使用する場合には、nvidia-docker run へのコマンドライン・オプションとして –ipc=host か –shm-size のいずれかで共有メモリサイズを確実に増やしてください。
PyTorch がインストールされた後、fairseq を次でインストールできます :
pip install -r requirements.txt python setup.py build python setup.py develop
クイック・スタート
次のコマンドライン・ツールが提供されます :
- python preprocess.py: データ前処理: 語彙を構築して訓練データをバイナリ化 (= binarize) します。
- python train.py: 新しいモデルを一つまたはマルチ GPU 上で訓練します。
- python generate.py: 前処理されたデータを訓練モデルで翻訳します。
- python interactive.py: 生テキストを訓練モデルで翻訳します。
- python score.py: 生成された翻訳の参照翻訳に対する BLEU スコアリング。
- python eval_lm.py: 言語モデル評価。
事前訓練モデルを評価する
最初に、事前訓練モデルをその語彙と一緒にダウンロードしてください :
$ curl https://s3.amazonaws.com/fairseq-py/models/wmt14.v2.en-fr.fconv-py.tar.bz2 | tar xvjf -
このモデルは Byte Pair Encoding (BPE) 語彙 を使用しますので、ソーステキストにそれが翻訳可能になる前にエンコーディングを適用しなければなりません。これは wmt14.en-fr.fconv-cuda/bpecodes ファイルを使用して apply_bpe.py スクリプトで成されます。@@ は連続 (= continuation) マーカーとして使用されて元のテキストは e.g. sed s/@@ //g でか generate.py に –remove-bpe flag フラグを渡すことにより簡単にリカバーされます。BPE に先立って、入力テキストは mosesdecoder からの tokenizer.perl を使用してトークン化される必要があります。
翻訳を対話的に生成するために python interactive.py を使用しましょう。ここでは、beam サイズ 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 で prefix される行は語彙を適用した後の供給されたソース・センテンスです ; O は元のソース・センテンスのコピーです ; H は平均 log 尤度を伴う仮説 (= hypothesis) です ; そして A は仮説の各単語に対する attention 最大値 (群) で、(テキストからは省かれる) センテンス終端マーカーを含みます。
(後述の) 利用可能な事前訓練の full リストを確認してください。
新しいモデルを訓練する
以下のチュートリアルは機械翻訳のためのものです。言語モデリング のような他のタスクのために Fairseq をどのように使用するかのサンプルについては、examples/ ディレクトリを見てください。
データ前処理
Fairseq は幾つかの翻訳データセット: IWSLT 2014 (独英), WMT 2014 (英仏) そして WMT 2014 (英独) のためのサンプルの前処理スクリプトを含みます。IWSLT データセットを前処理してバイナリ化するには :
$ cd examples/translation/ $ 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
これは 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 (for バイナリ・データ) または python interactive.py (for 生テキスト) を使用して翻訳を生成できます :
$ 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 フラグで除去できます。
事前訓練モデル
次の事前訓練モデルと前処理されて、バイナリ化されたテストセットを提供します :
翻訳
説明 | データセット | モデル (.tar.bz2) | テストセット (.tar.bz2) |
畳み込み (Gehring et al., 2017) |
WMT14 英仏 | download | newstest2014: download newstest2012/2013: download |
畳み込み (Gehring et al., 2017) |
WMT14 英独 | download | newstest2014: download |
Transformer (Ott et al., 2018) |
WMT14 英仏 | download | newstest2014 (shared vocab): download |
Transformer (Ott et al., 2018) |
WMT16 英独 | download | newstest2014 (shared vocab): download |
言語モデル
説明 | データセット | モデル (.tar.bz2) | テストセット (.tar.bz2) |
畳み込み (Dauphin et al., 2017) |
Google Billion Words | download | download |
畳み込み (Dauphin et al., 2017) |
WikiText-103 | download | download |
ストーリー
説明 | データセット | モデル (.tar.bz2) | テストセット (.tar.bz2) |
畳み込みモデルでストーリー (Fan et al., 2018) |
WritingPrompts | download | download |
使用方法
バイナリ・テストセットでの生成はバッチモードで次のように実行できます、e.g. 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)
遅延更新による巨大ミニバッチ訓練
–update-freq オプションは複数のミニバッチからの勾配を累積して更新を遅らせるために使用できて、より巨大な効果的なバッチサイズを作成します。遅延更新はまた GPU 間通信コストを減じて、そして GPU に渡るワークロードの不一致により引き起こされるアイドルタイムをセーブすることにより訓練スピードを改善することも可能です。より詳細は Ott et al. (2018) を見てください。
8 GPU 上で訓練するのと同じ効果的なバッチサイズでシングル GPU 上で訓練するためには :
CUDA_VISIBLE_DEVICES=0 python train.py --update-freq 8 (...)
半精度浮動小数点 (FP16) で訓練
Note: FP16 訓練は Volta GPU と CUDA 9.1 またはそれ以上が必要です。
最近の GPU は効率的な半精度浮動小数点計算を可能にします、e.g., Nvidia Tensor Cores を使用します。
Fairseq は –fp16 フラグで FP16 訓練をサポートします :
python train.py --fp16 (...)
分散訓練
fairseq の分散訓練は torch.distributed の上に実装されています。訓練は GPU 毎に 1 ワーカー・プロセスを launch することで開始します。これらのワーカーは互いを一意なホストとポートを通して見つけます、それらは初期接続を確立するために使用できます。更に、各ワーカーは rank を持ち、これは 0 から n-1 までの一意な数字です、ここで n は GPU の総数です。
SLURM により管理されるクラスタ上で実行する場合には、このコマンドを使用して、それぞれ 8 GPU を持つ 16 ノード上 (総計 128 GPU) で 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 trainer to establish initial connection $ sbatch --job-name fairseq-py --gres gpu:8 --cpus-per-task 10 \ --nodes 16 --ntasks-per-node 8 \ --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=master.devserver.com:9218 # one of the hosts used by the job $ RANK=... # the rank of this process, from 0 to 127 in case of 128 GPUs $ python train.py $DATA \ --distributed-world-size 128 \ --distributed-init-method 'tcp://$HOST_PORT' \ --distributed-rank $RANK \ --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
Citation
citation 記載については 原文 を確認してください。
以上