openNMT学习(1)—跑一个简单的transformer系统

近期在学习用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 

翻译完成后,我们便可以去提取设置好的路径文件看翻译结果了!!!

以上就是跑一个翻译模型的过程,如果有些记录错误出现,欢迎大家指正!

  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值