使用fairseq从头开始训练一个中英神经机器翻译模型 # 强烈安利
手把手教你用fairseq训练一个NMT机器翻译系统
实习日记(二):序列建模工具包——Fairseq
FaceBook-NLP工具Fairseq漫游指南(1)—命令行工具
FaceBook-NLP工具Fairseq漫游指南(2)—扩展模型
使用Fairseq进行机器翻译 # 整个训练流程
fairseq的使用 # 整个流程 参数介绍 优化模型
fairseq笔记 # 详细的预处理代码
fairseq 官方教程
fairseq | 创建batch iterator部分逻辑源码阅读
fairseq | fairseq beam search 源码阅读笔记
fairseq-generate data-bin --path checkpoints/checkpoint_best.pt --remove-bpe
会发现生成的结果文档顺序与原文不一致,包含了解码日志(log)、原文、译文、打分等信息。这是因为在生成batch的时候,会根据句长或句token数对数据进行过滤,和size排序,即根据句长重新排序了,短句在前,长句在后,同一个batch中,数据长度相当。设置max_sentence后,超长的句子直接丢弃。
如果想得到正序文档,有以下两种方式。
①
awk之第一列顺序不变对第二列进行排序
awk 'NR>1&&i!=$1{for(j=0;j++<asorti(a,b);)print i,b[j];delete a}{i=$1;a[$2]}' bestbeam8-4.txt <(echo)
#如果报错
#sudo apt-get install gawk
②
修改fairseq/fairqseq/tasks/fairseq_task.py文件
这样在生成indices的时候就是正序的啦~
fairseq的命令函数
fairseq preprocess | 数据预处理,建立字典和训练数据和二值化数据 |
---|---|
fairseq train | 训练模型 |
fairseq gennerate | 使用训练的模型翻译预处理后的数据 |
fairseq generate-lines | 使用训练后的数据翻译一行文本 |
fairseq interactive | 交互式生成译文,可以翻译户输入源语文件 |
fairseq score | 翻译后的文本的BLEU得分 |
fairseq tofloat | 转化训练模型为CPU模型 |
fairseq optimize-fconv | 优化生成的全卷积模型 |
整理
(1)fairseq-preprocess
fairseq-preprocess --source-lang de --target-lang en \
--trainpref iwslt14.tokenized.de-en/train \
--validpref iwslt14.tokenized.de-en/valid \
--testpref iwslt14.tokenized.de-en/test
CUDA_VISIBLE_DEVICES=1 fairseq-preprocess --source-lang zh --target-lang en \
--trainpref nmt/data/corpus_32k_bpe/train \
--validpref nmt/data/corpus_32k_bpe/valid \
--testpref nmt/data/corpus_32k_bpe/test --joined-dictionary
fairseq-preprocess将文本数据转化为二进制文件,从train文本数据中构建词表,默认情况下将所有出现过的单词根据词频排序,如:dict.en.tx文件所示。
- 构建的词表是一个单词和序号之间的一对一映射,这个序号是单词在词表中的下标位置。
- 预处理命令在构建词表之后,会将文本数据转换为数值形式,也就是把文本中的每一个词,转换为对应的序号。之后,数值化的文本数据会被进一步编码,默认情况下使用Memory-Mapped IndexedDataset,这种数据编码方式不仅可以压缩文件大小,还可以根据索引进行随机读取,因此在训练的时候不需要加载全部数据,从而节约内存使用。
(2)fairseq-train
fairseq-train data-bin --arch transformer_iwslt_de_en \
--max-tokens 4096 --max-update 30000 \
--optimizer adam --lr-scheduler inverse_sqrt --lr 0.0007 \
--criterion label_smoothed_cross_entropy --label-smoothing 0.1 \
--no-progress-bar --save-interval-updates 1000
fairseq-train data-bin/py_hz_pre
--task translation --source-lang input --target-lang label
--arch fconv --optimizer adam --adam-betas '(0.9,0.98)'
--clip-norm 0.1 --lr 0.01 --lr-scheduler inverse_sqrt
--warmup-updates 2000 --dropout 0.2
--weight-decay 0.0001 --max-tokens 8000
--save-dir checkpoints --eval-bleu
CUDA_VISIBLE_DEVICES=1 nohup fairseq-train nmt/data/doc_data/context_agnostic/data-bin --arch transformer \
--source-lang en --target-lang ru \
--optimizer adam --lr 0.001 --adam-betas '(0.9, 0.98)' \
--lr-scheduler inverse_sqrt --max-tokens 4096 --dropout 0.3 \
--criterion label_smoothed_cross_entropy --label-smoothing 0.1 \
--max-update 200000 --warmup-updates 4000 --warmup-init-lr '1e-07' \
--keep-last-epochs 10 --num-workers 8 \
--save-dir nmt/models/doc_agnostic/checkpoints &
(3) fairseq-generate
fairseq-generate data-bin --path checkpoints/checkpoint_best.pt --remove-bpe
CUDA_VISIBLE_DEVICES=1 fairseq-generate nmt/data/v15news/data-bin \
--path nmt/models/v15news/checkpo/checkpoint_best.pt \
--batch-size 128 --beam 8 > nmt/data/v15news/result/bestbeam8-5.txt
#faiseq-generate someargs >result.txt将输出保存到文件
grep ^H result.txt | sort -n -k 2 -t '-' | cut -f 3
(4) fairseq-interactive
cat test.de | fairseq-interactive data-bin --path checkpoints/checkpoint_best.pt --remove-bpe
(5) fairseq generate-lines
DATA=data-bin/iwslt14.tokenized.de-en
fairseq generate-lines -sourcedict $DATA/dict.de.th7 -targetdict $DATA/dict.en.th7 -path trainings/fconv/model_best_opt.th7 -beam 10 -nbest 2
##优化模型
# Optional: optimize for generation speed
fairseq optimize-fconv -input_model trainings/fconv/model_best.th7 -output_model trainings/fconv/model_best_opt.th7
##翻译文本
# Translate some text
DATA=data-bin/iwslt14.tokenized.de-en
fairseq generate-lines -sourcedict $DATA/dict.de.th7 -targetdict $DATA/dict.en.th7 \
-path trainings/fconv/model_best_opt.th7 -beam 10 -nbest 2
预训练模型Pre-trained models
fairseq generate -sourcelang en -targetlang fr -datadir data-bin/wmt14.en-fr -dataset newstest2014 -path wmt14.en-fr.fconv-cuda/model.th7 -beam 5 -batchsize 128 | tee /tmp/gen.out
# Word-level BLEU scoring:
grep ^H /tmp/gen.out | cut -f3- | sed 's/@@ //g' > /tmp/gen.out.sys
grep ^T /tmp/gen.out | cut -f2- | sed 's/@@ //g' > /tmp/gen.out.ref
fairseq score -sys /tmp/gen.out.sys -ref /tmp/gen.out.ref