機器翻譯Transformer實戰:利用nvidia-docker和Tensorflow Serving快速部署一個基於Tensor2Tensor的神經機器翻譯服務

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速度確實比較慢,需要尋找其他方式進行部署(未解決)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章