docker制作深度學(xué)習(xí)鏡像(以windows環(huán)境下為例)

向AI轉(zhuǎn)型的程序員都關(guān)注了這個(gè)號(hào)??????
人工智能大數(shù)據(jù)與深度學(xué)習(xí) ?公眾號(hào):datayx
用 Docker 安裝深度學(xué)習(xí)環(huán)境,輕量、方便!整個(gè)系統(tǒng)大小僅需2~3G,用完還能帶著走!一人裝環(huán)境,全班都能用,還有 NVIDIA 官方提供的 GPU 鏡像等著你哦~
深度學(xué)習(xí)環(huán)境的配置一直是一個(gè)令人頭疼的問題,尤其是對(duì)使用 Windows 平臺(tái)的用戶來說,在安裝一些開源深度學(xué)習(xí)框架的時(shí)候,經(jīng)常會(huì)遇到一起奇奇怪怪的問題。
為了避免出現(xiàn)環(huán)境問題,有些同學(xué)選擇使用 VMware、VirtualBox 運(yùn)行 Linux 虛擬機(jī)的方式進(jìn)行深度學(xué)習(xí)實(shí)驗(yàn)。但是像 VMware、VirtualBox 這類“重”虛擬機(jī)運(yùn)行起來常會(huì)拖慢系統(tǒng)。
所以今天要分享給大家的是使用 Docker 配置安裝深度學(xué)習(xí)環(huán)境。
使用Docker安裝環(huán)境的優(yōu)點(diǎn)如下:
無需自己配置環(huán)境,通過 Docker 鏡像可以使用各種已配置好的深度學(xué)習(xí)環(huán)境。
輕量便捷。一個(gè) Docker 客戶端+一個(gè)鏡像,總共大約3~4G即可組成一個(gè)深度學(xué)習(xí)系統(tǒng)環(huán)境。
便于分享。可以將自己的環(huán)境通過鏡像庫或直接以文件拷貝的方式傳播。
官方支持。很多深度學(xué)習(xí)框架&項(xiàng)目提供官方 Docker 鏡像。
英偉達(dá)專門提供的支持GPU虛擬化的Docker鏡像:

實(shí)戰(zhàn):9步創(chuàng)建深度學(xué)習(xí)環(huán)境
如何使用 Docker 創(chuàng)建并分享一個(gè)深度學(xué)習(xí)環(huán)境呢?需要9個(gè)步驟:
使用 阿里云 鏡像站點(diǎn)加速服務(wù)
Docker-machine
從阿里云鏡像獲取一個(gè)與需求相似的鏡像
把鏡像從庫里拖拽過來!
查看并運(yùn)行鏡像
將容器的修改提交到鏡像中
將鏡像上傳到阿里云鏡像倉庫中
將鏡像打包為獨(dú)立文件
測(cè)試分享出的 Docker 鏡像
docker在windows上的安裝
1.使用 阿里云 鏡像站點(diǎn)加速服務(wù)
在安裝 Docker 后,理論上我們就可以去 Docker Hub 上尋找我們想用的鏡像了。不過在國內(nèi)訪問國外的 Docker Hub 速度是非常慢的,所以我選擇使用阿里云的鏡像倉庫。
訪問:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
注冊(cè)阿里云賬戶并登錄。


選擇 Docker 鏡像加速器。
在這個(gè)界面里我們可以看到屬于自己的鏡像加速器地址。我們要把這個(gè)加速地址配置到 Docker 里,從而讓 Docker 默認(rèn)從加速地址中尋找并下載鏡像。

Linux 操作系統(tǒng)的配置都是通過修改 daemon 配置文件完成的,這個(gè)配置看起來比較簡(jiǎn)單。

Mac 以及 Windows 操作系統(tǒng)由于系統(tǒng)限制,必須使用 docker-machine 來配置加速地址。
2.Docker-machine?
docker-machine 本質(zhì)上是又是另一種虛擬機(jī)(怎么那么多虛擬機(jī)),我們暫且把它理解為一個(gè)自帶 Docker 的 VirtualBox 虛擬機(jī)。
上圖配置中第一條命令的意義是:使用阿里的加速地址創(chuàng)建一個(gè) docker-machine 虛擬機(jī)并啟動(dòng)。
后三條命令的意義是:通過配置環(huán)境變量(只在本終端中有效)用 docker-machine 虛擬機(jī)中的 Docker 環(huán)境覆蓋宿主機(jī)系統(tǒng)環(huán)境。
執(zhí)行這三條命令后:
在 Docker-machine 運(yùn)行期間,在當(dāng)前的宿主機(jī)終端中執(zhí)行的 Docker 命令,實(shí)際上都是由 docker-machine 虛擬機(jī)中的 Docker 環(huán)境執(zhí)行的,因?yàn)橹挥?docker-machine 虛擬機(jī)配置了阿里的加速地址。
3.從阿里云鏡像獲取一個(gè)與需求相似的鏡像
在鏡像加速器地址配置完畢后,我們就可以去尋找需要的 Docker 鏡像了。
我想找個(gè)已經(jīng)安裝好 Python3.6 的鏡像,以便進(jìn)一步安裝最新的 PyTorch 以及其它相關(guān)的軟件包,那么我搜索“python36”。


4.把鏡像從庫里拽過來!

可以點(diǎn)擊鏡像詳情,查看鏡像的外網(wǎng)地址,然后把鏡像拽到本地上來(之前必須已經(jīng)配置好阿里加速器)。
docker pull?registry.cn-shenzhen.aliyuncs.com
5.查看并運(yùn)行鏡像
我們可以使用命令 docker images 查看鏡像信息:

使用 docker run 命令將鏡像運(yùn)行為可交互的 shell:

在命令中:
-t:在新容器內(nèi)指定一個(gè)偽終端或終端。
-i:允許你對(duì)容器內(nèi)的標(biāo)準(zhǔn)輸入 (STDIN) 進(jìn)行交互。
在命令運(yùn)行后,我們可以觀察到當(dāng)前 shell 里的提示符已經(jīng)從“Alex-MacBook-Pro”已經(jīng)改成了“root@f8ad6eb17624”,這證明我們已經(jīng)在 Docker 容器的系統(tǒng)環(huán)境中了。
我們按照常規(guī)的方式安裝深度學(xué)習(xí)環(huán)境,比如用 pip 命令安裝 PyTorch、torchvision 等軟件包,并將項(xiàng)目源碼拷貝到運(yùn)行的容器中。
在宿主機(jī)與 Docker 容器間拷貝數(shù)據(jù)可使用 docker cp 命令。
在容器里進(jìn)行一系列的操作后,我們的工作完成,可以運(yùn)行 exit 命令退出當(dāng)前 shell。
此時(shí)我們可以觀察一下當(dāng)前的容器(docker ps -al)與之前的鏡像(docker images),可以看到容器與鏡像同時(shí)獨(dú)立存在,并且可以看到在容器中正在運(yùn)行的項(xiàng)目(交互shell,即/bin/bash)。

6.將容器的修改提交到鏡像中
假設(shè)我們?cè)谌萜骼锇惭b了新的軟件包并且跑通了自己的項(xiàng)目,現(xiàn)在打算把容器提交成鏡像分享給其它小伙伴。
需要操作的流程如下:
首先查看容器的ID(docker ps -al):

將容器提交到鏡像中,同時(shí)我們給它指定新的名字(docker commit [ID] [NEW_name]):

提交完成后我們?cè)俨榭幢緳C(jī)存在的鏡像(docker images):

可以看到經(jīng)我們修改后的新鏡像“python36/pytorch”獨(dú)立存在。
有句話叫“取之于民,用之于民”。
我們可以把這個(gè)包含最新版 PyTorch 環(huán)境的鏡像上傳到阿里云的鏡像庫中,讓更多的人可以使用我們的鏡像。
7.將鏡像上傳到阿里云鏡像倉庫中
我們首先在阿里云上創(chuàng)建一個(gè)鏡像倉庫:

然后我們需要在當(dāng)前的終端中登錄阿里云倉庫(之前必須配置了阿里云加速器):
docker login --username=USER_NAME?registry.cn-hangzhou.aliyuncs.com
要把鏡像上傳到指定的鏡像庫,需要先對(duì)鏡像進(jìn)行命名。整個(gè)名字由冒號(hào)“:”分成兩部分,前部分是我們?cè)谏弦徊浇⒌溺R像倉庫的地址,后部分是對(duì)當(dāng)前鏡像打的標(biāo)簽(TAG)。TAG的存在是為了允許一個(gè)鏡像庫里存在多個(gè)版本的鏡像。

好,這時(shí)候萬事具備了,我們運(yùn)行 push 命令將鏡像推送到云鏡像庫中。

在上傳結(jié)束后,我們就可以在云鏡像庫的web管理界面看到我們的鏡像了。

8.將鏡像打包為獨(dú)立文件
除了上傳云鏡像庫,我們也可以直接將鏡像打包成一個(gè)獨(dú)立文件,拷貝分享給別人使用。
同樣,我們使用命令 docker images 查看鏡像的名字,再使用 docker save -o 將目標(biāo)鏡像打包成文件。

9.測(cè)試分享出的 Docker 鏡像
現(xiàn)在讓我們測(cè)試下之前導(dǎo)出的鏡像。
首先嘗試導(dǎo)入剛剛在本地打包的鏡像:

導(dǎo)入成功。
再試下從阿里云鏡像庫中把之前建立的鏡像 pull 下來:

大功告成!還不快叫小伙伴一起來玩深度學(xué)習(xí)
docker?常用命令
1、安裝docker,參考?https://www.runoob.com/docker/docker-tutorial.html
2、下載自己需要的鏡像,可以在github上搜,比如pytorch的鏡像?https://github.com/anibali/docker-pytorch
docker pull anibali/pytorch:cuda-10.03、通過docker images查看自己機(jī)器上有的鏡像
4、創(chuàng)建容器并且進(jìn)入(如果只是更新鏡像內(nèi)的軟件包,可以不用掛載本地目錄)
docker run -it -v D:/data:/app --name test anibali/pytorch:cuda-10.0 /bin/bash
1
紅色是本機(jī)想要掛載在docker容器里面的文件夾,藍(lán)色是docker容器內(nèi)掛載本機(jī)紅色路徑對(duì)應(yīng)的文件夾,紫色是鏡像名字
5、進(jìn)入容器后,下載一些自己需要的包,exit退出
6、docker ps -a查看本地容器
7、更新鏡像
docker commit -m="update" -a="an" 79096af84806 an:pytorch
1
紅色是描述信息,紫色是鏡像作者名字,黃色是第6步中的container id,綠色是要?jiǎng)?chuàng)建的鏡像名稱
8、再通過docker images可以看到更新好的鏡像
9、導(dǎo)出鏡像
docker save an:pytorch > D:/an.tar
1
10、在另一臺(tái)有g(shù)pu的機(jī)器上導(dǎo)入自己制作的鏡像
docker load < /home/an.tar
1
11、創(chuàng)建容器并掛載gpu
docker run -it -v /home/data:/app -v /usr/local/docker-inspur/nvidia-volumes/volume:/usr/local/nvidia:ro --volume-driver=nvidia-docker --device=/dev/nvidiactl --device=/dev/nvidia-uvm --device=/dev/nvidia-uvm-tools --device=/dev/nvidia0 --device=/dev/nvidia1 --name ajp an:pytorch /bin/bash
1
藍(lán)色是掛載gpu,不同機(jī)器情況不一樣
卸載nvidia驅(qū)動(dòng)
rmmod nvidia
1
卸載驅(qū)動(dòng)如果出現(xiàn)nv_peer_mem進(jìn)程在使用nvidia,下面命令stop nv_peer_mem
/etc/init.d/nv_peer_mem start/stop/status
1
卸載cuda相關(guān),cd到cuda-x.x文件夾下,以10.0為例
cd /usr/local/cuda-10.0/bin
./uninstall_cuda_10.0.pl
1
2
查看nvidia相關(guān)進(jìn)程
lsmod | grep nvidia
1
如果沒有nvidia-uvm,需要去編譯一下Samples,隨便編譯一個(gè)就可以
cd /usr/local/NVIDIA_CUDA-10.0_Samples/0_Simple/clock
make
./clock
1
2
3
docker啟動(dòng)
systemctl start docker
service docker start
1
2
重啟docker服務(wù)
systemctl restart docker
sudo service docker restart
1
2
關(guān)閉docker
systemctl stop docker
service docker stop
1
2
如果/dev里面沒有顯卡,運(yùn)行如下
for i in 0 1 2 3 4 5; do
node="/dev/nvidia$i"
rm -f $node
mknod $node c 195 $i || echo "mknod \"$node\""
chmod 0660 $node || echo "chmod \"$node\""
chown :video $node || echo "chown \"$node\""
done
node="/dev/nvidiactl"
rm -f $node
mknod $node c 195 255 || echo "mknod \"$node\""
chmod 0666 $node || echo "chmod \"$node\""
chown :video $node || echo "chown \"$node\""閱讀過本文的人還看了以下文章:
TensorFlow 2.0深度學(xué)習(xí)案例實(shí)戰(zhàn)
基于40萬表格數(shù)據(jù)集TableBank,用MaskRCNN做表格檢測(cè)
《基于深度學(xué)習(xí)的自然語言處理》中/英PDF
Deep Learning 中文版初版-周志華團(tuán)隊(duì)
【全套視頻課】最全的目標(biāo)檢測(cè)算法系列講解,通俗易懂!
《美團(tuán)機(jī)器學(xué)習(xí)實(shí)踐》_美團(tuán)算法團(tuán)隊(duì).pdf
《深度學(xué)習(xí)入門:基于Python的理論與實(shí)現(xiàn)》高清中文PDF+源碼
python就業(yè)班學(xué)習(xí)視頻,從入門到實(shí)戰(zhàn)項(xiàng)目
2019最新《PyTorch自然語言處理》英、中文版PDF+源碼
《21個(gè)項(xiàng)目玩轉(zhuǎn)深度學(xué)習(xí):基于TensorFlow的實(shí)踐詳解》完整版PDF+附書代碼
《深度學(xué)習(xí)之pytorch》pdf+附書源碼
PyTorch深度學(xué)習(xí)快速實(shí)戰(zhàn)入門《pytorch-handbook》
【下載】豆瓣評(píng)分8.1,《機(jī)器學(xué)習(xí)實(shí)戰(zhàn):基于Scikit-Learn和TensorFlow》
《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》PDF+完整源碼
汽車行業(yè)完整知識(shí)圖譜項(xiàng)目實(shí)戰(zhàn)視頻(全23課)
李沐大神開源《動(dòng)手學(xué)深度學(xué)習(xí)》,加州伯克利深度學(xué)習(xí)(2019春)教材
筆記、代碼清晰易懂!李航《統(tǒng)計(jì)學(xué)習(xí)方法》最新資源全套!
《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》最新2018版中英PDF+源碼
將機(jī)器學(xué)習(xí)模型部署為REST API
FashionAI服裝屬性標(biāo)簽圖像識(shí)別Top1-5方案分享
重要開源!CNN-RNN-CTC 實(shí)現(xiàn)手寫漢字識(shí)別
同樣是機(jī)器學(xué)習(xí)算法工程師,你的面試為什么過不了?
前海征信大數(shù)據(jù)算法:風(fēng)險(xiǎn)概率預(yù)測(cè)
【Keras】完整實(shí)現(xiàn)‘交通標(biāo)志’分類、‘票據(jù)’分類兩個(gè)項(xiàng)目,讓你掌握深度學(xué)習(xí)圖像分類
VGG16遷移學(xué)習(xí),實(shí)現(xiàn)醫(yī)學(xué)圖像識(shí)別分類工程項(xiàng)目
特征工程(二) :文本數(shù)據(jù)的展開、過濾和分塊
如何利用全新的決策樹集成級(jí)聯(lián)結(jié)構(gòu)gcForest做特征工程并打分?
Machine Learning Yearning 中文翻譯稿
全球AI挑戰(zhàn)-場(chǎng)景分類的比賽源碼(多模型融合)
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
python+flask搭建CNN在線識(shí)別手寫中文網(wǎng)站
中科院Kaggle全球文本匹配競(jìng)賽華人第1名團(tuán)隊(duì)-深度學(xué)習(xí)與特征工程
不斷更新資源
深度學(xué)習(xí)、機(jī)器學(xué)習(xí)、數(shù)據(jù)分析、python
?搜索公眾號(hào)添加:?datayx??
機(jī)大數(shù)據(jù)技術(shù)與機(jī)器學(xué)習(xí)工程
?搜索公眾號(hào)添加:?datanlp
長(zhǎng)按圖片,識(shí)別二維碼
