机器翻译Transformer实战:利用nvidia-docker和Tensorflow Serving快速部署一个基于Tensor2Tensor的神经机器翻译服务

假如想象 提交于 2019-12-04 03:48:22

Docker目前也只是跑通,能进行基本的使用。
如果有需求,还可以使用Docker GPU版本,可以使用GPU。
以GPU版本为例:

卸载原有的Docker

sudo apt-get remove docker
sudo apt-get remove docker-ce
sudo apt-get remove docker docker-engine docker.io containerd runc

本机环境

nvidia驱动:最新版
Ubuntu16.04
Python3.6
Tensor2Tensor 1.9 #不要下载最新版,只支持TF1.13.0
Tensorflow 1.12.0 #(可不安装)
Tensorflow-gpu 1.12.0
CUDA 9.0.176
cudnn 7.0.5
pip3 最新版

Tensorflow安装(默认已安装好对应的CUDA和cudnn版本)

sudo pip3 install tensorflow==1.12 #(可不安装)
sudo pip3 install tensorflow-gpu==1.12 #GPU版本
#可以使用清华源进行安装,满速下载
sudo pip3 install tensorflow-gpu==1.12.0 -i https://pypi.tuna.tsinghua.edu.cn/simple #可改成任意版本

Docker CE安装 :官方文档

sudo apt-get update

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
    
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

sudo docker run hello-world

让Docker支持GPU :nvidia-docker

git clone https://github.com/NVIDIA/nvidia-docker.git
docker volume ls -q -f driver = nvidia-docker | xargs -r -I {} -n1 docker ps -q -a -f volume = {} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add  - 
distribution = $( 。/ etc / os-release ; echo $ ID $ VERSION_ID ) 
curl -s -L https://nvidia.github.io/nvidia-docker/ $ distribution /nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

sudo docker run --runtime = nvidia --rm nvidia / cuda:9.0-base nvidia-smi

安装并使用Tensor2Tensor训练机器翻译模型 :T2T官方baseline或者AI Challenger 2018官方baseline

git clone https://github.com/tensorflow/tensor2tensor
sudo pip3 install tensor2tensor==1.9
sudo pip3 install tensor2tensor[tensorflow_gpu] #安装需求

跑通baseline即可由数据下载,数据处理,模型训练到模型预测得到一个可供翻译的神经机器翻译模型,默认情况一般会占用40G或者更大的空间(默认情况会保存20个checkpoint,每个CKPT大约2.4G),这里不再具体介绍模型训练相关。
导出训练好的模型(默认导出最后一个CKPT)

t2t-exporter --problems=$PROBLEM --data_dir=$DATA_DIR --model=$MODEL --hparams_set=$HPARAMS --output_dir=$TRAIN_DIR

#得到$TRAIN_DIR/export/1545437656的文件夹
#包含三个文件saved_model.pbtxt,variables.data-00000-of-00001,variables.index

使用我们的Docker创建容器

sudo docker pull tensorflow/serving:latest-gpu

sudo docker run --runtime=nvidia -p 8501:8500 --mount type=bind,source=$TRAIN_DIR/export,target=/models/yyq -e MODEL_NAME=yyq -t tensorflow/serving:latest-gpu 
#source:这里要填模型文件的地址,填到export
#模型名称随意,对应即可

#如果你有多个GPU,并只使用其中的一部分:
sudo NV_GPU=0,1,2 nvidia-docker run -p 8501:8500 --mount type=bind,source=$TRAIN_DIR/export,target=/models/yyq -e MODEL_NAME=yyq -t tensorflow/serving:latest-gpu 

#使用完后最好将相关进程kill掉,否则可能会出现端口占用的问题无法解决(事后用其他方法无法解决端口占用问题)

#Docker获取root权限(不需要sudo docker xxxxx,直接docker xxxxxx):
https://docs.docker.com/install/linux/linux-postinstall/

安装Tensorflow_serving

sudo pip3 install tensorflow-serving-api

开启预测服务端

t2t-query-server --server=localhost:8501 --servable_name=yyq --problem=$PROBLEM --data_dir=$DATA_DIR

查看GPU使用情况

nvidia-smi

大功告成,现在就可以在终端下进行翻译了。

#关闭翻译服务的话,最好是关闭终端之后,再杀掉相关的进程!!!
sudo kill -s 9 PID #nvidia-smi中显示的PID

如果要进行线上部署则需要前端的flask进行路由的转发,修改query.py连接前后端。

一个没有解决的问题:在我们训练完模型进行decoder时,可以对beam_size和alpha_size进行调节设置,但是我们使用serving搭建服务端进行实时翻译的过程中却没有对beam_size和alpha_size设置的办法,查询serving文件夹内相关代码,没有发现相关内容,不知该如何解决,如果有朋友知道,麻烦分享一下。
一个新的问题:翻译速度怎样提升(以目前这个流程配置出来的服务端,翻译会比较慢),是否可以使用其他的服务。
关于上面两个问题:第一个问题已经解决,在我们导出模型的时候可以设置decoder_hparams参数,即alpha和beam,即可导出对应模型;第二个问题,据了解,tensorflow自带的serving速度确实比较慢,需要寻找其他方式进行部署(未解决)。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!