近期在学习用openNMT跑神经机器翻译模型,简单和大家分享一下,后期对此工具的深入学习也会继续分享。
1.介绍
openNMT是一个开源的神经机器翻译和神经序列学习的系统,由哈佛NLP团队和机器翻译公司SYSTRAN在2016年12月开发,已用于众多学术研究和工业应用中,目前由SYSTRAN公司和Ubiqus公司维护。
当下有两个版本,分别基于TensorFlow架构和Pytorch架构,本文所用版本基于Pytorch架构。
值得一提的是,openNMT官方网站有特定的讨论区(forum),用github账号登录即可,大家有问题可以在那里提问。
2.安装openNMT
整个安装和训练参考的官方教程:Contents — OpenNMT-py documentation
我的电脑环境:ubantu18.04
我的安装比较顺利直接用pip下载就成功了,官方教程中用git的方法我没有尝试,今天先用这一种下载方法介绍。值得注意的是python版本最起码要用到3.8版本,我用的python版本是3.8.5,并且torch版本一定要达到1.8及以上才能顺利跑起来模型。可以建立用conda构建python3.8版本的虚拟环境,在这个环境里跑。
pip install openNMT
3.跑一个Transformer的模型
整个安装和训练参考的官方教程:Contents — OpenNMT-py documentation
用pip成功安装openNMT后,我们就可以直接开始我们的训练了。
一个模型顺利训练我们需要准备如下几个文件:分别是源语言训练集;目标语言训练集;源语言开发集和目标语言开发集,还有一个yaml参数设置的文件。
3.1 建立一个文件夹,上传我们预先处理好的双语训练集,开发集和测试集文件以及一个配置文件。
以跑一个德英的神经机器翻译模型来举例,首先建立一个文件夹,取名为de-en_NMT,大家可以根据自己的需要来取
mkdir de-en_NMT
将德英训练集测试集开发集上传到这个文件夹内,再将配置文件上传至文件夹内。
配置文件de-en.yaml如下所示。此设置是在单个GPU上训练的模型,多个GPU上训练模型可参考OpenNMT-py/config-transformer-base-4GPU.yml at master · OpenNMT/OpenNMT-py (github.com)下一节根据具体操作进行配置文件的说明。
## Where the samples will be written
save_data: run/example
## Where the vocab(s) will be written
src_vocab: run/example.vocab.src
tgt_vocab: run/example.vocab.tgt
# Prevent overwriting existing files in the folder
overwrite: False
# Corpus opts:
data:
corpus_1:
path_src: de_train.txt
path_tgt: en_train.txt
valid:
path_src: de_valid.txt
path_tgt: en_valid.txt
save_model: run/model.de-en
save_checkpoint_steps: 1000
keep_checkpoint: 100
seed: 3435
train_steps: 1000
valid_steps: 1000
warmup_steps: 800
report_every: 100
decoder_type: transformer
encoder_type: transformer
word_vec_size: 512
rnn_size: 512
layers: 6
transformer_ff: 2048
heads: 8
accum_count: 8
optim: adam
adam_beta1: 0.9
adam_beta2: 0.998
decay_method: noam
learning_rate: 2.0
max_grad_norm: 0.0
batch_size: 4096
batch_type: tokens
normalization: tokens
dropout: 0.1
label_smoothing: 0.1
max_generator_batches: 2
param_init: 0.0
param_init_glorot: 'true'
position_encoding: 'true'
world_size: 1
gpu_ranks:
- 0
3.2 构建词表
配置文件中data后放入训练集和开发集的路径:
同时也设置好源语言词表和目标语言词表的储存路径和文件:
进入我们为此设置的python环境和文件夹,输入linux指令,构建词表。
onmt_build_vocab -config de-en.yaml -n_sample 20000
de-en.yaml可换成你们上传的配置文件路径,其中参数-n_sample指的是从每个语料库采样来构建词汇的行数。我这里设置成20000,大家可以根据自己的数据量来设置,也可以不设置这个参数,直接输入以下即可。
onmt_build_vocab -config de-en.yaml
构建词表完成后会显示:
我们检查词表储存的路径,发现两个文件的确已经生成
3.3 训练模型
训练Transformer模型时,我们在配置文件里设置一系列参数,比如模型的保存路径save_model等。在linux中输入如下指令,进行模型训练,为防止掉线,用了一个nohup指令,将训练过程中的输出。
nohup onmt_train -config de-en.yaml > train.log 2>&1 &
可以打开记录文件看一下有没有出错,出现以下界面应该是开始训练了
之后就是等待训练完成.....
训练完成后,我们可以看到模型被保存在了我们配置文件设置的路径中
3.4 模型翻译
我们用刚才训练好的模型跑翻译,输入如下指令。其中模型参数后面要输入自己训练模型的路径,翻译的源语言路径放在参数src之后,输出的翻译文件路径也要改成自己设置的,然后是跑翻译时用的GPU的位置。
onmt_translate -model run/model.de-en_step_1000.pt -src de_test.txt -output en_pred_1000.txt -gpu 0
翻译完成后,我们便可以去提取设置好的路径文件看翻译结果了!!!
以上就是跑一个翻译模型的过程,如果有些记录错误出现,欢迎大家指正!