OpenNMT-py使用GPU模式进行训练和翻译

硬件情况

CPU:Intel(R) Core(TM) i7-7700K CPU @ 4.2GHz

GPU:  NVIDIA GeForce GTX 1080 Ti  * 2

RAM:  32G

OS: Windows 10 Pro

 

环境准备

Python

Python 选择安装3.6版本,安装好以后配置环境变量。

Anaconda3

Anaconda3选择Anaconda3-5.2.0版本。在使用PyTorch时建议在Anaconda3里建一个新的环境就命名叫“PyTorch”,我们将需要用的一些包都安装到这个环境中去,这样在使用中不会干涉其他环境。在Anaconda3中打开指定环境的终端可以直接操作该环境。

Torch

Torch在Anaconda3里进行安装就可以。选择的版本是0.4.0版本。打开Anaconda3,选择新建的环境“PyTorch”,右击选择打开终端,在该终端中使用conda命令来进行安装。

TorchText

TorchText是在安装完Torch之后进行安装的,使用Anaconda3进行安装。但是需要注意的是与Torch 0.4.0所匹配的 TorchText 0.2.3 版本存在问题,会导致翻译报错。错误是“TypeError: make_src() takes 2 positional arguments but 3 were given”。遇到这个错误目前的方法如下。

  1. 安装TorchText 0.2.3版本。命令: pip install torchtext
  2. GitHub下载TorchText最新代码。https://github.com/pytorch/text
  3. 找到TorchText 0.2.3版本所安装的路径,使用最新的代码去覆盖安装路径上的代码。

OpenNMT-py使用GPU模式进行训练和翻译

  1. 然后再使用GPU翻译的话问题就会解决。注意 这个问题只在目前版本存在,以后版本升级之后有可能被解决。

 

OpenNMT-py

我们选择OpenNMT-py来作为我们的源码。

下载代码:https://github.com/OpenNMT/OpenNMT-py

本篇只讲GPU模式训练中遇到的一些问题,CPU模式基本没有遇到什么奇怪的问题只需要参照官网即可。

官网:http://opennmt.net/OpenNMT-py/main.html

 

训练数据准备

     训练集  :      src-train.txt  tgt-train.txt

     验证集  :      src-val.txt    tgt-val.txt

     测试集  :      src-test.txt

     注意 :中文需要先进行分词,分词的优劣直接影响模型的准确率.

Preprocess the data

python preprocess.py -train_src data/src-train.txt -train_tgt data/tgt-train.txt -valid_src data/src-val.txt -valid_tgt data/tgt-val.txt -save_data data/demo

 

该步骤执行完成后会在data文件夹中生成3个文件 demo.train.1.ptdemo.valid.1.ptdemo.vocab.pt

 

Train the model

python train.py -data data/demo -save_model demo-model –gpuid 0

 

这一步我们使用前一步骤准备好的三个demo文件来进行model的训练。注意使用GPU训练时在这一步的时候可能会出现,报错是:“TypeError: __init__() got an unexpected keyword argument 'dtype'”,目前使用的解决方案是直接去掉dtype这个参数。方法是:

  1. 打开OpenNMT-py的源代码,找到文件/onmt/inputters/text_dataset.py
  2. 找到报错的行,删掉dtype这个参数。注意这个文件中所有调用这个方法的地方都要删,删完过后应该是这样的。
fields["src_map"] = torchtext.data.Field(
            use_vocab=False, dtype=torch.float,
            postprocessing=make_src, sequential=False)
 
  1. 再次执行Train即可。

解决掉所有的报错之后就可以进行GPU训练了,我们选择默认的配置,默认是2层LSTM,编码器/解码器上有500个隐藏单元。当然如果你需要修改层数和隐藏单元的数量都是可以修改的。训练完成之后会得到如下结果。

OpenNMT-py使用GPU模式进行训练和翻译

Translate

python translate.py -model demo-model_XYZ.pt -src data/src-test.txt -output pred.txt -replace_unk –verbose –gpu 0
 
使用GPU训练出来的model也需要使用GPU模式进行翻译,注意解决torchtext的问题。