1. 程式人生 > 其它 >Facebook開源PyTorch版本fairseq翻譯模型,訓練速度提高50%

Facebook開源PyTorch版本fairseq翻譯模型,訓練速度提高50%

【新智元導讀】FAIR的開源序列到序列(sequence-to-sequence)引擎現在可以在PyTorch使用了。FAIR今天釋出了fairseq-py,這是一個用PyTorch實現的卷積seq2seq模型。fairseq-py是語言翻譯以及其他 seq2seq 的NLP任務的一個很好的模型,新的工具包比以前的更高效率:生成翻譯的速度比以前的提高了80%,訓練速度提高了50%。

今年5月10日,Facebook AI 研究實驗室(FAIR)釋出了一項使用創新性的、基於卷積神經網路的方法來進行語言翻譯的最新成果。Facebook 稱,該研究取得了截止目前最高準確度,並且速度是基於迴圈神經網路(RNN)系統的9倍(谷歌的機器翻譯系統使用的就是這一技術)。

今天開源的是一個PyTorch版本的fairseq。這個重新實現的原作者是Sergey Edunov,Myle Ott和Sam Gross。該工具包實現了 Convolutional Sequence to Sequence Learning(https://arxiv.org/abs/1705.03122)中描述的完全卷積模型(fully convolutional model),在單個機器上實現多GPU訓練,並在CPU和GPU上實現快速 beam search 生成。我們提供英語到法語和英語到德語翻譯的預訓練模型。

引用

如果要在論文中使用這些程式碼,請按如下格式引用:

@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,
}

要求和安裝步驟

  • 執行macOS或Linux的計算機
  • 為了訓練新模型,你還需要一個NVIDIA GPU和NCCL
  • Python 3.6
  • PyTorch安裝

目前,Fairseq-py需要GitHub庫裡的PyTorch。有多種安裝方式,我們建議使用Miniconda3並按照說明安裝:

  • 從 https://conda.io/miniconda.html 安裝 Miniconda3; 建立並激活Python 3環境。
  • 安裝PyTorch:
conda install gcc numpy cudnn nccl
conda install magma-cuda80 -c soumith
pip install cmake
pip install cffi

git clone https://github.com/pytorch/pytorch.git
cd pytorch
git reset --hard a03e5cb40938b6b3f3e6dbddf9cff8afdff72d1b
git submodule update --init
pip install -r requirements.txt

NO_DISTRIBUTED=1 python setup.py install

Clone GitHub 儲存庫並執行以下命令安裝fairseq-py:

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

快速開始

以下命令列工具可用:

  • python preprocess.py:資料預處理:構建詞彙和二進位制訓練資料
  • python train.py:在一個或多個GPU上訓練新模型
  • python generate.py:用訓練好的模型翻譯預處理的資料
  • python generate.py -i:使用訓練好的模型翻譯原始文字
  • python score.py:根據參考翻譯對生成的翻譯進行BLEU評分

評估預訓練的模型

首先,下載一個預訓練的模型及其詞彙:

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

該模型使用位元組對編碼(BPE)詞彙表,因此我們必須將該編碼應用於源文字才能進行翻譯。這可以通過使用wmt14.en-fr.fconv-cuda / bpecodes檔案的apply_bpe.py指令碼完成。@@ 用作連續標記,用 sed s / @@ // g 或將 --remove-bpe 標誌傳遞給generate.py,原始文字可以很容易地恢復。在BPE之前,輸入文字需要使用mosesdecoder中的tokenizer.perl進行標記化。

讓我們使用python generate.py -i來生成翻譯。在這裡,我們使用beam的大小是5:

$ MODEL_DIR=wmt14.en-fr.fconv-py
$ python generate.py -i 
 --path $MODEL_DIR/model.pt $MODEL_DIR 
 --beam 5
| [en] dictionary: 44206 types
| [fr] dictionary: 44463 types
| model fconv_wmt_en_fr
| loaded checkpoint /private/home/edunov/wmt14.en-fr.fconv-py/model.pt (epoch 37)
> Why is it rare to discover new marine mam@@ mal species ?
S       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.08662842959165573    Pourquoi est-il rare de découvrir de nouvelles espèces de mammifères marins ?
A       0 1 3 3 5 6 6 10 8 8 8 11 12

生成指令碼產生四種類型的輸出:以S為字首的行顯示了應用詞彙表後提供的源語句(source sentence); O是原始來源句的副本(original source sentence); H是平均 log-likelihood以外的假設(hypothesis); 而A是假設中每個單詞的注意力最大值( attention maxima),包括文字中省略的句末標記。

下面是預訓練模型列表。

訓練一個新模型

資料預處理

Fairseq-py原始碼分發包含了一個用於IWSLT 2014德語 - 英語語料庫的預處理指令碼示例。預處理和二值化資料如下:

$ 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 
  --thresholdtgt 3 --thresholdsrc 3 --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。使用CUDA_VISIBLE_DEVICES 環境變數選擇特定的GPU和/或更改將要使用的GPU裝置的數量。

另請注意,batch大小是根據每個batch的最大token數(--max-tokens)來指定的。你可能需要使用較小的值,具體取決於系統上可用的GPU記憶體。

生成

一旦模型訓練好,就可以使用python generate.py(二進位制資料)或python generate.py -i(原始文字)生成翻譯:

$ 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 flag。可以使用--remove-bpe flag 來刪除BPE連續標記。

預訓練模型

我們提供以下預訓練的完全卷積序列到序列模型:

  • wmt14.en-fr.fconv-py.tar.bz2:用於WMT14英語 - 法語的預訓練模型,包括詞彙
  • wmt14.en-de.fconv-py.tar.bz2:用於WMT14英語 - 德語的預訓練模型,包括詞彙

此外,我們還提供了上述模型的預處理和二值化測試集:

  • wmt14.en-fr.newstest2014.tar.bz2:WMT14英語 - 法語的newstest2014測試集
  • wmt14.en-fr.ntst1213.tar.bz2:WMT14英語 - 法語的newstest2012和newstest2013測試集
  • wmt14.en-de.newstest2014.tar.bz2:WMT14英語 - 德語的newstest2014測試集

生成二值化測試集可以像下面這樣以batch的模式執行,例如,在GTX-1080ti的英語-法語:

$ curl https://s3.amazonaws.com/fairseq-py/models/wmt14.en-fr.fconv-py.tar.bz2 | tar xvjf - -C data-bin
$ curl https://s3.amazonaws.com/fairseq-py/data/wmt14.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 (95451 tokens) in 81.3s (1174.33 tokens/s)
| Generate test with beam=5: BLEU4 = 40.23, 67.5/46.4/33.8/25.0 (BP=0.997, ratio=1.003, syslen=80963, reflen=81194)

# 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.23, 67.5/46.4/33.8/25.0 (BP=0.997, ratio=1.003, syslen=80963, reflen=81194)

GitHub地址:https://github.com/facebookresearch/fairseq-py