1. 程式人生 > >別為Docker本地實現不支援GPU發愁,解決方案在此!

別為Docker本地實現不支援GPU發愁,解決方案在此!

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

導讀

通過提供獨立的執行環境而不需要整個虛擬機器的開銷,容器已經成為大規模部署應用程式的很有吸引力的選擇。

Docker讓容器變得易於使用,因此受到歡迎。通過使多個工程團隊能夠利用自己的配置進行開發、對齊基準或部署可擴充套件的微服務架構,容器在各個地方都有用。

基於GPU的應用程式,正在迅速成為標準工作流程的一部分,特別是在深度學習領域。

這些應用程式在容器化應用程式中的部署、測試和基準測試已經迅速成為公認的慣例。

但Docker容器的本地實現不支援NVIDIA GPU,這就是為什麼我們開發了nvidia-docker外掛。

在這裡,筆者會告訴你如何使用它。

Nvidia-docker

NVIDIA GPU要求核心模組和使用者級庫來被識別並用於計算。有一個解決這個問題的辦法,但需要安裝Nvidia驅動程式和對應於NVIDIA GPU字元裝置的對映。但是,如果主機的Nvidia驅動程式已更改,則安裝在容器內的驅動程式版本將不再相容,因此會中斷主機上的容器使用。這違背了容器的主要特徵,即可移動性。但是使用Nvidia Docker,可以無縫地配置一個GPU裝置可見的容器,並準備好執行基於GPU的應用程式。

Nvidia關於nvidia-docker的部落格強調了使用行動式GPU容器的兩個關鍵點:

——與驅動程式無關的CUDA映象

——Docker命令列包裝器,在啟動時將驅動程式的使用者模式元件和GPU(字元裝置)裝載到容器中。

Nvidia-docker入門

安裝NVIDIA Docker

在安裝nvidia-docker之前更新系統的NVIDIA驅動程式。另外,確保Docker安裝在系統上。完成之後,請按照此處的安裝說明進行操作(https://nvidia.github.io/nvidia-docker/)。

下一步是測試nvidia-docker:

rtaneja@DGX:~$ nvidia-docker
Usage: docker COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files
(default "/home/rtaneja/.docker") -D, --debug Enable debug mode --help Print usage -H, --host list Daemon socket(s) to connect to (default []) -l, --log-level string Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info") --tls Use TLS; implied by --tlsverify --tlscacert string Trust certs signed only by this CA (default "/home/rtaneja/.docker/ca.pem") --tlscert string Path to TLS certificate file (default "/home/rtaneja/.docker/cert.pem") --tlskey string Path to TLS key file (default "/home/rtaneja/.docker/key.pem") --tlsverify Use TLS and verify the remote -v, --version Print version information and quit

現在,讓我們測試一下,是否可以使用nvidia-docker而不是Docker命令從docker-hub中提取hello-world映象:

rtaneja@DGX:~$ nvidia-docker run --rm hello-world
Using default tag: latestlatest: Pulling from library/hello-world9a0669468bf7: Pull completeDigest: sha256:cf2f6d004a59f7c18ec89df311cf0f6a1c714ec924eebcbfdd759a669b90e711Status: Downloaded newer image for hello-world:latest
Hello from Docker!

上面的訊息顯示安裝正常工作。

開發GPU應用程式

對於CUDA開發,你可以先從Dockerhub提取nvidia / cuda映象。

rtaneja@DGX:~$ nvidia-docker run --rm -ti nvidia/cuda:
8.0 nvidia-smi8.0: Pulling from nvidia/cuda
16da43b30d89: Pull complete
1840843dafed: Pull complete
91246eb75b7d: Pull complete
7faa681b41d7: Pull complete
97b84c64d426: Pull complete
ce2347c6d450: Pull complete
f7a91ae8d982: Pull complete
ac4e251ee81e: Pull complete
448244e99652: Pull complete
f69db5193016: Pull complete
Digest: sha256:a73077e90c6c605a495566549791a96a415121c683923b46f782809e3728fb73
Status: Downloaded newer image for nvidia/cuda:8.0

構建自己的應用

現在,不用從docker命令列執行nvidia-smi,只要啟動一個容器,就可以構建一個Docker映象並使用CMD執行nvidia-smi。為了構建映象,Docker從Dockerfile讀取指令並進行組裝和映象。Docker hub的Ubuntu 16.04和CUDA 9.0的Dockerfile示例如下所示:

# FROM defines the base image
FROM nvidia/cuda:7.5
# RUN executes a shell command
# You can chain multiple commands together with &&
# A \ is used to split long lines to help with readability
RUN apt-get update && apt-get install -y --no-install-recommends \ cuda-samples-$CUDA_PKG_VERSION && \ rm -rf /var/lib/apt/lists/*

# CMD defines the default command to be run in the container
# CMD is overridden by supplying a command + arguments to
# `docker run`, e.g. `nvcc --version` or `bash`
CMD nvidia-smi
#end of Dockerfile


$ docker build -t my-nvidia-smi . # will build an image named my-nvidia-smi and assumes you have Dockerfile in the current directory
$ nvidia-docker images # or docker images will show the nvidia-smi image name

現在,我們準備執行映象。 預設情況下,你將看到主機上的所有GPU在容器內可見。使用NV_GPU環境變數,在nvidia-docker中,提供了一個包含所需GPU數量的容器。 例如,下面的命令將使容器只能看到來自主機的一個GPU:

NV_GPU=1 nvidia-docker run --rm my-nvidia-smi

+-----------------------------------------------------------------------------+| NVIDIA-SMI 384.81               Driver Version: 384.81                      ||-------------------------------+----------------------+----------------------+
| GPU Name          Persistence-M| Bus-Id      Disp.A  |Volatile  Uncorr. ECC |
| Fan Temp   Perf   Pwr:Usage/Cap|        Memory-Usage |GPU-Util   Compute M. |
|===============================+======================+======================|
| 0 Tesla V100-SXM2... On        |00000000:06:00.0 Off |                    0 |
| N/A    37C   P0     45W / 300W | 10MiB / 16152MiB    |           0% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                        GPU Memory|
| GPU         PID       Type       Process         name             Usage     |
|=============================================================================|
| No running processes found                                                  |
+---------------------------------------------------------------------------+

用於深度學習的Nvidia優化容器入門

要開始DL開發,你可以從docker集線器中提取nvidia DIGITS容器,並啟動DIGITS Web服務。下面的命令將主機上的埠8000對映到容器上的埠5000,執行此命令後,你可以訪問http:// localhost:8000上的DIGITS:

nvidia-docker run --name digits -ti -p 8000:5000 nvidia/digits

期待

新版本的nvidia-docker(2.0)專案是基於libnvidia-container的alpha版本釋出的,將來會成為部署GPU容器的首選方式。 現在,你已經對部署基於GPU的容器化應用程式有了大體瞭解,Nvidia還通過新發布的NVIDIA GPU雲容器登錄檔服務提供了容器化的易於使用的、全面優化的深度學習軟體堆疊。

雙12福利預告:

12月12日,開源雲中文社群將聯合K8S技術社群、EasyStack為國內社群使用者精彩送上“赴美大咖團國內首輪直播訪談”,為大家解讀KubeCon北美峰會最新最熱議題內容!新增小助手免費報名!

640?wx_fmt=jpeg

投稿郵箱:[email protected]

640?wx_fmt=jpeg