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
- 【Go 语言社区】算法课程 第一季 第4节 100以内的素数
- Java案例-数组求余问题
- GO语言实现的端口扫描器分享
- Java案例-数组随机数
- Go语言图片处理和生成缩略图的方法
- Python3 怎么将Unicode转中文,以及GBK乱码ÖйúÉÙÊýÃñ×åÌØÉ«´åÕ¯
- 数据结构和算法——旋转打印链表
- C/C++——set的基本操作总结
- PHP基础——字符串的常用操作
- NLP之tfidf与textrank算法细节对比基于结巴分词
- 【Go 语言社区】算法课程 第一季 第4节-汉诺塔
- C/C++——map的基本操作总结
- Python生成词云图,TIIDF方法文本挖掘: 词频统计,词云图
- C/C++——vector的基本操作总结
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解将数据从Laravel传送到vue的四种方式
- Laravel实现ApiToken认证请求
- laravel 实现划分admin和home 模块分组
- laravel在中间件内生成参数并且传递到控制器中的2种姿势
- 在laravel框架中实现封装公共方法全局调用
- laravel通过a标签从视图向控制器实现传值
- 在Laravel 的 Blade 模版中实现定义变量
- 解决Laravel5.5下的toArray问题
- Laravel基础_关于view共享数据的示例讲解
- 解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
- 解决laravel资源加载路径设置的问题
- laravel实现前后台路由分离的方法
- laravel5.1框架model类查询的实现方法
- laravel-admin 管理平台获取当前登陆用户信息的例子
- Yii框架Session与Cookie使用方法示例