Ubuntu下 NVIDIA Container Runtime 安装与使用

简介: Ubuntu下 NVIDIA Container Runtime 安装与使用

GitHub仓库:Docker 是开发人员采用最广泛的容器技术。借助 NVIDIA Container Runtime,开发人员只需在创建容器期间注册一个新的运行时,即可将 NVIDIA GPU 暴露给容器中的应用程序。用于 Docker 的 NVIDIA Container Runtime 是托管在GitHub 上的开源项目。

简介

NVIDIA Container Runtime is a GPU aware container runtime, compatible with the Open Containers Initiative (OCI) specification used by Docker, CRI-O, and other popular container technologies. It simplifies the process of building and deploying containerized GPU-accelerated applications to desktop, cloud or data centers.
NVIDIA Container Runtime 是一种 GPU 感知容器运行时,与 Docker、CRI-O 和其他流行容器技术使用的 Open Containers Initiative (OCI) 规范兼容。 它简化了构建容器化 GPU 加速应用程序并将其部署到桌面、云或数据中心的过程。

With NVIDIA Container Runtime supported container technologies like Docker, developers can wrap their GPU-accelerated applications along with its dependencies into a single package that is guaranteed to deliver the best performance on NVIDIA GPUs, regardless of the deployment environment.
借助 NVIDIA Container Runtime 支持的容器技术(如 Docker),开发人员可以将其 GPU 加速应用程序及其依赖项打包到一个包中,无论部署环境如何,都能保证在 NVIDIA GPU 上提供最佳性能。

安装

本文参考NVIDIA Container Toolkit 官方安装文档在 Ubuntu 22.04 中安装

环境要求

  • 已安装 NVIDIA Linux 驱动程序,且版本 >= 418.81.07
  • 内核版本 > 3.10 的GNU/Linux x86_64
  • Docker >= 19.03
  • 架构 >= Kepler(或计算能力 3.0)的 NVIDIA GPU

开始安装

  1. 设置包存储库和 GPG 密钥
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
  1. 更新并下载安装 nvidia-docker2
sudo apt-get update

update可能会报错:

sudo apt-get update
E: Conflicting values set for option Signed-By regarding source /: /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg !=
E: The list of sources could not be read.

解决方案参见官方文档Conflicting values set for option Signed-By error when running apt update

sudo apt-get install -y nvidia-docker2
  1. 重启 Docker 守护进程并测试
sudo systemctl restart docker
sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi

看到类似如下的输出说明安装成功
在这里插入图片描述

使用示例

参考官方文档User Guide

添加 NVIDIA Runtime

因为在上文中已经安装了 nvidia-docker2 所以不需要添加 NVIDIA Runtime

设置环境变量

用户可以使用环境变量控制 NVIDIA 容器运行时的行为——尤其是枚举 GPU 和驱动程序的功能。
而在NVIDIA提供的基本的CUDA镜像中已经设置好了这些环境变量。

GPU枚举

使用 --gpus 或使用环境变量 NVIDIA_VISIBLE_DEVICES 可以控制容器能够使用哪些GPU

NVIDIA_VISIBLE_DEVICES 的取值如下所示

Possible values

Description

0,1,2, or GPU-fef8089b

a comma-separated list of GPU UUID(s) or index(es).(GPU UUID 或索引的逗号分隔列表)

all

all GPUs will be accessible, this is the default value in base CUDA container images.(所有的GPU都可以使用,这是基本的CUDA容器镜像使用的默认值)

none

no GPU will be accessible, but driver capabilities will be enabled.(所有GPU都不能使用,但启用了驱动程序的功能)

void or empty or unset

nvidia-container-runtime will have the same behavior as runc (i.e. neither GPUs nor capabilities are exposed)(GPU 和功能均未公开)

当使用 --gpu 指定GPU时,应同时使用 device 参数,示例如下

docker run --gpus '"device=1,2"' \
    nvidia/cuda nvidia-smi --query-gpu=uuid --format=csv

启用所有的GPU

docker run --rm --gpus all nvidia/cuda nvidia-smi

使用 NVIDIA_VISIBLE_DEVICES 启用所有的GPU

docker run --rm --runtime=nvidia \
    -e NVIDIA_VISIBLE_DEVICES=all nvidia/cuda nvidia-smi

使用 NVIDIA_VISIBLE_DEVICES 启用指定的GPU

docker run --rm --runtime=nvidia \
    -e NVIDIA_VISIBLE_DEVICES=1,2 \
    nvidia/cuda nvidia-smi --query-gpu=uuid --format=csv

启用两个GPU(Start a GPU enabled container on two GPUs)

docker run --rm --gpus 2 nvidia/cuda nvidia-smi

使用 nvidia-smi 查询 GPU UUID 然后将其指定给容器

nvidia-smi -i 3 --query-gpu=uuid --format=csv
uuid
GPU-18a3e86f-4c0e-cd9f-59c3-55488c4b0c24
docker run --gpus device=GPU-18a3e86f-4c0e-cd9f-59c3-55488c4b0c24 \
     nvidia/cuda nvidia-smi

驱动功能

NVIDIA_DRIVER_CAPABILITIES 控制将哪些驱动程序库/二进制文件挂载到容器中
NVIDIA_DRIVER_CAPABILITIES 取值如下

Possible values

Description

compute,video or graphics,utility

a comma-separated list of driver features the container needs.(容器需要的驱动程序功能的逗号分隔列表)

all

enable all available driver capabilities.(启用所有可用的驱动程序功能)

empty or unset

use default driver capability: utility, compute(使用默认驱动程序功能:utility,compute)

支持的驱动功能如下所示

Driver Capability

Description

compute

required for CUDA and OpenCL applications.

compat32

required for running 32-bit applications.

graphics

required for running OpenGL and Vulkan applications.

utility

required for using nvidia-smi and NVML.

video

required for using the Video Codec SDK.

display

required for leveraging X11 display.

例如,指定 compute 和 utility ,两种写法

docker run --rm --runtime=nvidia \
    -e NVIDIA_VISIBLE_DEVICES=2,3 \
    -e NVIDIA_DRIVER_CAPABILITIES=compute,utility \
    nvidia/cuda nvidia-smi
docker run --rm --gpus 'all,"capabilities=compute,utility"' \
    nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi

约束

NVIDIA runtime 还为容器提供了在配置文件中定义约束的功能

NVIDIA_REQUIRE_* 是一个逻辑表达式,用于定义容器上的软件版本或 GPU 架构的约束,下面是约束的具体内容

Constraint

Description

cuda

constraint on the CUDA driver version.

driver

constraint on the driver version.

arch

constraint on the compute architectures of the selected GPUs.

brand

constraint on the brand of the selected GPUs (e.g. GeForce, Tesla, GRID).

多个约束可以在单个环境变量中表示:空格分隔的约束是 ORed(或),逗号分隔的约束是 ANDed(与)。例如

NVIDIA_REQUIRE_CUDA "cuda>=11.0 driver>=450"

更多内容查看原文

Dockerfile

可以通过环境变量设置,例如

ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility

Docker Compose

rom-compose-v23-format-legacy)

Compose v2.3 写法

services:
  test:
    image: nvidia/cuda:10.2-base
    command: nvidia-smi
    runtime: nvidia

这种写法无法控制GPU的具体属性

更精细的控制

  • capabilities

值指定为字符串列表(例如。capabilities: [gpu])。您必须在 Compose 文件中设置此字段。否则,它会在服务部署时返回错误。

  • count

指定为 int 的值或all表示应保留的 GPU 设备数量的值(假设主机拥有该数量的 GPU)。

  • device_ids

指定为表示来自主机的 GPU 设备 ID 的字符串列表的值。可以在主机上的 nvidia-smi 输出中找到设备 ID 。

  • driver

指定为字符串的值(例如driver: 'nvidia')

  • options

表示驱动程序特定选项的键值对。

count 和 device_ids是互斥的。您一次只能定义一个字段。

有关这些属性的更多信息,请参阅 Compose Specification deploy中的部分。

例如,使用主机上的所有GPU和指定的驱动程序功能(虽然NVIDIA_DRIVER_CAPABILITIES取值可以是all,但是这里不能写all,会报错,只能写清楚每一个)

services:
  test:
    image: nvidia/cuda:10.2-base
    command: nvidia-smi
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [compute,graphics,video,utility,display]
相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
3月前
|
并行计算 Ubuntu Linux
Ubuntu学习笔记(五):18.04安装多版本CUDA
这篇博客文章介绍了在Ubuntu 18.04系统上如何安装和切换不同版本的CUDA,以及如何安装不同版本的cuDNN。
276 2
|
3月前
|
并行计算 PyTorch TensorFlow
Ubuntu安装笔记(一):安装显卡驱动、cuda/cudnn、Anaconda、Pytorch、Tensorflow、Opencv、Visdom、FFMPEG、卸载一些不必要的预装软件
这篇文章是关于如何在Ubuntu操作系统上安装显卡驱动、CUDA、CUDNN、Anaconda、PyTorch、TensorFlow、OpenCV、FFMPEG以及卸载不必要的预装软件的详细指南。
5644 3
|
17天前
|
JSON Ubuntu 开发者
ubuntu 22安装lua环境&&编译lua cjson模块
通过上述步骤,可以在 Ubuntu 22.04 系统上成功安装 Lua 环境,并使用 LuaRocks 或手动编译的方式安装 lua-cjson 模块。本文详细介绍了每一步的命令和操作,确保每一步都能顺利完成,适合需要在 Ubuntu 系统上配置 Lua 开发环境的开发者参考和使用。
77 13
|
13天前
|
监控 关系型数据库 MySQL
Ubuntu24.04安装Librenms
此指南介绍了在Linux系统上安装和配置LibreNMS网络监控系统的步骤。主要内容包括:安装所需软件包、创建用户、克隆LibreNMS仓库、设置文件权限、安装PHP依赖、配置时区、设置MariaDB数据库、调整PHP-FPM与Nginx配置、配置SNMP及防火墙、启用命令补全、设置Cron任务和日志配置,最后通过网页完成安装。整个过程确保LibreNMS能稳定运行并提供有效的网络监控功能。
|
24天前
|
Ubuntu Linux Docker
Ubuntu22.04上Docker的安装
通过以上详细的安装步骤和命令,您可以在Ubuntu 22.04系统上顺利安装
426 12
|
2月前
|
Ubuntu 开发工具 git
Ubuntu安装homebrew的完整教程
本文介绍了如何在没有公网的情况下安装 Homebrew。首先访问 Homebrew 官网,然后通过阿里云的镜像克隆安装脚本,并创建普通用户进行安装。接着修改 `install.sh` 文件指向国内镜像,执行安装命令。最后配置环境变量并更换 Homebrew 源为国内镜像,确保安装顺利。
445 50
|
2月前
|
Ubuntu
ubuntu和debian 的安装包dpkg管理命令对安装包进行安装,查询,卸载
Ubuntu dpkg 软件包管理命令概览:安装、卸载、查看和配置软件包。包括解决依赖、强制卸载、列出及过滤已安装包、查看包详情等操作。
75 10
|
2月前
|
Ubuntu API 开发工具
PSOPT在Ubuntu22.04下的安装
通过上述步骤,可以在Ubuntu 22.04下成功安装并配置PSOPT。PSOPT是一个功能强大的工具,适用于解决各种最优控制问题。确保在安装前满足系统要求,并仔细按照步骤操作,可以避免大多数常见问题。通过MATLAB与PSOPT的结合,您可以更高效地处理复杂的控制问题,并获得准确的解决方案。
38 5
|
2月前
|
Ubuntu 网络协议 关系型数据库
超聚变服务器2288H V6使用 iBMC 安装 Ubuntu Server 24.04 LTS及后续系统配置
【11月更文挑战第15天】本文档详细介绍了如何使用iBMC在超聚变服务器2288H V6上安装Ubuntu Server 24.04 LTS,包括连接iBMC管理口、登录iBMC管理界面、配置RAID、安装系统以及后续系统配置等步骤。
246 4
|
3月前
|
Ubuntu Linux 测试技术
Linux系统之Ubuntu安装cockpit管理工具
【10月更文挑战第13天】Linux系统之Ubuntu安装cockpit管理工具
281 4
Linux系统之Ubuntu安装cockpit管理工具