掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Docker 很棒——越來越多的人在開發(fā)與分布中使用它。Docker 有很多優(yōu)勢:即時(shí)環(huán)境設(shè)置、獨(dú)立于平臺(tái)的 app、現(xiàn)成的解決方案、更好的版本控制、簡化的維護(hù)。

但是在數(shù)據(jù)科學(xué)和深度學(xué)習(xí)方面,使用 Docker 有一些阻礙。你必須記住所有的 Docker 標(biāo)志,以在主機(jī)和容器之間共享端口和文件,創(chuàng)建不必要的 run.sh 腳本,并處理 CUDA 版本和 GPU 共享。如果你曾經(jīng)見過下面這個(gè)錯(cuò)誤,你就會(huì)明白這種痛苦:
- $ nvidia-smi
- Failedto initialize NVML:Driver/library version mismatch
我們的目標(biāo)
本文的目的在于為你介紹一系列 Docker 實(shí)用工具,以及我們經(jīng)常在公司使用的 GPU-ready 樣板文件。
因此,以下結(jié)果將不會(huì)出現(xiàn):
- docker run
- --rm
- --device /dev/nvidia0:/dev/nvidia0
- --device /dev/nvidiactl:/dev/nvidiactl
- --device /dev/nvidia-uvm:/dev/nvidia-uvm
- -p 8888:8888
- -v `pwd`:/home/user
- gcr.io/tensorflow/tensorflow:latest-gpu
取而代之的是這種結(jié)果:
- doc up
酷!
我們實(shí)際上想要達(dá)到的:
因此,這里是我們強(qiáng)烈推薦給每個(gè)深度學(xué)習(xí)者的工具清單:
1. CUDA
首先,你需要 CUDA 工具包,如果你打算自己動(dòng)手訓(xùn)練模型,那這是必須要有的。我們推薦使用 runfile 安裝程序類型而不是 deb,因?yàn)樗粫?huì)在以后的更新中混淆依賴關(guān)系。
(可選)如何檢查它是否工作:
- cd /usr/local/cuda/samples/1_Utilities/deviceQuery
- make
- ./deviceQuery #Shouldprint "Result = PASS"
2. Docker
你不想讓海量的庫污染你的計(jì)算機(jī),也害怕版本出現(xiàn)問題。同樣,你不必親自構(gòu)建和安裝——通常,軟件已為你創(chuàng)建好了,并包裝在圖像中。安裝 Docker 很簡單:
- curl -sSL https://get.docker.com/ | sh
3. Nvidia Docker
如果使用 Docker,必須有來自英偉達(dá)的實(shí)用程序(https://github.com/NVIDIA/nvidia-docker),它真正簡化了在 Docker 容器內(nèi)使用 GPU 的步驟。
安裝非常簡單:
- wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
- sudo dpkg -i /tmp/nvidia-docker*.deb
現(xiàn)在,不用每次都用下列方式來共享英偉達(dá)設(shè)備:
- docker run --rm --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm nvidia/cuda nvidia-smi
你可以使用 nvidia-docker 命令:
- nvidia-docker run --rm nvidia/cuda nvidia-smi
同樣,你也無需擔(dān)心驅(qū)動(dòng)程序版本不匹配:英偉達(dá)的 docker 插件將會(huì)幫你解決問題。
4. Docker Compose
超級有用的實(shí)用程序,允許你在文件中存儲(chǔ) docker run 配置,并更輕松地管理應(yīng)用程序狀態(tài)。盡管它的設(shè)計(jì)目的是組合多個(gè) docker 容器,但 docker compose 在你只有一個(gè)服務(wù)的時(shí)候依然非常有用。這里有一個(gè)穩(wěn)定版本
(https://github.com/docker/compose/releases):
- curl -L https://github.com/docker/compose/releases/download/1.15.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- chmod +x /usr/local/bin/docker-compose
5. Nvidia Docker Compose
不幸的是,Docker Compose 并不知道 Nvidia Docker 的存在。幸運(yùn)的是,有一個(gè)解決方法:有一個(gè)小的 Python 腳本,可以用 nvidia-docker 驅(qū)動(dòng)程序生成配置。通過 pip 安裝 Nvidia Docker Compose:
- pip install nvidia-docker-compose
現(xiàn)在你可以使用 nvidia-docker-compose 命令,而不是 docker-compose 了。
替代選擇
如果你不想使用 nvidia-docker-compose,你可以手動(dòng)傳遞音量驅(qū)動(dòng)程序,只需把這些選項(xiàng)添加到 docker-compose.yml:
- #Yournvidia driver version here
- volumes:
- nvidia_driver_375.26:
- external:true
- ...
- volumes:
- -nvidia_driver_375.26:/usr/local/nvidia:ro
6. Bash 別名
但是 nvidia-docker-compose 需要輸入 21 個(gè)字符,這太多了。
很幸運(yùn)我們可以使用 bash 別名。在你最喜愛的編輯器打開~/.bashrc(有時(shí)是~/.bash_profile),輸入以下代碼行:
- alias doc='nvidia-docker-compose'
- alias docl='doc logs -f --tail=100'
通過運(yùn)行 source ~/.bashrc 更新你的設(shè)置。
開始 TensorFlow 服務(wù)
現(xiàn)在我們準(zhǔn)備好利用上述所有工具的優(yōu)點(diǎn)。比如,我們運(yùn)行一個(gè) Tensorflow GPU 啟用的 Docker 容器。
在項(xiàng)目目錄中創(chuàng)建具有以下內(nèi)容的 docker-compose.yml 文件:
- version:'3'
- services:
- tf:
- image:gcr.io/tensorflow/tensorflow:latest-gpu
- ports:
- -8888:8888
- volumes:
- -.:/notebooks
現(xiàn)在我們可以使用單個(gè)命令開始 TensorFlow Jupiter:
- doc up
doc 是 nvidia-docker-compose 的別名——它將使用正確的 volume-driver 生成已修改的配置文件 nvidia-docker-compose.yml,然后運(yùn)行 docker-compose。
你可以使用相同的命令管理你的服務(wù):
- doc logs
- doc stop
- doc rm
- #...etc
結(jié)論
但是這值得嗎?下面讓我們看一下其優(yōu)缺點(diǎn)。
優(yōu)點(diǎn)
缺點(diǎn)
它是生產(chǎn)就緒(production-ready)的嗎
是的。在電影推薦應(yīng)用 Movix 中,我們使用 GPU 加速的 TensorFlow 網(wǎng)絡(luò)基于用戶輸入計(jì)算實(shí)時(shí)的電影選擇。
我們在 Proxy API 的 Rancher 集群中有三臺(tái)帶有 Nvidia Titan X 的電腦。配置儲(chǔ)存在常規(guī) docker-compose.yml 文件中:因此在一個(gè)新服務(wù)器上部署應(yīng)用程序或者設(shè)置開發(fā)環(huán)境變得很輕松。目前為止它的表現(xiàn)堪稱***。
為機(jī)器學(xué)習(xí)的未來做好準(zhǔn)備吧!
原文:https://hackernoon.com/docker-compose-gpu-tensorflow-%EF%B8%8F-a0e2011d36
【本文是專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號“機(jī)器之心( id: almosthuman2014)”】

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流