Nvidia-docker的基础使用方法

qq_43650421 2024-06-14 09:37:02 阅读 74

安装:

安装nvidia-docker:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - 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 sudo apt-get install nvidia-container-toolkit sudo apt-get install nvidia-docker2 service docker restart sudo systemctl daemon-reload sudo systemctl restart docker

参考链接

配置

1. 配置镜像加速:

修改镜像文件,镜像文件位置/etc/docker/daemon.json

{ "registry-mirrors": ["https://registry.docker-cn.com"], "runtimes": { "nvidia": { "args": [], "path": "nvidia-container-runtime" } }}

重启docker:

sudo systemctl daemon-reloadsudo systemctl restart docker

2. 镜像的下载:

①查看cuda和cudnn版本:

nvcc -V nvidia-smi cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

②在dockerhub中选择所需要的镜像版本,尽量保持宿主机的版本和镜像的驱动版本一致:

这里搜索的ubuntu:

搜索ubuntu

有三种类型:

cuda的类型有三种:

1、base:基于CUDA,包含最精简的依赖,用于部署预编译的CUDA应用,需要手工安装所需的其他依赖;

2、runtime:基于base,添加了CUDA toolkit共享的库;

3、devel:基于runtime,添加了编译工具链,调试工具,头文件,静态库。用于从源码编译CUDA应用(推荐)。

参考链接

③比如这里选择:

docker pull nvidia/cuda:11.0.3-devel-ubuntu20.04

选择特定容器

然后复制指令到服务器上运行,等待即可。

下载过程

④最后通过docker images 命令查看本地镜像:

查看已安装镜像

⑤可以通过命令测试是否安装成功:

docker run --runtime=nvidia --rm nvidia/cuda:11.0.3-devel-ubuntu20.04 nvidia-smi

检查是否操作成功

⑥这样手动配置较为麻烦一般会提供dockerfile:

参考链接

sources.list文件

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiversedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiversedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiversedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

Dockerfile文件:

其中FROM :指定基础镜像;

RUN:执行命令;

COPY:将文件从主机复制到镜像中;

ADD:类似于 COPY,但具有更多功能,例如可以将 URL 资源下载到镜像中;

WORKDIR:设置工作目录,后续的命令将在该目录下执行;

ENV:设置环境变量;

CMD:指定容器启动时执行的默认命令,可以被覆盖;

VOLUME:创建挂载点,用于在容器和主机之间共享数据。

基本上是RUN命令,如果Dockerfile由于网络问题执行不了的话,也可以直接在命令行中执行对应的命令。

#FROM osrf/ros:noetic-desktop-full#FROM vistart/cuda:10.1-cudnn7-runtime-ubuntu20.04FROM nvidia/cudagl:11.0-devel-ubuntu20.04ADD sources.list /etc/apt/ENV PATH /opt/conda/bin:$PATHRUN rm /etc/apt/sources.list.d/cuda.listRUN apt-key del 7fa2af80RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pubRUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub#install basic dependenciesRUN apt-get update && DEBIAN_FRONTEND=noninteractive apt install -y tzdata# to solove the nvidia 443 issue# RUN rm /etc/apt/sources.list.d/cuda.listRUN apt-get install -y --no-install-recommends \bzip2 \g++ \git \graphviz \libgl1-mesa-glx \zlib1g \zlib1g-dev \libhdf5-dev \openmpi-bin \vim \libsnappy-dev \python3-dev \python3-pip \build-essential \wget && \rm -rf /var/lib/apt/lists/*# Setup timezone# RUN echo 'Etc/UTC' > /etc/timezone && \# ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime && \# apt-get update && \# apt-get install -q -y --no-install-recommends tzdata && \# rm -rf /var/lib/apt/lists/*# Setup environmentRUN apt-get updateRUN apt-get upgrade -y --no-install-recommendsRUN DEBIAN_FRONTEND=noninteractive

创建bash命令文件docker_build.sh:

#!/bin/bashusername=$USERuserid=$UIDecho $usernameecho $useridecho ""echo "Building image noetic_pytorch"echo ""docker image build --build-arg username0=$username \--build-arg userid0=$userid \--shm-size=64g -t \noetic_pytorch_$username .

以上三个文件在同一文件夹下,直接在命令行中:

sudo sh docker_build.sh

文件夹

实例和镜像的关系:

在Docker中,存在实例(容器)和镜像两个核心概念。

镜像:

镜像是一个静态的、不可变的文件,包含了应用程序运行所需的所有代码、运行时、库、环境变量和配置文件。镜像是一个只读文件,一旦创建就不会被更改。任何对镜像的修改都会生成一个新的镜像。镜像是容器的基础,容器实际上是从镜像创建而来的运行实例。

容器:

容器是运行中的镜像的实例。可以将容器看作是一个轻量级、可执行的软件包,包含了运行应用程序所需的所有内容。容器可以被启动、停止、删除和暂停。当容器启动时,它会在内存中创建一个可写的文件系统层,使得镜像变得可写,并在其中运行应用程序。每个容器都是基于一个特定的镜像创建的,容器的状态可以随时保存,但不会影响原始镜像。

总结来说,镜像是一个静态的、不可变的文件,用于打包应用程序和其依赖关系,而容器是一个运行中的镜像实例,可以被启动、停止和删除。容器是镜像的可运行表现形式,允许在其中执行应用程序。

使用

1.查看本地已经安装的镜像:

docker images

可以看到

REPOSITORY: 镜像的仓库或来源;TAG: 镜像的标签,标明版本或其他信息;IMAGE ID: 镜像的唯一标识符;CREATED: 镜像创建的时间;SIZE: 镜像的大小。

镜像

2.从命令行进入docker:

需要设置–runtime=nvidia连接nvidia驱动。

命令格式:

docker run --runtime=nvidia -it --privileged=true --name 实例名 <REPOSITORY:IMAGE ID> /bin/bash

或docker run --runtime=nvidia -it --privileged=true --name 实例名

/bin/bash

其中–runtime=nvidia用于指定容器运行时为 NVIDIA Container Runtime。NVIDIA Container Runtime 是 NVIDIA 提供的一个容器运行时,用于加速 GPU 加速的工作负载,提供对 NVIDIA GPU 的支持;

-it 运行一个交互式容器(交互式终端);

–name指定容器名称;

–privileged=true用于赋予容器一些特殊权限,使其能够访问主机上的一些特权功能。

sudo docker run --runtime=nvidia -it --privileged=true --name test4 nvidia/cuda:11.0.3-devel-ubuntu20.04 /bin/bashsudo docker run --runtime=nvidia -it --privileged=true --name test4 66deaf56c203 /bin/bash

这里需要注意的是每次run其实都从镜像中产生了一个新的实例,所以命名的实例名–name不能相同。

命令行进入docker

3.删除镜像:

docker rmi -f 镜像ID号

4.退出

exit

实例操作:

1、查看当前运行的所有实例:

(base) lu@lu:~$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES581cfc468efe rearrangement_submission:latest "/bin/bash" 6 hours ago Exited (0) 6 hours ago hab-challenge4d750a3333c6 nvidia/cuda:11.0.3-devel-ubuntu20.04 "/bin/bash" 6 hours ago Exited (0) 6 hours ago test

2、启动实例:

(base) lu@lu:~$ docker start 581cfc468efe -iroot@581cfc468efe:/workspace#

3、关闭实例:

docker stop 容器ID或容器名

或直接关闭实例:

docker kill 容器ID或容器名

4、进入实例:必须是已经启动的容器。

docker exec -it 容器ID或容器名 bash

5、删除实例:

docker remove 容器ID或容器名

6、如何将实例保存为镜像:

因为实例默认而言是不会默认保存的,每次生成实例都是从镜像而来,这样保护了环境不会被破坏。如果实例被破坏了,可以直接删除。而如果实例配置好了,可以通过commi命令转为镜像。下次可以直接从对应的镜像中得到新的实例。

写法如下:docker commit my_container my_image:my_tag

(base) lu@lu:~$ sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESc7ccb865ee4d noetic_pytorch_lu:latest "bash" 9 minutes ago Exited (1) 5 seconds ago gallant_gagarin(base) lu@lu:~$ sudo docker commit c7ccb865ee4d lu:v1.0

文件共享及传输

共享文件

docker run -it -v 主机文件夹路径:容器内文件夹路径 --name 希望创建的容器名字 镜像名:版本名 bash

如:

docker run -it -v ~/sharedspace:/sharedspace nvidia/cuda:11.0.3-devel-ubuntu20.04 bash

共享文件夹

命令过长为了方便可以写在bashrc中在命令行中输入docker_command即可。

alias docker_command='docker run -it -v ~/sharedspace:/sharedspace nvidia/cuda:11.0.3-devel-ubuntu20.04 bash'

传输文件

(base) lu@lu:~$ sudo docker cp java_error_in_pycharm_.hprof a99ab5ed5e36:/workspaceSuccessfully copied 2.04GB to a99ab5ed5e36:/workspace

启动图形化界面:

在本机上配置:

首先在本机里安装相关依赖:

$ sudo apt-get install x11-xserver-utils

开放权限,允许所有用户,当然包括docker,访问X11的显示接口:

$ xhost +

启动docker时命令:

sudo docker run -it \-v ~/sharedspace:/sharedspace \-v /tmp/.X11-unix:/tmp/.X11-unix \-e NVIDIA_VISIBLE_DEVICES=all \-e NVIDIA_DRIVER_CAPABILITIES=all \--gpus all \-e DISPLAY nvidia/cuda:11.0.3-devel-ubuntu20.04 \/bin/bash

对于某些应用可能还要额外输入:

xhost +

参考链接1

参考链接2

参考链接3

可能出现的问题:

一、报错

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

解决:

启动docker并查看运行状态是否成功,

systemctl start docker

发现提示报错:

Failed to start Docker Application Container Engine

检查修改sudo gedit /etc/docker/daemon.json文件是否有问题。

二、错误:ERROR [ 2/100] RUN echo ‘Etc/UTC’ > /etc/timezone &&

参考网页链接:

解决方案



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。