Tensorflow 1.13 Serving搭建心得on Docker(二)Python2.7+Tensorflow1.13.0-GPU+Tensor_Serving的docker

目錄-本系列緩慢更新中

一、Docker的安裝與配置

1、Docker的安裝

2、配置非sudo許可權賬號運行docker

以上內容收錄在:Tensorflow 1.13 Serving搭建心得on Docker(一)

二、Python2.7+Tensorflow-GPU+Tensor_Serving的docker搭建

1、利用Nvidia-docker,將本地GPU傳入Docker

2、Tensorflow官方鏡像直接利用

3、Bazel和Tensor_Serving配置安裝

以上內容收錄在:Tensorflow 1.13 Serving搭建心得on Docker(二)Python2.7+Tensorflow1.13.0-GPU+Tensor_Serving的docker


二、Python2.7+Tensorflow-GPU+Tensor_Serving的docker搭建

首先,要吐槽一下Google目前對於Python3的支持,真的非!常!差!之前的代碼都是python3寫的,所以本來希望搭建一個python3.5的環境。然而在嘗試的過程中,發現Tensor-Serving的bazel安裝過程,並不支持python3。

bazel build -c opt --force_python py3 --host_force_python=PY3 tensorflow_serving/...

雖然文檔給了如上的例子,假裝能讓你--host_force_python=PY3的傳參,但是build到最後是一定會報錯的。這個問題在github上已經被無數人吐槽。所以現在,各位還是不要嘗試python3.5+gpu+tf-serving的組合了……血淚教訓啊。如果之後支持了2.7我會再更新。

官網文檔中的apt-get install tensorflo_serving看起來很美好,很簡便,但是不支持GPU[微笑]

言歸正傳,下面和大家講一下如何搭建一個Python2.7+Tensorflow-GPU+Tensor_Serving的docker環境。

1、利用Nvidia-docker,將本地GPU傳入Docker

在docker中直接安裝nvidia-smi等GPU管理工具,理論上是可以實現的。但是需要由於docker和主機環境完全隔離,因此需要保證docker內和本地安裝的nvidia-smi版本,以及cuda版本、cudnn等版本都完全一致,要求非常高,對環境遷移造成不便。

Nvidia-docker則很好的封裝了這些,只需要容器內的cuda版本和宿主機相同就行(這個要求很低了),Nvidia-docker run的過程,會把本地的nvidia-smi導入到docker內部。

nvidia-docker只是run 和 exec命令和docker執行不同,其餘的和docker執行的一模一樣。

# 安裝nvidia-docker and nvidia-docker-plugin # 需要科學上網wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.debsudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb# 測試nvidia-smi(可以不測試,因為這個鏡像很大,我們直接在下一步測試nvidia-docker run --rm nvidia/cuda nvidia-smi

2、Tensorflow官方鏡像直接利用

從這裡開始,我的教程就和官網就有小區別,但是官網的教程真的很坑……跟下來做了一遍,發現不支持GPU的serving。所以以下是我自己的成功經驗,供大家參考。

tensorflow官方有安裝好tensorflow-gpu+cuda的docker鏡像,我們直接從這裡開始build我們的docker鏡像。

tesorflow的官方Dockerhub在這裡hub.docker.com/r/tensor

我選用的是tensorflow/tensorflow:latest-gpu,有兩種方式來build:

a) Dockerfile安裝

dockerfile相當於是在docker image內部跑一行行命令,構建出一層層的Image層,一個文件就能完成docker的建設。

docker build -t User/dockerbuild-tfserving -f Dockerfile.tfserving .

其中User/dockerbuild-tfserving是Image的Tag名字,後面是Dockerfile的路徑

但是其實內容和下面是一樣的。

b)跟我一步步安裝,這樣能看到哪裡有問題

由於科學上網相關問題,很多步驟可能會莫名停掉,如果報443或者proxy錯誤,就是網路問題,各位需要自行調整。

docker build --pull -t tensorflow/tensorflow:latest-gpunvidia-docker run -it --name dockerbuild tensorflow/tensorflow:latest-gpu /bin/bash

這一步我們用nvidia-docker run啟動。進入以後輸入nvidia-smi,理論上就能看到gpu的運行情況了。如果不行,請在下面留言說明具體情況。

安裝依賴:

apt-get update && apt-get install -y build-essential curl git libfreetype6-dev libpng12-dev libzmq3-dev mlocate pkg-config python-dev python-numpy python-pip software-properties-common swig zip zlib1g-dev libcurl3-dev openjdk-8-jdk openjdk-8-jre-headless wget vim apt-get cleanpip install mock grpcio autograd

安裝bazel(google的環境搭建工具)

# 創建安裝目錄mkdir /bazelcd /bazel# 此處建議掛一個梯子# 下載安裝文件和licence文件curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/0.5.1/bazel-0.5.1-installer-linux-x86_64.shcurl -fSsL -o /bazel/LICENSE.txt https://raw.githubusercontent.com/bazelbuild/bazel/master/LICENSE# 給文件執行許可權並安裝chmod +x bazel-*.sh./bazel-0.5.1-installer-linux-x86_64.sh# 清理rm -f /bazel/bazel-0.5.1-installer-linux-x86_64.sh

安裝CUDNN

cudnn也是個比較容易報錯的地方,我下載的是cudnn6.0,對應的tensorflow版本是1.13.0,供參考。

這一步的過程是:下載-解壓-文件移動-許可權配置

# 假設已經下載並解壓到/home/cudacp -P /home/cuda/include/cudnn.h /usr/local/cuda/includecp -P /home/cuda/lib64/libcudnn* /usr/local/cuda/lib64chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

下載並安裝tensorflow-serving

# 下載tf-servinggit clone --recurse-submodules https://github.com/tensorflow/servingcd servingcd tensorflow# 配置基本選項。CUDA要寫Y,cudnn要寫6./configurecd ..# 如果不build這一步,官網文檔裡面的測試過程就跑不起來bazel build -c opt tensorflow_serving/example/...# build整體的tfservingbazel build -c opt tensorflow_serving/...# 運行serving命令bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server

# 測試安裝是否正常bazel test -c opt tensorflow_serving/...

之後可以用docker commit保存成為Image分發,也可以寫一個Dockerfile來進行分發。

至此,一個Python2.7+Tensorflow-GPU+Tensor_Serving的docker就搭建完畢了!

可以直接跟著Serving Inception Model with TensorFlow Serving and Kubernetes | TensorFlow 嘗試跑一下自己的serving~

下一個章節,我會展示一下,如何把自己的程序改寫成tf-serving的運行形式。


推薦閱讀:

Dockerfile: ENTRYPOINT和CMD的區別
基於Docker、NodeJs實現高可用的服務發現
學習Docker哪本書最好?
Docker 公司已死 !
Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 實踐

TAG:TensorFlow | Docker | 深度學習DeepLearning |