前言
相信大家都會(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)目陵究,可以讓?xiě)?yīng)用部署在Docker上自動(dòng)運(yùn)行,相當(dāng)于建立一個(gè)容器(Container)奥帘,功能類(lèi)似于虛擬機(jī)铜邮,作用類(lèi)似于一艘大船上的集裝箱,每個(gè)集裝箱之間互不影響(引自知乎如何通俗解釋Docker是什么寨蹋?)松蒜,而且開(kāi)銷(xiāo)比虛擬機(jī)小。后來(lái)Docker公司講這個(gè)開(kāi)源項(xiàng)目改名Moby已旧,意味著Docker這個(gè)軟件就屬于Docker公司的了(有興趣了解的秸苗,對(duì)于 Docker 改名 Moby ,大家怎么看?)运褪。
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
*然后要先注銷(xiāo)賬戶丸相,或者重啟搔确。修改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依賴(lài)和莫名其妙的錯(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)于云盤(pán)一樣年局,注冊(cè)好了就創(chuàng)建一個(gè)倉(cāng)庫(kù)际看,然后在本地構(gòu)建Docker鏡像后上傳到倉(cāng)庫(kù)。
- 顯示目前docker容器的ID
$ docker ps -l
- 構(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!