fairseq 0.10 : Getting Started (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/24/2020 (0.10.1)
* 本ページは、fairseq の以下のページを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション |
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/ |
Facebook: https://www.facebook.com/ClassCatJP/ |
fairseq 0.10 : Getting Started
事前訓練モデルを評価する
最初に、事前訓練モデルをその語彙と一緒にダウンロードします :
> curl https://dl.fbaipublicfiles.com/fairseq/models/wmt14.v2.en-fr.fconv-py.tar.bz2 | tar xvjf -
このモデルは バイトペア・エンコーディング (BPE) 語彙 を使用しますので、ソーステキストにそれが翻訳できる前にエンコーディングを適用しなければなりません。これは wmt14.en-fr.fconv-cuda/bpecodes ファイルを使用して apply_bpe.py スクリプトで成されます。@@ は continuation (継続) マーカーとして使用されて元のテキストは e.g. sed s/@@ //g あるいは –remove-bpe フラグを fairseq-generate に渡すことにより容易にリカバーできます。BPE の前に、入力テキストは mosesdecoder からの tokenizer.perl を使用してトークン化される必要があります。
翻訳を対話的に生成するために fairseq-interactive を利用しましょう。ここでは 5 のビームサイズを使用して Moses tokenizer と与えられたバイトペア・エンコーディング語彙で入力を前処理します。それは BPE continuation マーカーを自動的に除去して出力を detokenize します。
> MODEL_DIR=wmt14.en-fr.fconv-py > fairseq-interactive \ --path $MODEL_DIR/model.pt $MODEL_DIR \ --beam 5 --source-lang en --target-lang fr \ --tokenizer moses \ --bpe subword_nmt --bpe-codes $MODEL_DIR/bpecodes
| 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 mammal species? S-0 Why is it rare to discover new marine mam@@ mal species ? H-0 -0.0643349438905716 Pourquoi est-il rare de découvrir de nouvelles espèces de mammifères marins? P-0 -0.0763 -0.1849 -0.0956 -0.0946 -0.0735 -0.1150 -0.1301 -0.0042 -0.0321 -0.0171 -0.0052 -0.0062 -0.0015
この生成スクリプトは 3 つのタイプの出力を生成します : O で prefix される行は元のソースセンテンスのコピーです ; H は平均対数尤度を伴う hypothesis です ; そして P はトークン位置毎の位置スコアで、end-of-sentence マーカーを含みます、これはテキストからは省略されます。
貴方が見るかもしれない出力行の他のタイプは D – detokenized hypothesis、T – 参照ターゲット、A – アラインメント情報、E – 生成ステップの履歴です。
利用可能な事前訓練モデルの完全なリストについては README を見てください。
新しいモデルを訓練する
以下のチュートリアルは機械翻訳のためのものです。言語モデリング のような、他のタスクのためにどのように Fairseq を使用するかの例については、examples/ ディレクトリを見てください。
データ前処理
Fairseq は幾つかの翻訳データセットのためにサンプル前処理スクリプトを含みます : IWSLT 2014 (独英), WMT 2014 (英仏) と WMT 2014 (英独)。IWSLT データセットを前処理してバイナリ化するためには :
> cd examples/translation/ > bash prepare-iwslt14.sh > cd ../.. > TEXT=examples/translation/iwslt14.tokenized.de-en > fairseq-preprocess --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 にモデル訓練のために利用可能なバイナリ化されたデータを書きます。
訓練
新しいモデルを訓練するために fairseq-train を利用します。ここに IWSLT 2014 dataset のために上手く動作する幾つかのサンプル設定があります :
> mkdir -p checkpoints/fconv > CUDA_VISIBLE_DEVICES=0 fairseq-train 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
デフォルトでは、fairseq-train は貴方のマシン上の総ての利用可能な PGU を利用します。特定の GPU を選択 and/or 使用される GPU デバイスの数を変更するには CUDA_VISIBLE_DEVICES 環境変数を使用します。バッチサイズはバッチ毎のトークンの最大数 (–max-tokens) の観点から指定されることにも注意してください。貴方のシステム上の利用可能な GPU メモリに依拠してより小さい値を使用する必要があるかもしれません。
生成
ひとたびモデルが訓練されれば、fairseq-generate (バイナリ化されたデータのため) か fairseq-interactive (raw テキストのため) を使用して翻訳を生成できます :
> fairseq-generate 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 continuation マーカーは –remove-bpe フラグで除去できます。
上級訓練オプション
遅延更新による大規模ミニバッチ訓練
–update-freq オプションは複数のミニバッチと遅延更新からの勾配を集積するために利用できて、より大規模なで効果的なバッチサイズを作成します。遅延更新はまた GPU 間の通信コストを削減してGPU に渡るワークロードの分散により引き起こされるアイドル時間を節約することにより訓練スピードを改良することもできます。より詳細については Ott et al. (2018) を見てください。
8 GPU 上の訓練に等値な効果的なバッチサイズによって単一 GPU 上で訓練するためには :
> CUDA_VISIBLE_DEVICES=0 fairseq-train --update-freq 8 (...)
半精度浮動小数点 (FP16) による訓練
Note: FP16 訓練は Volta GPU と CUDA 9.1 またはそれ以上を必要とします。
近年の GPU は効率的な半精度浮動小数点計算を有効にします、e.g., Nvidia Tensor コア を使用して。Fairseq は –fp16 フラグで FP16 訓練をサポートします :
> fairseq-train --fp16 (...)
分散訓練
fairseq の分散訓練は torch.distributed の上に実装されています。ジョブを launch する最も容易な方法は torch.distributed.launch ツールによります。
例えば、それぞれが 8 GPU を持つ 2 ノード (合計で 16 GPU) 上で大規模な英独 Transformer モデルを訓練するためには、各ノードで次のコマンドを実行します、2 番目のノードでは node_rank=0 を node_rank=1 で置き換えてそして –master_addr を最初のノードの IP アドレスに更新することを確実にします :
> python -m torch.distributed.launch --nproc_per_node=8 \ --nnodes=2 --node_rank=0 --master_addr="192.168.1.1" \ --master_port=12345 \ $(which fairseq-train) data-bin/wmt16_en_de_bpe32k \ --arch transformer_vaswani_wmt_en_de_big --share-all-embeddings \ --optimizer adam --adam-betas '(0.9, 0.98)' --clip-norm 0.0 \ --lr-scheduler inverse_sqrt --warmup-init-lr 1e-07 --warmup-updates 4000 \ --lr 0.0005 --min-lr 1e-09 \ --dropout 0.3 --weight-decay 0.0 --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ --max-tokens 3584 \ --fp16
SLURM クラスタでは、fairseq はノードと GPU の数を自動的に検出しますが、ポート番号は提供されなければなりません :
> salloc --gpus=16 --nodes 2 (...) > srun fairseq-train --distributed-port 12345 (...).
非常に巨大なデータセットをシャーディングする
特に貴方のマシンが多くのシステム RAM を持たない場合、非常に大規模なデータセットに渡り訓練することは挑戦的であり得ます。fairseq の殆どのタスクは「シャードされた」データセットに渡る訓練をサポートしています、そこでは元のデータセットは non-overlapping チャンク (or 「シャード」) に前処理されています。
例えば、貴方の総てのデータを単一の “data-bin” ディレクトリに前処理する代わりに、データを分割して“data-bin1”, “data-bin2” 等を作成することができます。それからこのように訓練コマンドを適応させることができます :
> fairseq-train data-bin1:data-bin2:data-bin3 (...)
今では訓練は各シャードに渡り、一つ一つ反復します、各シャードは「エポック」に相当します、こうしてシステムメモリ使用を削減します。
以上