別為Docker本地實現不支援GPU發愁,解決方案在此!
導讀
通過提供獨立的執行環境而不需要整個虛擬機器的開銷,容器已經成為大規模部署應用程式的很有吸引力的選擇。
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 readabilityRUN 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北美峰會最新最熱議題內容!新增小助手免費報名!
投稿郵箱:[email protected]