上次分享了FaceBook最近提出的Convolution Seq2Seq模型的一些理论知识,今天跟大家分享一下实际操作经验,
主要包括三个方面内容:1、安装Torch平台,2、配置fairseq环境,3、模型测试与训练。
实验支持:Mac Os/Ubuntu 12+/Centos 7系统都可以,最好拥有GPU支持,安装好CUDA。
台主的实验环境:Centos 7 + Tesla M40 GPU + CUDA_8.0
1、安装Torch平台
FaceBook开源的模型是基于Torch平台,采用Lua实现的,估计是考虑代码运行效率问题吧。因此,需要安装最新的Torch 7平台。
如果已经安装了Torch,可以使用:luarocks install torch升级至最新版本,主要是后面安装最新的nn库需要。
Torch具体安装参考官网Tutorial:http://torch.ch/docs/getting-started.html#_,下面简单罗列一下:
#下载并安装
git clone https://github.com/torch/distro.git ~/torch --recursive
cd ~/torch; bash install-deps;
./install.sh
#配置环境变量
# On Linux with bash
source ~/.bashrc
# On Linux with zsh
source ~/.zshrc
# On OSX or in Linux with none of the above.
source ~/.profile
#测试是否安装正确
th> torch.Tensor{1,2,3}
1
2
3
#执行正确,则安装成功
#torch的所有依赖都在~/torch文件下,如果想要删除torch执行
rm -rf ~/torch
#安装torch中的包
$ luarocks install nn
2、配置fairseq环境
运行fairseq模型需要安装 NVIDIA GPU和NCCL。
1)、安装NCCL,github安装地址:https://github.com/NVIDIA/nccl
可以把NCCL的包拷贝到torch包下面,
$ git clone https://github.com/NVIDIA/nccl.git
#建库并测试
$ cd nccl
$ make CUDA_HOME=
注意:遇到nccl安装失败
Compiling src/libwrap.cu > /search/odin/data/liuqi/fairseq/nccl/build/obj/libwrap.o
nvcc fatal : Value 'gnu++0x' is not defined for option 'std'
make: *** [/search/odin/data/liuqi/fairseq/nccl/build/obj/libwrap.o] \u9519\u8bef 1
参考解决:https://github.com/NVIDIA/nccl/issues/60
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./build/lib
$ ./build/test/single/all_reduce_test
Error: must specify at least data size in bytes!
$ ./build/test/single/all_reduce_test 10000000
# Using devices
# Device 0 -> 0 [0x0a] GeForce GTX TITAN X
# Device 1 -> 1 [0x09] GeForce GTX TITAN X
# Device 2 -> 2 [0x06] GeForce GTX TITAN X
# Device 3 -> 3 [0x05] GeForce GTX TITAN X
#安装NCCL
$ make PREFIX=
#添加lib路径到LD_LIBRARY_PATH
$ export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:~/torch/nccl/lib
2)、安装最新版的nn:
luarocks install nn
可能报错:Error installing nn
原因是Torch 版本太老,升级torch:
luarocks install torch
安装nn:luarocks install nn
okay!
3)、配置fairseq环境:
luarocks make rocks/fairseq-scm-1.rockspec
注意CPU安装下面版本:luarocks make rocks/fairseq-cpu-scm-1.rockspec
可能会出现问题:Error generating /tmp/luarocks_tbc-scm-1-3148/TemporalConvolutionTBC/build/lib/CMakeFiles/THTBC.dir//./THTBC_generated_init_cuda.cu.o
原因是THTBC冲突,fairseq中Mac Os的依赖,Linux中不存在,参考解决:http://blog.csdn.net/lqfarmer/article/details/71603425
3、模型测试与训练
1)、拷贝训练好的模型:wmt14.en-fr.fconv-cuda/,测试
#GPU版本:
$ curl https://s3.amazonaws.com/fairseq/models/wmt14.en-fr.fconv-cuda.tar.bz2 | tar xvjf -
#CPU版本:Alternatively, use a CPU-based model:
$ curl https://s3.amazonaws.com/fairseq/models/wmt14.en-fr.fconv-float.tar.bz2 | tar xvjf -
#运行模型,查看结果:
$ fairseq generate-lines -path wmt14.en-fr.fconv-cuda/model.th7 -sourcedict wmt14.en-fr.fconv-cuda/dict.en.th7 \
-targetdict wmt14.en-fr.fconv-cuda/dict.fr.th7 -beam 5
| [target] Dictionary: 44666 types
| [source] Dictionary: 44409 types
> Why is it rare to discover new marine mam@@ mal species ?
SWhy is it rare to discover new marine mam@@ mal species ?
OWhy is it rare to discover new marine mam@@ mal species ?
H-0.068684287369251Pourquoi est-il rare de découvrir de nouvelles espèces de mammifères marins ?
A1 1 4 4 6 6 7 11 9 9 9 12 13
2)、训练自己的模型:
#准备数据:
$ cd data/
$ bash prepare-iwslt14.sh
$ cd ..
$ TEXT=data/iwslt14.tokenized.de-en
$ fairseq preprocess -sourcelang de -targetlang en \
-trainpref $TEXT/train -validpref $TEXT/valid -testpref $TEXT/test \
-thresholdsrc 3 -thresholdtgt 3 -destdir data-bin/iwslt14.tokenized.de-en
#训练模型,facebook放出了多个版本的seq2seq模型,并给出了例子:
# Standard bi-directional LSTM model
$ mkdir -p trainings/blstm
$ fairseq train -sourcelang de -targetlang en -datadir data-bin/iwslt14.tokenized.de-en \
-model blstm -nhid 512 -dropout 0.2 -dropout_hid 0 -optim adam -lr 0.0003125 -savedir trainings/blstm
# Fully convolutional sequence-to-sequence model
$ mkdir -p trainings/fconv
$ fairseq train -sourcelang de -targetlang en -datadir data-bin/iwslt14.tokenized.de-en \
-model fconv -nenclayer 4 -nlayer 3 -dropout 0.2 -optim nag -lr 0.25 -clip 0.1 \
-momentum 0.99 -timeavg -bptt 0 -savedir trainings/fconv
# Convolutional encoder, LSTM decoder
$ mkdir -p trainings/convenc
$ fairseq train -sourcelang de -targetlang en -datadir data-bin/iwslt14.tokenized.de-en \
-model conv -nenclayer 6 -dropout 0.2 -dropout_hid 0 -savedir trainings/convenc
执行程序过程中,代码会自动查找可以使用的GPU,如果不想占用太多GPU,可以使用:CUDA_VISIBLE_DEVICES=”GPU ID”指定想要使用的GPU,参考http://acceleware.com/blog/cudavisibledevices-masking-gpus。
F
基本环境搭建和初步的使用到这里就差不多了,对网络结构感兴趣的朋友可以去钻研下源码,欢迎互相交流。
更多的使用方法,参考FaceBook github地址:https://github.com/facebookresearch/fairseq