NVIDIA 使用容器來開發(fā)、測試、基準(zhǔn)測試和部署深度學(xué)習(xí)( DL )框架和 HPC 應(yīng)用程序。大約兩年前,我們用 NVIDIA -Docker 大規(guī)模地寫了 構(gòu)建和部署 GPU 容器 。從那時起, NVIDIA -Docker 被下載了近 200 萬次。許多客戶使用 NVIDIA -Docker 將 NVIDIA 集裝箱化并運(yùn)行 GPU 加速的工作負(fù)載。
NVIDIA 通過 NVIDIA GPU 云( NGC )提供 GPU 加速容器,用于 DGX 系統(tǒng)、公共云基礎(chǔ)設(shè)施,甚至是帶有 GPUs 的本地工作站。 NVIDIA -Docker 是這些計劃的關(guān)鍵基礎(chǔ)技術(shù)。
除了 Docker 之外,容器技術(shù)被用于 DL 和 HPC 工作負(fù)載的不斷發(fā)展的用例集,這使得我們從根本上重新思考我們現(xiàn)有的 NVIDIA -Docker 架構(gòu)。我們的主要目標(biāo)不僅追求不同容器運(yùn)行時的可擴(kuò)展性,而且還追求容器編排系統(tǒng)的可擴(kuò)展性。
這里介紹的 NVIDIA 容器運(yùn)行時是我們的下一代 GPU 感知容器運(yùn)行時。它與 Docker 使用的 Open Containers Initiative ( OCI )規(guī)范和其他流行的容器技術(shù)兼容。
您將了解到 NVIDIA 容器運(yùn)行時組件,以及如何擴(kuò)展它以支持多個容器技術(shù)。讓我們檢查一下新運(yùn)行時的體系結(jié)構(gòu)和優(yōu)點(diǎn),展示一些新特性,并介紹一些使用 Docker 和 LXC 部署 GPU 加速應(yīng)用程序的示例。
NVIDIA 集裝箱運(yùn)行時間
NVIDIA 在 2016 年設(shè)計了 NVIDIA -Docker ,以實現(xiàn) Docker 映像中的可移植性,利用 NVIDIA GPUs 。它允許與驅(qū)動程序無關(guān)的 CUDA 映像,并提供一個 Docker 命令行包裝器,在啟動時將驅(qū)動程序的用戶模式組件和 GPU 設(shè)備文件裝入容器中。
在 NVIDIA -Docker 的生命周期中,我們意識到架構(gòu)缺乏靈活性,原因如下:
與 Docker 的緊密集成不允許將來支持其他容器技術(shù),如 LXC 、 CRI-O 和其他運(yùn)行時
我們希望利用 Docker 生態(tài)系統(tǒng)中的其他工具–例如 撰寫 (用于管理由多個容器組成的應(yīng)用程序)
在 Kubernetes 和 Swarm 等編排器中支持 GPUs 作為一級資源
改進(jìn)對 GPUs 的容器運(yùn)行時支持,特別是自動檢測用戶級 NVIDIA 驅(qū)動程序庫, NVIDIA 內(nèi)核模塊、設(shè)備排序、兼容性檢查和 GPU 功能,如圖形、視頻加速
因此,重新設(shè)計的 NVIDIA -Docker 將對 GPUs 的核心運(yùn)行時支持轉(zhuǎn)移到一個名為 libnvidia-container 的庫中。該庫依賴于 Linux 內(nèi)核原語,并且相對于更高的容器運(yùn)行時層是不可知的。這使得 GPU 支持很容易擴(kuò)展到不同的容器運(yùn)行時,如 Docker 、 LXC 和 CRI-O 。該庫包括一個命令行實用程序,還提供了一個 API ,以便將來集成到其他運(yùn)行時中。我們構(gòu)建的用于集成到各種運(yùn)行時的庫、工具和層統(tǒng)稱為 NVIDIA 容器運(yùn)行時。
在接下來的幾節(jié)中,您將了解到 Docker 和 LXC 的集成。
Docker 支持
在深入研究 NVIDIA 容器運(yùn)行時與 Docker 的集成之前,讓我們簡單看看 Docker 平臺是如何演變的。
自 2015 年以來, Docker 一直在捐贈其容器平臺的關(guān)鍵組件,首先是開放容器倡議( OCI )規(guī)范和一個名為 runc 的輕量級容器運(yùn)行時規(guī)范的實現(xiàn)。 2016 年末, Docker 還捐贈了一個管理容器生命周期和包裝 OCI / runc 的守護(hù)程序 containerd 。 containerd 守護(hù)進(jìn)程處理圖像的傳輸、容器的執(zhí)行(使用 runc )、存儲和網(wǎng)絡(luò)管理。它被設(shè)計成嵌入到更大的系統(tǒng)中,比如 Docker 。關(guān)于這個項目的更多信息可以在官方網(wǎng)站 網(wǎng)站 上找到。
圖 1 顯示了 libnvidia-container 如何集成到 Docker 中,特別是在 GPU 層。為了在 Docker 中啟用 nvidia-container-runtime-hook 容器,我們使用了一個名為 nvidia-container-runtime-hook 到 runc 的定制 OCI 預(yù)啟動鉤子(有關(guān)鉤子的更多信息可以在 OCI 運(yùn)行規(guī)范 中找到)。在 runc 中添加預(yù)啟動鉤子需要我們用 Docker 注冊一個新的與 OCI 兼容的運(yùn)行時(使用– runtime 選項 )。在創(chuàng)建容器時,預(yù)啟動鉤子檢查容器是否啟用了 GPU (使用環(huán)境變量),并使用容器運(yùn)行庫向容器公開 NVIDIA GPUs 。
圖 1 NVIDIA 容器運(yùn)行時與 Docker 的集成
runc 層的集成還允許靈活地支持其他 OCI 運(yùn)行時,如 CRI-O 。 containerd 的 1 。 1 版增加了對 Kubernetes 中容器運(yùn)行時接口( CRI )的支持;上周 Kubernetes 宣布 通過 CRI 插件實現(xiàn)了 containerd 集成的普遍可用性。 NVIDIA 運(yùn)行時的新架構(gòu)可以很容易地支持 Kubernetes 運(yùn)行時的任何一種選擇。這種靈活性非常重要,因為我們與社區(qū)密切合作,使 Kubernetes 的 GPU 支持 成為一流的。
環(huán)境變量
NVIDIA 容器運(yùn)行時使用容器映像中的環(huán)境變量指定 GPU 加速容器。
NVIDIA _可視設(shè)備:可在容器內(nèi)訪問 GPUs 的控件。默認(rèn)情況下,容器可以訪問所有 GPUs 。
NVIDIA _驅(qū)動程序功能:控制哪些驅(qū)動程序特性(例如計算、圖形)暴露到容器中。
NVIDIA U 需要 u *:邏輯表達(dá)式,用于定義容器支持的配置上的約束(例如最小 CUDA 、驅(qū)動程序或計算能力)。
如果沒有檢測到環(huán)境變量(在 Docker 命令行或圖像中),則使用默認(rèn)的 runc 。您可以在 NVIDIA 容器運(yùn)行時 文檔 中找到有關(guān)這些環(huán)境變量的更多信息。這些環(huán)境變量已經(jīng)在 NVIDIA 的 官方的 CUDA 容器中設(shè)置。
安裝
您的系統(tǒng)必須滿足以下先決條件,才能在 Docker 中開始使用 NVIDIA 容器運(yùn)行時。
支持 您的發(fā)行版的 Docker 版本。跟隨 Docker 的官方 說明書 。
最新的 NVIDIA 驅(qū)動程序。使用 程序包管理器 安裝 cuda-drivers 包,或者使用驅(qū)動程序下載 網(wǎng)站 中的安裝程序。請注意,使用 cuda-drivers 包可能無法在 Ubuntu 18.04 LTS 系統(tǒng)上運(yùn)行。
要開始使用帶有 Docker 的 NVIDIA 容器運(yùn)行時,可以使用 NVIDIA -docker2 安裝程序包,也可以手動使用 設(shè)置 運(yùn)行時和 Docker 引擎。 nvidia-docker2 軟件包包括一個自定義的 daemon.json 文件,用于將 NVIDIA 運(yùn)行時注冊為 Docker 的默認(rèn)運(yùn)行時,以及一個向后兼容 NVIDIA -Docker 1. 0 的腳本。
如果安裝了 NVIDIA -docker 1.0 ,則需要在安裝 NVIDIA 運(yùn)行時之前刪除它和任何現(xiàn)有的 GPU 容器。請注意,以下安裝步驟適用于 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)在,讓我們添加包存儲庫并刷新包索引。
$ 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
包安裝各個組件并重新加載 Docker 守護(hù)程序配置。
$ sudo apt-get install -y nvidia-docker2 $ sudo pkill -SIGHUP dockerd
運(yùn)行以下命令行實用程序( CLI )以驗證 NVIDIA 驅(qū)動程序和運(yùn)行時是否已正確安裝在您的系統(tǒng)上(作為安裝程序包的一部分提供)。運(yùn)行時 CLI 提供有關(guān)系統(tǒng)中檢測到的驅(qū)動程序和設(shè)備的信息。在本例中,運(yùn)行庫已正確檢測并枚舉了系統(tǒng)中的 4 個 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 檢測到的 CUDA 版本驗證主機(jī)上安裝的 NVIDIA 驅(qū)動程序是否足以運(yùn)行基于特定 CUDA 版本的容器。如果存在不兼容,運(yùn)行時將不啟動容器。有關(guān) CUDA 兼容性和最低驅(qū)動程序要求的更多信息,請參見 在這里 。
現(xiàn)在,讓我們嘗試用 Docker 運(yùn)行一個 GPU 容器。這個例子提取 Docker Hub 存儲庫 上可用的 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 注冊 上的 HPC 提供了多種預(yù)制容器。
深度學(xué)習(xí)框架容器
這個例子使用 NGC 提供的 PyTorch 深度學(xué)習(xí)框架容器來訓(xùn)練一個 deep 神經(jīng)網(wǎng)絡(luò) 。您需要打開一個免費(fèi)的 NGC 帳戶才能訪問最新的深度學(xué)習(xí)框架和 HPC 容器。 NGC 文件 概述了開始所需的步驟。
本例使用了 NVIDIA_VISIBLE_DEVICES 變量,僅向容器公開兩個 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
命令,驗證只有兩個 GPUs 可見。
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)行時現(xiàn)在為運(yùn)行 OpenGL 和 EGL 應(yīng)用程序提供了支持。下一個例子使用 OpenGL 構(gòu)建并運(yùn)行 多體問題 模擬。使用 NVIDIA 吉特實驗室 上提供的示例 Dockerfile 來構(gòu)建容器。
復(fù)制 Dockerfile 并構(gòu)建 多體問題 示例
$ docker build -t nbody .
允許 root 用戶訪問正在運(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 示例
編寫 Docker
最后一個例子使用 Docker Compose 展示了使用 NVIDIA 容器運(yùn)行時啟動多個 GPU 容器是多么容易。這個例子將啟動 3 個容器—— OpenGL 的 多體問題 示例、一個 EGL 示例( 釘 來自 Mesa )和一個運(yùn)行 NVIDIA -smi 公司 命令的簡單容器。
安裝 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
寫一個docker-compose.yml
來指定三個容器和環(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 用戶訪問正在運(yùn)行的 X 服務(wù)器(對于多體問題示例)
$ xhost +si:localuser:root
最后,啟動容器
$ sudo docker-compose up
您的控制臺輸出可能如下所示
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 公司 )是一個操作系統(tǒng)級的虛擬化工具,用于創(chuàng)建和管理系統(tǒng)或應(yīng)用程序容器。 Docker 的早期版本使用 LXC 作為底層容器運(yùn)行時技術(shù)。 LXC 提供了一套高級的工具來管理容器(例如模板、存儲選項、直通設(shè)備、 autostart 等),并為用戶提供了大量的控制。在參考文獻(xiàn)中,我們在本文末尾的參考文獻(xiàn)中提供了來自 Canonical 和 Cisco 的工程師關(guān)于 LXC 的 GTC 2018 演講的鏈接。
LXC 支持非特權(quán)容器(使用 Linux 內(nèi)核中的用戶名稱空間特性)。在 HPC 環(huán)境中部署容器的上下文中,這是一個巨大的優(yōu)勢,在這種環(huán)境中,用戶可能沒有運(yùn)行容器的管理權(quán)限。 LXC 還支持 Docker 圖像的導(dǎo)入,下面我們將詳細(xì)介紹一個示例。
NVIDIA 繼續(xù)與 LXC 社區(qū)密切合作,開發(fā)上游補(bǔ)丁,以添加 GPU 支持。 4 月初發(fā)布的 lxc3 。 0 。 0 包括使用 NVIDIA 運(yùn)行時對 GPUs 的支持。有關(guān)更多信息和演示,請參閱 Canonical 的新聞 郵遞 。
如圖所示, VX134 是如何將容器集成到 VX12 中的。
圖 3 NVIDIA 容器運(yùn)行時與 LXC 的集成
讓我們看看用 LXC 運(yùn)行一個簡單的 CUDA 容器。這個例子展示了如何使用默認(rèn)的 LXC OCI 模板 從 Docker Hub 上可用的 OCI 映像(使用諸如 Skopo 和 擦除 )創(chuàng)建應(yīng)用程序容器。
首先,讓我們?yōu)楣ぞ咴O(shè)置存儲庫:
$ 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
為每個用戶設(shè)置用戶、組 ID 和虛擬以太網(wǎng)接口。請參閱 LXC文檔中有關(guān)創(chuàng)建非特權(quán)容器的內(nèi)容。為了方便起見,這里提供了示例腳本。
$ 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)在,為每個容器設(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è)置,請將權(quán)限和配置設(shè)置為常規(guī)用戶:
$ sudo generate-lxc-perms $ generate-lxc-config
使用lxc-create
從 NVIDIA 的 Docker Hub 存儲庫上的 CUDA 映像下載并創(chuàng)建一個 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)行時,以及如何將其輕松集成到容器運(yùn)行時和編排生態(tài)系統(tǒng)中,以啟用 GPU 支持?,F(xiàn)在就開始用它來構(gòu)建和運(yùn)行 GPU 容器吧!安裝程序包可用于 品種 的 Linux 發(fā)行版。 NVIDIA -Docker 1 。 0 已被棄用,不再被積極支持。我們強(qiáng)烈建議用戶在使用 Docker 時升級到新的 NVIDIA 運(yùn)行時。未來的路線圖包括許多令人興奮的特性,包括對 Vulkan 、 CUDA MPS 、集裝箱驅(qū)動程序等的支持。
關(guān)于作者
Jonathan Calmels 是 NVIDIA 的系統(tǒng)軟件工程師。他的工作主要集中在 GPU 數(shù)據(jù)中心軟件和用于深度學(xué)習(xí)的超大規(guī)模解決方案。喬納森擁有計算機(jī)科學(xué)與工程碩士學(xué)位。
Felix Abecassis 是 NVIDIA 的系統(tǒng)軟件工程師,致力于使 GPU 應(yīng)用程序更易于在數(shù)據(jù)中心部署和管理。 GPU 專注于機(jī)器學(xué)習(xí)支持框架。他擁有法國學(xué)校 EPITA 的計算機(jī)科學(xué)碩士學(xué)位。
Pramod Ramarao 是 NVIDIA 加速計算的產(chǎn)品經(jīng)理。他領(lǐng)導(dǎo) CUDA 平臺和數(shù)據(jù)中心軟件的產(chǎn)品管理,包括容器技術(shù)。
審核編輯:郭婷
-
NVIDIA
+關(guān)注
關(guān)注
14文章
5432瀏覽量
108361 -
gpu
+關(guān)注
關(guān)注
28文章
5039瀏覽量
133849
發(fā)布評論請先 登錄
Docker容器安全攻防實戰(zhàn)案例
干貨分享 | RK3588 Ubuntu系統(tǒng)Docker容器使用指南

PLC設(shè)備運(yùn)行時間數(shù)據(jù)采集到運(yùn)維管理平臺如何實現(xiàn)

步進(jìn)電機(jī)在高速運(yùn)行時反電動勢波形與其動態(tài)響應(yīng)變化

【技術(shù)案例】Android in Docker

在Windows上安裝OpenVINO?運(yùn)行時遇到錯誤怎么解決?
運(yùn)行時OpenVINO?找不到模型優(yōu)化器,為什么?
無法在Raspberry Pi 4中通過PyPI OpenVINO?安裝2022年運(yùn)行時軟件包,為什么?
使用Windows中的Docker容器運(yùn)行DL Streamer出現(xiàn)報錯怎么解決?
ADuC7026微控制器在125°C下運(yùn)行時不斷重啟、這是正常行為嗎?
《CST Studio Suite 2024 GPU加速計算指南》
ups主機(jī)選購方法,選擇電池運(yùn)行時間滿足

評論