NVIDIA 使用容器來(lái)開(kāi)發(fā)、測(cè)試、基準(zhǔn)測(cè)試和部署深度學(xué)習(xí)( DL )框架和 HPC 應(yīng)用程序。大約兩年前,我們用 NVIDIA -Docker 大規(guī)模地寫(xiě)了 構(gòu)建和部署 GPU 容器 。從那時(shí)起, NVIDIA -Docker 被下載了近 200 萬(wàn)次。許多客戶使用 NVIDIA -Docker 將 NVIDIA 集裝箱化并運(yùn)行 GPU 加速的工作負(fù)載。
NVIDIA 通過(guò) NVIDIA GPU 云( NGC )提供 GPU 加速容器,用于 DGX 系統(tǒng)、公共云基礎(chǔ)設(shè)施,甚至是帶有 GPUs 的本地工作站。 NVIDIA -Docker 是這些計(jì)劃的關(guān)鍵基礎(chǔ)技術(shù)。
除了 Docker 之外,容器技術(shù)被用于 DL 和 HPC 工作負(fù)載的不斷發(fā)展的用例集,這使得我們從根本上重新思考我們現(xiàn)有的 NVIDIA -Docker 架構(gòu)。我們的主要目標(biāo)不僅追求不同容器運(yùn)行時(shí)的可擴(kuò)展性,而且還追求容器編排系統(tǒng)的可擴(kuò)展性。
這里介紹的 NVIDIA 容器運(yùn)行時(shí)是我們的下一代 GPU 感知容器運(yùn)行時(shí)。它與 Docker 使用的 Open Containers Initiative ( OCI )規(guī)范和其他流行的容器技術(shù)兼容。
您將了解到 NVIDIA 容器運(yùn)行時(shí)組件,以及如何擴(kuò)展它以支持多個(gè)容器技術(shù)。讓我們檢查一下新運(yùn)行時(shí)的體系結(jié)構(gòu)和優(yōu)點(diǎn),展示一些新特性,并介紹一些使用 Docker 和 LXC 部署 GPU 加速應(yīng)用程序的示例。
NVIDIA 集裝箱運(yùn)行時(shí)間
NVIDIA 在 2016 年設(shè)計(jì)了 NVIDIA -Docker ,以實(shí)現(xiàn) Docker 映像中的可移植性,利用 NVIDIA GPUs 。它允許與驅(qū)動(dòng)程序無(wú)關(guān)的 CUDA 映像,并提供一個(gè) Docker 命令行包裝器,在啟動(dòng)時(shí)將驅(qū)動(dòng)程序的用戶模式組件和 GPU 設(shè)備文件裝入容器中。
在 NVIDIA -Docker 的生命周期中,我們意識(shí)到架構(gòu)缺乏靈活性,原因如下:
與 Docker 的緊密集成不允許將來(lái)支持其他容器技術(shù),如 LXC 、 CRI-O 和其他運(yùn)行時(shí)
我們希望利用 Docker 生態(tài)系統(tǒng)中的其他工具–例如 撰寫(xiě) (用于管理由多個(gè)容器組成的應(yīng)用程序)
在 Kubernetes 和 Swarm 等編排器中支持 GPUs 作為一級(jí)資源
改進(jìn)對(duì) GPUs 的容器運(yùn)行時(shí)支持,特別是自動(dòng)檢測(cè)用戶級(jí) NVIDIA 驅(qū)動(dòng)程序庫(kù), NVIDIA 內(nèi)核模塊、設(shè)備排序、兼容性檢查和 GPU 功能,如圖形、視頻加速
因此,重新設(shè)計(jì)的 NVIDIA -Docker 將對(duì) GPUs 的核心運(yùn)行時(shí)支持轉(zhuǎn)移到一個(gè)名為 libnvidia-container 的庫(kù)中。該庫(kù)依賴(lài)于 Linux 內(nèi)核原語(yǔ),并且相對(duì)于更高的容器運(yùn)行時(shí)層是不可知的。這使得 GPU 支持很容易擴(kuò)展到不同的容器運(yùn)行時(shí),如 Docker 、 LXC 和 CRI-O 。該庫(kù)包括一個(gè)命令行實(shí)用程序,還提供了一個(gè) API ,以便將來(lái)集成到其他運(yùn)行時(shí)中。我們構(gòu)建的用于集成到各種運(yùn)行時(shí)的庫(kù)、工具和層統(tǒng)稱(chēng)為 NVIDIA 容器運(yùn)行時(shí)。
在接下來(lái)的幾節(jié)中,您將了解到 Docker 和 LXC 的集成。
Docker 支持
在深入研究 NVIDIA 容器運(yùn)行時(shí)與 Docker 的集成之前,讓我們簡(jiǎn)單看看 Docker 平臺(tái)是如何演變的。
自 2015 年以來(lái), Docker 一直在捐贈(zèng)其容器平臺(tái)的關(guān)鍵組件,首先是開(kāi)放容器倡議( OCI )規(guī)范和一個(gè)名為 runc 的輕量級(jí)容器運(yùn)行時(shí)規(guī)范的實(shí)現(xiàn)。 2016 年末, Docker 還捐贈(zèng)了一個(gè)管理容器生命周期和包裝 OCI / runc 的守護(hù)程序 containerd 。 containerd 守護(hù)進(jìn)程處理圖像的傳輸、容器的執(zhí)行(使用 runc )、存儲(chǔ)和網(wǎng)絡(luò)管理。它被設(shè)計(jì)成嵌入到更大的系統(tǒng)中,比如 Docker 。關(guān)于這個(gè)項(xiàng)目的更多信息可以在官方網(wǎng)站 網(wǎng)站 上找到。
圖 1 顯示了 libnvidia-container 如何集成到 Docker 中,特別是在 GPU 層。為了在 Docker 中啟用 nvidia-container-runtime-hook 容器,我們使用了一個(gè)名為 nvidia-container-runtime-hook 到 runc 的定制 OCI 預(yù)啟動(dòng)鉤子(有關(guān)鉤子的更多信息可以在 OCI 運(yùn)行規(guī)范 中找到)。在 runc 中添加預(yù)啟動(dòng)鉤子需要我們用 Docker 注冊(cè)一個(gè)新的與 OCI 兼容的運(yùn)行時(shí)(使用– runtime 選項(xiàng) )。在創(chuàng)建容器時(shí),預(yù)啟動(dòng)鉤子檢查容器是否啟用了 GPU (使用環(huán)境變量),并使用容器運(yùn)行庫(kù)向容器公開(kāi) NVIDIA GPUs 。
圖 1 NVIDIA 容器運(yùn)行時(shí)與 Docker 的集成
runc 層的集成還允許靈活地支持其他 OCI 運(yùn)行時(shí),如 CRI-O 。 containerd 的 1 。 1 版增加了對(duì) Kubernetes 中容器運(yùn)行時(shí)接口( CRI )的支持;上周 Kubernetes 宣布 通過(guò) CRI 插件實(shí)現(xiàn)了 containerd 集成的普遍可用性。 NVIDIA 運(yùn)行時(shí)的新架構(gòu)可以很容易地支持 Kubernetes 運(yùn)行時(shí)的任何一種選擇。這種靈活性非常重要,因?yàn)槲覀兣c社區(qū)密切合作,使 Kubernetes 的 GPU 支持 成為一流的。
環(huán)境變量
NVIDIA 容器運(yùn)行時(shí)使用容器映像中的環(huán)境變量指定 GPU 加速容器。
NVIDIA _可視設(shè)備:可在容器內(nèi)訪問(wèn) GPUs 的控件。默認(rèn)情況下,容器可以訪問(wèn)所有 GPUs 。
NVIDIA _驅(qū)動(dòng)程序功能:控制哪些驅(qū)動(dòng)程序特性(例如計(jì)算、圖形)暴露到容器中。
NVIDIA U 需要 u *:邏輯表達(dá)式,用于定義容器支持的配置上的約束(例如最小 CUDA 、驅(qū)動(dòng)程序或計(jì)算能力)。
如果沒(méi)有檢測(cè)到環(huán)境變量(在 Docker 命令行或圖像中),則使用默認(rèn)的 runc 。您可以在 NVIDIA 容器運(yùn)行時(shí) 文檔 中找到有關(guān)這些環(huán)境變量的更多信息。這些環(huán)境變量已經(jīng)在 NVIDIA 的 官方的 CUDA 容器中設(shè)置。
安裝
您的系統(tǒng)必須滿足以下先決條件,才能在 Docker 中開(kāi)始使用 NVIDIA 容器運(yùn)行時(shí)。
支持 您的發(fā)行版的 Docker 版本。跟隨 Docker 的官方 說(shuō)明書(shū) 。
最新的 NVIDIA 驅(qū)動(dòng)程序。使用 程序包管理器 安裝 cuda-drivers 包,或者使用驅(qū)動(dòng)程序下載 網(wǎng)站 中的安裝程序。請(qǐng)注意,使用 cuda-drivers 包可能無(wú)法在 Ubuntu 18.04 LTS 系統(tǒng)上運(yùn)行。
要開(kāi)始使用帶有 Docker 的 NVIDIA 容器運(yùn)行時(shí),可以使用 NVIDIA -docker2 安裝程序包,也可以手動(dòng)使用 設(shè)置 運(yùn)行時(shí)和 Docker 引擎。 nvidia-docker2 軟件包包括一個(gè)自定義的 daemon.json 文件,用于將 NVIDIA 運(yùn)行時(shí)注冊(cè)為 Docker 的默認(rèn)運(yùn)行時(shí),以及一個(gè)向后兼容 NVIDIA -Docker 1. 0 的腳本。
如果安裝了 NVIDIA -docker 1.0 ,則需要在安裝 NVIDIA 運(yùn)行時(shí)之前刪除它和任何現(xiàn)有的 GPU 容器。請(qǐng)注意,以下安裝步驟適用于 Debian 發(fā)行版及其衍生產(chǎn)品。
$ docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f $ sudo apt-get purge -y nvidia-docker
現(xiàn)在,讓我們添加包存儲(chǔ)庫(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 $ sudo apt-get update
然后使用nvidia-docker2
包安裝各個(gè)組件并重新加載 Docker 守護(hù)程序配置。
$ sudo apt-get install -y nvidia-docker2 $ sudo pkill -SIGHUP dockerd
運(yùn)行以下命令行實(shí)用程序( CLI )以驗(yàn)證 NVIDIA 驅(qū)動(dòng)程序和運(yùn)行時(shí)是否已正確安裝在您的系統(tǒng)上(作為安裝程序包的一部分提供)。運(yùn)行時(shí) CLI 提供有關(guān)系統(tǒng)中檢測(cè)到的驅(qū)動(dòng)程序和設(shè)備的信息。在本例中,運(yùn)行庫(kù)已正確檢測(cè)并枚舉了系統(tǒng)中的 4 個(gè) NVIDIA Tesla v100 。
$ sudo nvidia-container-cli--load-kmods info NVRM version: 396.26 CUDA version: 9.2 Device Index: 0 Device Minor: 2 Model: Tesla V100-SXM2-16GB GPU UUID: GPU-e354d47d-0b3e-4128-74bf-f1583d34af0e Bus Location: 00000000:00:1b.0 Architecture: 7.0 Device Index: 1 Device Minor: 0 Model: Tesla V100-SXM2-16GB GPU UUID: GPU-716346f4-da29-392a-c4ee-b9840ec2f2e9 Bus Location: 00000000:00:1c.0 Architecture: 7.0 Device Index: 2 Device Minor: 3 Model: Tesla V100-SXM2-16GB GPU UUID: GPU-9676587f-b418-ee6b-15ac-38470e1278fb Bus Location: 00000000:00:1d.0 Architecture: 7.0 Device Index: 3 Device Minor: 2 Model: Tesla V100-SXM2-16GB GPU UUID: GPU-2370332b-9181-d6f5-1f24-59d66fc7a87e Bus Location: 00000000:00:1e.0 Architecture: 7.0
nvidia-container-cli 檢測(cè)到的 CUDA 版本驗(yàn)證主機(jī)上安裝的 NVIDIA 驅(qū)動(dòng)程序是否足以運(yùn)行基于特定 CUDA 版本的容器。如果存在不兼容,運(yùn)行時(shí)將不啟動(dòng)容器。有關(guān) CUDA 兼容性和最低驅(qū)動(dòng)程序要求的更多信息,請(qǐng)參見(jiàn) 在這里 。
現(xiàn)在,讓我們嘗試用 Docker 運(yùn)行一個(gè) GPU 容器。這個(gè)例子提取 Docker Hub 存儲(chǔ)庫(kù) 上可用的 NVIDIA CUDA 容器,并在容器內(nèi)運(yùn)行 nvidia-smi 命令。
$ sudo docker run --rm --runtime=nvidia -ti nvidia/cuda root@d6c41b66c3b4:/# nvidia-smi Sun May 20 22:06:13 2018 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 396.26 Driver Version: 396.26 | |-------------------------------+----------------------+----------------------+ | 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:00:1B.0 Off | Off | | N/A 41C P0 34W / 300W | 0MiB / 16160MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla V100-SXM2... On | 00000000:00:1C.0 Off | Off | | N/A 39C P0 35W / 300W | 0MiB / 16160MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 2 Tesla V100-SXM2... On | 00000000:00:1D.0 Off | Off | | N/A 39C P0 38W / 300W | 0MiB / 16160MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 3 Tesla V100-SXM2... On | 00000000:00:1E.0 Off | 0 | | N/A 42C P0 38W / 300W | 0MiB / 16160MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
運(yùn)行 GPU 集裝箱
現(xiàn)在讓我們看一些運(yùn)行更復(fù)雜的 GPU 應(yīng)用程序的例子。 NVIDIA 為 深度學(xué)習(xí) 和 NGC 注冊(cè) 上的 HPC 提供了多種預(yù)制容器。
深度學(xué)習(xí)框架容器
這個(gè)例子使用 NGC 提供的 PyTorch 深度學(xué)習(xí)框架容器來(lái)訓(xùn)練一個(gè) deep 神經(jīng)網(wǎng)絡(luò) 。您需要打開(kāi)一個(gè)免費(fèi)的 NGC 帳戶才能訪問(wèn)最新的深度學(xué)習(xí)框架和 HPC 容器。 NGC 文件 概述了開(kāi)始所需的步驟。
本例使用了 NVIDIA_VISIBLE_DEVICES 變量,僅向容器公開(kāi)兩個(gè) GPUs 。
$ sudo docker run -it --runtime=nvidia --shm-size=1g -e NVIDIA_VISIBLE_DEVICES=0,1 --rm nvcr.io/nvidia/pytorch:18.05-py3 Copyright (c) 2006 Idiap Research Institute (Samy Bengio) Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz) All rights reserved. Various files include modifications (c) NVIDIA CORPORATION. All rights reserved. NVIDIA modifications are covered by the license terms that apply to the underlying project or file.
在容器中運(yùn)行nvidia-smi
命令,驗(yàn)證只有兩個(gè) GPUs 可見(jiàn)。
root@45cebefa1480:/workspace# nvidia-smi Mon May 28 07:15:39 2018 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 396.26 Driver Version: 396.26 | |-------------------------------+----------------------+----------------------+ | 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:00:1B.0 Off | 0 | | N/A 39C P0 36W / 300W | 0MiB / 16160MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla V100-SXM2... On | 00000000:00:1C.0 Off | 0 | | N/A 38C P0 35W / 300W | 0MiB / 16160MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+ root@45cebefa1480:/workspace#
嘗試運(yùn)行容器附帶的 MNIST 培訓(xùn)示例:
root@45cebefa1480:/workspace/examples/mnist# python main.py Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz Processing... Done! main.py:68: UserWarning: Implicit dimension choice for log_softmax has been deprecated. Change the call to include dim=X as an argument. return F.log_softmax(x) main.py:90: UserWarning: invalid index of a 0-dim tensor. This will be an error in PyTorch 0.5. Use tensor.item() to convert a 0-dim tensor to a Python number 100. * batch_idx / len(train_loader), loss.data[0])) Train Epoch: 1 [0/60000 (0%)] Loss: 2.373651 Train Epoch: 1 [640/60000 (1%)] Loss: 2.310517 Train Epoch: 1 [1280/60000 (2%)] Loss: 2.281828 Train Epoch: 1 [1920/60000 (3%)] Loss: 2.315808 Train Epoch: 1 [2560/60000 (4%)] Loss: 2.235439 Train Epoch: 1 [3200/60000 (5%)] Loss: 2.234249 Train Epoch: 1 [3840/60000 (6%)] Loss: 2.226109 Train Epoch: 1 [4480/60000 (7%)] Loss: 2.228646 Train Epoch: 1 [5120/60000 (9%)] Loss: 2.132811
OpenGL 圖形容器
如前幾節(jié)所述, NVIDIA 容器運(yùn)行時(shí)現(xiàn)在為運(yùn)行 OpenGL 和 EGL 應(yīng)用程序提供了支持。下一個(gè)例子使用 OpenGL 構(gòu)建并運(yùn)行 多體問(wèn)題 模擬。使用 NVIDIA 吉特實(shí)驗(yàn)室 上提供的示例 Dockerfile 來(lái)構(gòu)建容器。
復(fù)制 Dockerfile 并構(gòu)建 多體問(wèn)題 示例
$ docker build -t nbody .
允許 root 用戶訪問(wèn)正在運(yùn)行的 X 服務(wù)器
$ xhost +si:localuser:root
運(yùn)行[VZX129 連續(xù)樣本
$ sudo docker run --runtime=nvidia -ti --rm -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix nbody
圖 2 用 Docker 運(yùn)行 N-bodyCUDA / OpenGL 示例
編寫(xiě) Docker
最后一個(gè)例子使用 Docker Compose 展示了使用 NVIDIA 容器運(yùn)行時(shí)啟動(dòng)多個(gè) GPU 容器是多么容易。這個(gè)例子將啟動(dòng) 3 個(gè)容器—— OpenGL 的 多體問(wèn)題 示例、一個(gè) EGL 示例( 釘 來(lái)自 Mesa )和一個(gè)運(yùn)行 NVIDIA -smi 公司 命令的簡(jiǎn)單容器。
安裝 Docker Compose
$ sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose
從 NVIDIA Gitlab 克隆可用的樣本
$ git clone https://gitlab.com/nvidia/samples.git
寫(xiě)一個(gè)docker-compose.yml
來(lái)指定三個(gè)容器和環(huán)境。使用您選擇的文本編輯器復(fù)制以下內(nèi)容:
version: '2.3' services: nbody: build: samples/cudagl/ubuntu16.04/nbody runtime: nvidia environment: - DISPLAY volumes: - /tmp/.X11-unix:/tmp/.X11-unix peglgears: build: samples/opengl/ubuntu16.04/peglgears runtime: nvidia nvsmi: image: ubuntu:18.04 runtime: nvidia environment: - NVIDIA_VISIBLE_DEVICES=all command: nvidia-smi
允許 root 用戶訪問(wèn)正在運(yùn)行的 X 服務(wù)器(對(duì)于多體問(wèn)題示例)
$ xhost +si:localuser:root
最后,啟動(dòng)容器
$ sudo docker-compose up
您的控制臺(tái)輸出可能如下所示
Building nbody Step 1/6 : FROM nvidia/cudagl:9.0-base-ubuntu16.04 ---> b6055709073e Step 2/6 : ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES},display ---> Using cache ---> ebd1c003a592 Step 3/6 : RUN apt-get update && apt-get install -y --no-install-recommends cuda-samples-$CUDA_PKG_VERSION && rm -rf /var/lib/apt/lists/* ---> Using cache ---> 1987dc2c1bbc Step 4/6 : WORKDIR /usr/local/cuda/samples/5_Simulations/nbody ---> Using cache ---> de7af4fbb03e Step 5/6 : RUN make ---> Using cache ---> a6bcfb9a4958 Step 6/6 : CMD ./nbody ---> Using cache ---> 9c11a1e93ef2 Successfully built 9c11a1e93ef2 Successfully tagged ubuntu_nbody:latest WARNING: Image for service nbody was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Starting ubuntu_nbody_1 ... done Starting ubuntu_nvsmi_1 ... done Starting ubuntu_peglgears_1 ... done Attaching to ubuntu_nvsmi_1, ubuntu_peglgears_1, ubuntu_nbody_1 ubuntu_nvsmi_1 exited with code 0 peglgears_1 | peglgears: EGL version = 1.4 peglgears_1 | peglgears: EGL_VENDOR = NVIDIA peglgears_1 | 246404 frames in 5.0 seconds = 49280.703 FPS ubuntu_peglgears_1 exited with code 0
支持帶 LXC 的 GPU 容器
Linux 容器(或 LXC 公司 )是一個(gè)操作系統(tǒng)級(jí)的虛擬化工具,用于創(chuàng)建和管理系統(tǒng)或應(yīng)用程序容器。 Docker 的早期版本使用 LXC 作為底層容器運(yùn)行時(shí)技術(shù)。 LXC 提供了一套高級(jí)的工具來(lái)管理容器(例如模板、存儲(chǔ)選項(xiàng)、直通設(shè)備、 autostart 等),并為用戶提供了大量的控制。在參考文獻(xiàn)中,我們?cè)诒疚哪┪驳膮⒖嘉墨I(xiàn)中提供了來(lái)自 Canonical 和 Cisco 的工程師關(guān)于 LXC 的 GTC 2018 演講的鏈接。
LXC 支持非特權(quán)容器(使用 Linux 內(nèi)核中的用戶名稱(chēng)空間特性)。在 HPC 環(huán)境中部署容器的上下文中,這是一個(gè)巨大的優(yōu)勢(shì),在這種環(huán)境中,用戶可能沒(méi)有運(yùn)行容器的管理權(quán)限。 LXC 還支持 Docker 圖像的導(dǎo)入,下面我們將詳細(xì)介紹一個(gè)示例。
NVIDIA 繼續(xù)與 LXC 社區(qū)密切合作,開(kāi)發(fā)上游補(bǔ)丁,以添加 GPU 支持。 4 月初發(fā)布的 lxc3 。 0 。 0 包括使用 NVIDIA 運(yùn)行時(shí)對(duì) GPUs 的支持。有關(guān)更多信息和演示,請(qǐng)參閱 Canonical 的新聞 郵遞 。
如圖所示, VX134 是如何將容器集成到 VX12 中的。
圖 3 NVIDIA 容器運(yùn)行時(shí)與 LXC 的集成
讓我們看看用 LXC 運(yùn)行一個(gè)簡(jiǎn)單的 CUDA 容器。這個(gè)例子展示了如何使用默認(rèn)的 LXC OCI 模板 從 Docker Hub 上可用的 OCI 映像(使用諸如 Skopo 和 擦除 )創(chuàng)建應(yīng)用程序容器。
首先,讓我們?yōu)楣ぞ咴O(shè)置存儲(chǔ)庫(kù):
$ sudo add-apt-repository ppa:ubuntu-lxc/lxc-stable $ sudo apt-add-repository ppa:projectatomic/ppa
安裝 LXC 和相關(guān)工具,如 skopeo :
$ apt-get install libpam-cgfs lxc-utils lxcfs lxc-templates skopeo skopeo-containers jq libnvidia-container-tools
肥皂套裝:
$ sudo curl -fsSL -o /usr/local/bin/umoci https://github.com/openSUSE/umoci/releases/download/v0.4.0/umoci.amd64 $ sudo chmod ugo+rx /usr/local/bin/umoci
為每個(gè)用戶設(shè)置用戶、組 ID 和虛擬以太網(wǎng)接口。請(qǐng)參閱 LXC文檔中有關(guān)創(chuàng)建非特權(quán)容器的內(nèi)容。為了方便起見(jiàn),這里提供了示例腳本。
$ sudo curl -fsSL -o /usr/local/bin/generate-lxc-perms https://gist.githubusercontent.com/3XX0/ef77403389ffa1ca85d4625878706c7d/raw/4f0d2c02d82236f74cf668c42ee72ab06158d1d2/generate-lxc-perms.sh $ sudo chmod ugo+rx /usr/local/bin/generate-lxc-perms $ sudo curl -fsSL -o /usr/local/bin/generate-lxc-config https://gist.githubusercontent.com/3XX0/b3e2bd829d43104cd120f4258c4eeca9/raw/890dc720e1c3ad418f96ba8529eae028f01cc994/generate-lxc-config.sh $ sudo chmod ugo+rx /usr/local/bin/generate-lxc-config
現(xiàn)在,為每個(gè)容器設(shè)置 GPU 支持:
$ sudo tee /usr/share/lxc/config/common.conf.d/nvidia.conf <<< 'lxc.hook.mount = /usr/share/lxc/hooks/nvidia' $ sudo chmod ugo+r /usr/share/lxc/config/common.conf.d/nvidia.conf
作為一次性設(shè)置,請(qǐng)將權(quán)限和配置設(shè)置為常規(guī)用戶:
$ sudo generate-lxc-perms $ generate-lxc-config
使用lxc-create
從 NVIDIA 的 Docker Hub 存儲(chǔ)庫(kù)上的 CUDA 映像下載并創(chuàng)建一個(gè) CUDA 應(yīng)用程序容器。
$ lxc-create -t oci cuda -- -u docker://nvidia/cuda Getting image source signatures Copying blob sha256:297061f60c367c17cfd016c97a8cb24f5308db2c913def0f85d7a6848c0a17fa 41.03 MB / 41.03 MB [======================================================] 0s Copying blob sha256:e9ccef17b516e916aa8abe7817876211000c27150b908bdffcdeeba938cd004c 850 B / 850 B [============================================================] 0s Copying blob sha256:dbc33716854d9e2ef2de9769422f498f5320ffa41cb79336e7a88fbb6c3ef844 621 B / 621 B [============================================================] 0s Copying blob sha256:8fe36b178d25214195af42254bc7d5d64a269f654ef8801bbeb0b6a70a618353 851 B / 851 B [============================================================] 0s Copying blob sha256:686596545a94a0f0bf822e442cfd28fbd8a769f28e5f4018d7c24576dc6c3aac 169 B / 169 B [============================================================] 0s Copying blob sha256:aa76f513fc89f79bec0efef655267642eba8deac019f4f3b48d2cc34c917d853 6.65 MB / 6.65 MB [========================================================] 0s Copying blob sha256:c92f47f1bcde5f85cde0d7e0d9e0caba6b1c9fcc4300ff3e5f151ff267865fb9 397.29 KB / 397.29 KB [====================================================] 0s Copying blob sha256:172daef71cc32a96c15d978fb01c34e43f33f05d8015816817cc7d4466546935 182 B / 182 B [============================================================] 0s Copying blob sha256:e282ce84267da687f11d354cdcc39e2caf014617e30f9fb13f7711c7a93fb414 449.41 MB / 449.41 MB [====================================================] 8s Copying blob sha256:91cebab434dc455c4a9faad8894711a79329ed61cc3c08322285ef20599b4c5e 379.37 MB / 552.87 MB [=====================================>-----------------] Writing manifest to image destination Storing signatures Unpacking the rootfs ? rootless{dev/agpgart} creating empty file in place of device 10:175 ? rootless{dev/audio} creating empty file in place of device 14:4 ? rootless{dev/audio1} creating empty file in place of device 14:20
作為普通用戶,我們可以在容器內(nèi)運(yùn)行nvidia-smi
:
$ lxc-execute cuda root@cuda:/# nvidia-smi Mon May 28 21:48:57 2018 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 396.26 Driver Version: 396.26 | |-------------------------------+----------------------+----------------------+ | 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:00:1B.0 Off | 0 | | N/A 40C P0 36W / 300W | 0MiB / 16160MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla V100-SXM2... On | 00000000:00:1C.0 Off | 0 | | N/A 39C P0 35W / 300W | 0MiB / 16160MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 2 Tesla V100-SXM2... On | 00000000:00:1D.0 Off | 0 | | N/A 39C P0 38W / 300W | 0MiB / 16160MiB | 1% Default | +-------------------------------+----------------------+----------------------+ | 3 Tesla V100-SXM2... On | 00000000:00:1E.0 Off | 0 | | N/A 40C P0 38W / 300W | 0MiB / 16160MiB | 1% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
結(jié)論
本文介紹了 NVIDIA 容器運(yùn)行時(shí),以及如何將其輕松集成到容器運(yùn)行時(shí)和編排生態(tài)系統(tǒng)中,以啟用 GPU 支持。現(xiàn)在就開(kāi)始用它來(lái)構(gòu)建和運(yùn)行 GPU 容器吧!安裝程序包可用于 品種 的 Linux 發(fā)行版。 NVIDIA -Docker 1 。 0 已被棄用,不再被積極支持。我們強(qiáng)烈建議用戶在使用 Docker 時(shí)升級(jí)到新的 NVIDIA 運(yùn)行時(shí)。未來(lái)的路線圖包括許多令人興奮的特性,包括對(duì) Vulkan 、 CUDA MPS 、集裝箱驅(qū)動(dòng)程序等的支持。
關(guān)于作者
Jonathan Calmels 是 NVIDIA 的系統(tǒng)軟件工程師。他的工作主要集中在 GPU 數(shù)據(jù)中心軟件和用于深度學(xué)習(xí)的超大規(guī)模解決方案。喬納森擁有計(jì)算機(jī)科學(xué)與工程碩士學(xué)位。
Felix Abecassis 是 NVIDIA 的系統(tǒng)軟件工程師,致力于使 GPU 應(yīng)用程序更易于在數(shù)據(jù)中心部署和管理。 GPU 專(zhuān)注于機(jī)器學(xué)習(xí)支持框架。他擁有法國(guó)學(xué)校 EPITA 的計(jì)算機(jī)科學(xué)碩士學(xué)位。
Pramod Ramarao 是 NVIDIA 加速計(jì)算的產(chǎn)品經(jīng)理。他領(lǐng)導(dǎo) CUDA 平臺(tái)和數(shù)據(jù)中心軟件的產(chǎn)品管理,包括容器技術(shù)。
審核編輯:郭婷
-
NVIDIA
+關(guān)注
關(guān)注
14文章
5062瀏覽量
103414 -
gpu
+關(guān)注
關(guān)注
28文章
4762瀏覽量
129151
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論