Ubuntu下 NVIDIA Container Runtime 安装与使用

news2024/10/7 2:21:56

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

文章目录

  • 简介
  • 安装
    • 环境要求
    • 开始安装
  • 使用示例
    • 添加 NVIDIA Runtime
    • 设置环境变量
      • GPU枚举
      • 驱动功能
      • 约束
      • Dockerfile
      • Docker Compose
        • Compose v2.3 写法
        • 更精细的控制

简介

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 https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64/ /: /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
sudo nvidia-ctk runtime configure --runtime=docker
  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

参考Docker 官方文档中的教程

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]

更多设置示例参见官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/694829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自然语言处理:任务与应用

文章目录 一、基本任务1.词性标注Part-of-speech (POS) tagging2.命名实体识别Named Entity Recognition (NER)3.共指消解Coreference Resolution4.句法依赖解析Syntactic Dependency Parsing5.中文分词Chinese Word Segmentation 二、常见应用1.文本匹配2. 知识图谱3. 问答系统…

微服务中的负载均衡

如图 有三处需要负载均衡 这里主要讲内部的grpc调用的 负载均衡 图中3的地方 ① 集中式load balance ② 进程内load balance ③独立进程load balance 首选第二种方式

华为MateBook 16 2021款锐龙版R7(CREM-WFD9)(CREM-WFG9)原装出厂Win11系统工厂模式,恢复原厂系统

HUAWEI华为笔记本电脑,MateBook 16 2021款 锐龙版 R7(CREM-WFD9) (CREM-WFG9) 原厂Windows11系统,带F10恢复功能,原装OEM专用系统,恢复出厂状态 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、华为电脑管家等预装程序 …

Java启动项目时,控制台报端口被占用,解决办法

端口占用一般是现在有别的程序正在使用该端口 第一步可以先查出来是哪个程序在占用: netstat -aon | find "8113" //8113为被占用的端口号 此时的结果是这样的,查询出来的为占用此端口程序的PID( 25472 ) 然后根据…

隐式迭代是什么意思?jQuery选择器隐式迭代

在使用jQuery 选择器获取元素后,如果不考虑获取到的元素数量,直接对元素进行操作,则在操作时会发生隐式迭代。隐式迭代是指,当要操作的元素实际有多个时,jQuery 会自动对所有的元素进行操作,示例代码如下。…

Centos 系统中使用 Firefix 播放视频 - VLC播放器的安装

问题: 出于刷视频的需要,需要使用虚拟机(Centos7)上的 Firefix 来播放视频,经确认安装 flash 的方式是不行的。事实上在 Firefix 播放视频仅需要安装 VLC 播放器就可以了,以下记录安装 VLC 视频播放器的过程…

Selenium教程__截图(16)

selenium截图有两种方式 截取全屏 get_screenshot_as_file(filename):将截图转化成文件保存到本地,filename为保存的文件路径get_screenshot_as_base64():将截图转化成base64get_screenshot_as_png():将截图转化成png 截取指定元…

Java学习记录之struts2(一)

1 struts入门 1.1 介绍  框架:就是半成品,框架已经完成一些通用功能。只需要实现与业务有关功能。  版本:struts-2.3.15.3-all 1.2 核心功能 1.3 目录结构  apps / struts2-blank.war 最简答环境  apps / struts2-showcase.war 常…

【Linux】MySQL 主从复制与读写分离

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 MySQL 主从复制与读写分离 MySQL 主从复制与读写分离1、什么是读写分离2、为什么要读写分离3、什么时候要读写分离4、主从复制与读写分离5、mysql支持的复制类型6、主从复制的…

Unity Android启动子进程加载其他SDK

1、导出untiy 安卓工程 添加MyService 2、 在子进程内加载SDK部分

【C#】错误 14 “GenerateResource”任务意外失败。

问题描述 Microsoft Visual Studio Ultimate 2013 12.0.21005.1 错误 14 “GenerateResource”任务意外失败。 System.Runtime.InteropServices.ExternalException (0x80004005): GDI 中发生一般性错误。在 System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder,…

开车适合佩戴哪种蓝牙耳机,分享几款骨传导耳机的使用体验

骨传导耳机从发布到现在有了几年的时间,也有很多人开始了解,但真正去选购的人还是很少,如果你没有使用过骨传导耳机,在选购时会很迷茫。作为一个骨传导耳机的重度使用者,下面就给大家分享一下我的体验感受以及选购建议…

大模型微调实践遗留问题1

Lora 和 AdaLora的区别和联系? P-tuning和Prompt tuning的区别和联系? P-Tuning,仅对大模型的Embedding加入新的参数。 P-Tuning-V2,将大模型的Embedding和每一层前都加上新的参数。 Prompt Tuning 方式可以看做是 Prefix Tuni…

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第十二章 无线网络安全下)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、无线局域网安全性分析1、Wi-Fi网络安全2、WEP存在如下弱点: 二、移动通信网安全防护1、3G安全体系趋于透明化2、考虑采用公钥密码体系3、考虑新密码技术的应用…

kafka入门,生产者自定义分区(六)

1、实现Partitioner接口 package com.longer.producer;import org.apache.kafka.clients.producer.Partitioner; import org.apache.kafka.common.Cluster;import java.util.Map;/*** 实现接口Partitioner* 实现3个方法:partition,close,configure* 编写…

EasyCVR级联后上级在线,请求播放显示端口不可达是什么原因?

EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,比如:视…

TestNG单元测试报错Software caused connection abort: socket write error

在用TestNG进行单元测试时,总出现如下错误:Software caused connection abort: socket write error 解决方法: 报错前我使用的eclipse testng插件版本为6.11,对插件版本降为6.8后此问题解决。(先卸载已装testng插件&…

通过精益价值流探索研发效能提升实践

研发效能八大损耗 采用精益价值流进行分析,研发过程存在以下典型的八大损耗 01 缺陷修复 因上游质量问题后移而引发的工作返工,一般会占用新功能的时间投入,如果经常反复回流,将严重影响团队的需求交付吞吐量 02 工作等待 上游…

Postman接口测试工具使用教程【基础版】

postmanpostman是一款支持http协议的接口调试与测试工具,其主要特点就是功能强大,使用简单且易用性好 。无论是开发人员进行接口调试,还是测试人员做接口测试,postman都是我们的首选工具之一 。那么接下来就介绍下postman到底有哪…

chatgpt赋能python:Python调用宏实现SEO优化的方法

Python调用宏实现SEO优化的方法 什么是Python调用宏? 在Python语言中,宏是一种可以被调用的代码模板,可以在程序运行时被动态地解析和执行。Python的宏通常用于代码重用和快速开发,可以大大提高代码的可维护性和开发效率。 Pyt…