使用Docker打包Tensorflow項(xiàng)目(GPU)

前言

相信大家都會(huì)遇到這個(gè)問(wèn)題,無(wú)論是Coder還是Researcher,希望打包和發(fā)布自己的深度學(xué)習(xí)項(xiàng)目,可能學(xué)過(guò)Python的人都知道可以用py2exe、pyinstaller等等打包工具(將py文件轉(zhuǎn)換成exe格式,使其能在沒(méi)有安裝python的windows系統(tǒng)上運(yùn)行),但是對(duì)于深度學(xué)習(xí)框架Tensorflow和Cuda環(huán)境就不行了,那么這些深度學(xué)習(xí)項(xiàng)目一般是怎么開(kāi)發(fā)的呢?在windows上的話一般是用VS編譯Tensorflow c++版本然后進(jìn)行開(kāi)發(fā),(可以參考如何用C++在TensorFlow中訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)),Android也有相應(yīng)的版本。另外,如果是在線部署Tensorflow項(xiàng)目的話請(qǐng)參考Tensorflow serving。

但是如果我們的項(xiàng)目本來(lái)就是在Tensorflow框架上進(jìn)行訓(xùn)練的,又不想進(jìn)行二次開(kāi)發(fā),想要使我們的項(xiàng)目能在沒(méi)有安裝Tensorflow的系統(tǒng)上運(yùn)行,那么Docker也許能滿足我們的需求。

Docker介紹

Docker原本是一個(gè)開(kāi)源的項(xiàng)目,可以讓應(yīng)用部署在Docker上自動(dòng)運(yùn)行,相當(dāng)于建立一個(gè)容器(Container),功能類似于虛擬機(jī),作用類似于一艘大船上的集裝箱,每個(gè)集裝箱之間互不影響(引自知乎如何通俗解釋Docker是什么?),而且開(kāi)銷比虛擬機(jī)小。后來(lái)Docker公司講這個(gè)開(kāi)源項(xiàng)目改名Moby,意味著Docker這個(gè)軟件就屬于Docker公司的了(有興趣了解的,對(duì)于 Docker 改名 Moby ,大家怎么看?)。

官方的Docker示意圖

Docker使用

既然Docker這么好,我們就學(xué)學(xué)怎么用:
B站有Docker的教程,很不錯(cuò),有興趣的可以去看看Docker入坑教程。
那么這里主要介紹如何安裝,首先我們跟著官方的手冊(cè)來(lái)安裝:
這里以Ubuntu 16.04為例:

  • 更新apt包
$ sudo apt-get update
  • 安裝需要用到的工具
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
  • 添加Docker的官方GPG key:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • 添加Docker倉(cāng)庫(kù)
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
  • 接下來(lái)就是安裝Docker,安裝前要更新apt包:
$ sudo apt-get update
$ sudo apt-get install docker-ce
  • 測(cè)試是否安裝成功:
$ sudo docker run hello-world
  • 如果出現(xiàn)以下問(wèn)題:
docker: Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/latest: Get https://auth.docker.io/token?scope=repository%3Alibrary%2Fhello-world%3Apull&service=registry.docker.io: net/http: TLS handshake timeout.
  • 需要修改HTTP_PROXY:
$ sudo vim /etc/default/docker
  • 然后注釋export這一句:
# If you need Docker to use an HTTP proxy, it can also be specified here.
export http_proxy="http://127.0.0.1:3128/"

重新測(cè)試一下就沒(méi)問(wèn)題了。這里有個(gè)問(wèn)題需要注意一下,我們執(zhí)行Docker都是以root權(quán)限(原因是docker進(jìn)程綁定的是Unix socket而不是TCP端口),那么為了方便呢,我們還要設(shè)置一下,創(chuàng)建一個(gè)用戶組docker,權(quán)限跟root一樣,然后讓我的用戶加入這個(gè)組里。但是這么做存在一些風(fēng)險(xiǎn)(Docker daemon attack surface

  • 創(chuàng)建docker組:
$ sudo groupadd docker
  • 讓當(dāng)前用戶加入組:
$ sudo usermod -aG docker $USER

*然后要先注銷賬戶,或者重啟。修改docker組的權(quán)限:

$ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
$ sudo chmod g+rwx "/home/$USER/.docker" -R

安裝nvidia-docker

因?yàn)橄M覀兊腄ocker是可以用GPU的,所以還需要安裝nvidia-docker。

  • 添加nvidia-docker的倉(cāng)庫(kù):
$ 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
  • 更新apt包:
$ sudo apt-get update
  • 安裝nvidia-docker2:
$ sudo apt-get install -y nvidia-docker2
$ sudo pkill -SIGHUP dockerd

Docker安裝Tensorflow

你可以在Docker官網(wǎng)上挑選自己想安裝的tensorflow版本(Tensorflow鏡像
也可以之間安裝最新的tensorflow鏡像:

$ nvidia-docker run -it tensorflow/tensorflow:latest-gpu bash

如果你是使用Jupyter來(lái)開(kāi)發(fā)你的項(xiàng)目的,可以修改hostPort和containerPort:

$ nvidia-docker run -it -p 8888:8888 tensorflow/tensorflow:latest-gpu

開(kāi)發(fā)項(xiàng)目

在加載了Tensorflow的鏡像后,就可以開(kāi)始在Docker上進(jìn)行訓(xùn)練模型了。
但是如果我們不僅僅需要Tensorflow一個(gè)深度學(xué)習(xí)框架怎么辦,比如我們還需要用到Caffe、Torch,我在安裝Torch的時(shí)候,就出現(xiàn)很多cuda依賴和莫名其妙的錯(cuò)誤。我嘗試找了一下,github上就有人制作了集合所有常見(jiàn)的深度學(xué)習(xí)框架的鏡像,感謝分享https://github.com/ufoym/deepo。

當(dāng)我們訓(xùn)練好我們的深度學(xué)習(xí)模型,準(zhǔn)備發(fā)布版本的時(shí)候,就需要打包我們整個(gè)工程的Docker鏡像。
首先我們?nèi)ocker Hub注冊(cè)帳號(hào),相當(dāng)于云盤一樣,注冊(cè)好了就創(chuàng)建一個(gè)倉(cāng)庫(kù),然后在本地構(gòu)建Docker鏡像后上傳到倉(cāng)庫(kù)。

  • 顯示目前docker容器的ID
$ docker ps -l
找到CONTAINER ID
  • 構(gòu)建Docker鏡像
$ docker commit 容器ID 用戶名/倉(cāng)庫(kù)名

這就已經(jīng)保存為本地的Docker鏡像了。

  • 查看已保存的鏡像文件
$ docker images
  • 上傳Docker鏡像
$ docker push 用戶名/倉(cāng)庫(kù)名

這時(shí)系統(tǒng)會(huì)提示你登陸帳號(hào),登陸成功后就會(huì)上傳到倉(cāng)庫(kù)。
這時(shí)整個(gè)流程就結(jié)束了,你可以分享給其他人,或者在其他電腦用Docker運(yùn)行這個(gè)鏡像就可以了。

PS:本文是我記錄學(xué)習(xí)過(guò)程的筆記,其中難免會(huì)有紕漏,希望各位朋友指正。如果有幫助到你,like一下,我們互相交流,互相進(jìn)步。Life is awesome!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容