Ubuntu构建基于docker的GPU模型环境

Ubuntu查看版本信息

uname - a  //可以看到操作系统的发行版号和操作系统版本。
uname -v   //可以查看版本号。
lsb_release -a //查看发行版本信息,并且方法可以适用于所有的Linux发行版本。
cat /etc/issue    //可以查看到当前是Linux什么版本系统。
cat /proc/version   //可以查看内核的版本号。
dmidecode      //查看主板信息
top           //查看进程信息  shift+e可以切换单位
free         //查看内存大小, free -h,切换单位显示
cat /proc/cpuinfo    //查看cpu信息
fdisk -l   //可以看到系统上的磁盘(包括U盘)的分区以及大小相关信息。
cat /proc/partitions   //查看磁盘分区
df -lh      //查看磁盘统计

1、docker的安装可以参考官网的安装方法

这里我使用的docker是20.10.24版本
image

官方提供一个脚本在ubuntu上安装docker-ce

curl https://get.docker.com | sh \
  && sudo systemctl --now enable docker

2、查看cuda版本

cat /usr/local/cuda/version.json
image


nvcc -V //查看实际使用的cuda版本
image

3、查看显卡型号和gpu使用信息(NVIDIA显卡)

lspci //查看当前gpu型号,其实可以看到所有的设备信息
image

检测显卡驱动和型号

$ sudo yum install nvidia-detect

$ nvidia-detect -v
Probing for supported NVIDIA devices...
[10de:1e04] NVIDIA Corporation TU102 [GeForce RTX 2080 Ti]
This device requires the current 440.64 NVIDIA driver kmod-nvidia
[1af4:1050] Red Hat, Inc. Virtio GPU

Linux查看显卡信息:(ps:若找不到lspci命令,可以安装 yum install pciutils)
lspci | grep -i vga

使用nvidia GPU可以:
lspci | grep -i nvidia

查看显卡驱动
cat /proc/driver/nvidia/version

nvidia-smi //查看gpu版本信息nvidia-smi //查看gpu使用信息
image

nvidia-smi命令

nvidia-smi命令

nvidia 的系统管理界面 (nvidia-smi),可以收集各种级别的信息,查看显存使用情况。此外, 可以启用和禁用 GPU 配置选项 (如 ECC 内存功能)。
1、nvidia-smi
当多块GPU坏掉一块 ,没法确认时,同时开启风扇吹热风,没风的就是坏的。
显存占用和GPU占用是两个不一样的东西,显卡是由GPU和显存等组成的,显存和GPU的关系有点类似于内存和CPU的关系。
2. nvidia-smi vgpu
查看当前vGPU的状态信息:
3. nvidia-smi vgpu -p 循环显示虚拟桌面中应用程序对GPU资源的占用情况
4. nvidia-smi -q 查看当前所有GPU的信息,也可以通过参数i指定具体的GPU。
比如nvidia-smi-q -i 0 代表我们查看服务器上第一块GPU的信息。
通过nvidia-smi -q 我们可以获取以下有用的信息:
GPU的SN号、VBIOS、PN号等信息:
GPU的总线、PCI-E总线倍速、风扇转速等信息:
GPU的显存、BAR1、所有资源利用率、ECC模式等信息:
nvidia-smi -q |grep "GPU Link" -A6
NVLink目前更主要的还是大大提升了GPU间通信的带宽。
5、nvidia-smi -L 命令:列出所有可用的 NVIDIA 设备
6、nvidia-smi topo --matrix 命令:查看系统拓扑
7、nvidia-smi topo -mp
8、查询GPU的版本等格式化输出
nvidia-smi --query-gpu=driver_version,name,memory.total,memory.used --format=csv

4、NVIDIA显卡驱动和cuda、cuDNN安装

查看 https://blog.csdn.net/weixin_37926734/article/details/123033286
基本上cuda安装完成后
Ubuntu20.04系统会默认地将CUDA的NVIDIA GPU计算工具包安装到/usr/local/文件夹下面,可以看到该文件夹下多了两个文件夹cuda和cuda-11.3。
image

对CUDA安装是否成功,需要进入NVIDIA CUDA示例包,其位于/home/$user/NVIDIA_CUDA-11.3_Samples内,在该文件夹下打开终端,并输入make。然后进入1_Utilities/deviceQuery文件夹,并在终端执行./deviceQuery 命令,如下result=PASS则表示安装成功。
image

查看cudnn版本:
cat /usr/local/cuda-11.3/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
image

CUDA与CUDNN### 1.1 什么是CUDA?
CUDA(ComputeUnified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。

1.2 什么是CUDNN?

NVIDIA cuDNN是用于深度神经网络的GPU加速库。它强调性能、易用性和低内存开销。NVIDIA cuDNN可以集成到更高级别的机器学习框架中,如谷歌的Tensorflow、加州大学伯克利分校的流行caffe软件。简单的插入式设计可以让开发人员专注于设计和实现神经网络模型,而不是简单调整性能,同时还可以在GPU上实现高性能现代并行计算。

1.3 CUDA与CUDNN的关系

CUDA看作是一个工作台,上面配有很多工具,如锤子、螺丝刀等。cuDNN是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算。它就相当于工作的工具,比如它就是个扳手。但是CUDA这个工作台买来的时候,并没有送扳手。想要在CUDA上运行深度神经网络,就要安装cuDNN,就像你想要拧个螺帽就要把扳手买回来。这样才能使GPU进行深度神经网络的工作,工作速度相较CPU快很多。

5、pytorch(torchvision)和python对应版本关系

1.当你在确定好pytorch的版本后,https://pytorch.org/get-started/previous-versions/该网址会自动配置torchvision的版本。
2.当你确定了pytorch的版本后,可以在https://github.com/pytorch/vision#installation该网址中寻找对应的python版本

6、NVIDIA的cuda镜像库和代码仓库

https://hub.docker.com/r/nvidia/cuda
https://github.com/NVIDIA

7、docker使用nvidia GPU

Docker中的容器无法直接使用GPU算力,除非在容器中再安装一遍GPU驱动,这将非常麻烦。为解决这一问题,nvidia官方提供了nvidia docker环境,用于将宿主机的GPU运行时映射到容器中。
nvidia docker环境已经经历了nvidia-docker、nvidia-docker2,再到NVIDIA Container Toolkit的迭代。
1、nvidia-docker2
nvidia-docker2是对docker的封装,提供一些必要的组件可以很方便的在容器中用GPU资源执行代码,nvidia-docker共享了宿主机的CUDA Driver
2、nvidia-container-toolkit
最新版的nvidia-docker就是nvidia-container-toolkit,比nvidia-docker2更加优秀
官方的解释是"Usage of nvidia-docker2 packages are deprecated since NVIDIA GPUs are now natively supported as devices in the Docker runtime"。(机翻:不赞成使用nvidia-docker2包,因为nvidia GPU现在在Docker运行时本机作为可支持设备)
nvidia-container-toolkit需要主机已安装当前新版的docker 19.03
使用nvidia-container-toolkit的最大优点:
linux主机不需要安装cuda和cudnn,仅安装显卡驱动即可(tensorflow和nvidia-docker官方均强调这一点)
nvidia-container-toolkit文档
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/overview.html
安装nvidia-container-toolkit

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
#nvidia-container-toolkit更新包列表后安装包(和依赖项):
sudo apt-get update

sudo apt-get install -y nvidia-container-toolkit
#配置 Docker 守护进程以识别 NVIDIA 容器运行时:
sudo nvidia-ctk runtime configure --runtime=docker
#设置默认运行时后重启Docker守护进程完成安装:
sudo systemctl restart docker
#此时,可以通过运行基本 CUDA 容器来测试工作设置:
sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

#应该会输出
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.51.06    Driver Version: 450.51.06    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
| N/A   34C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

8、PyTorch版本docker镜像构建

一个开源的案例: https://github.com/cnstark/pytorch-docker

ARG BASE_IMAGE

FROM ${BASE_IMAGE}

ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:-compute,utility}

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone \
    && sed -i "s/archive.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list && sed -i "s/security.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list \
    && apt install -yq gnupg \
    && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub \
    && apt-key adv --fetch-keys https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub \
    && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys  A4B469963BF863CC \
    && apt clean && apt update \
    && apt install -y \
        wget build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev \
        libreadline-dev libffi-dev libsqlite3-dev libbz2-dev liblzma-dev && \
    apt clean && \
    rm -rf /var/lib/apt/lists/*

ARG PYTHON_VERSION

RUN cd /tmp && \
    wget http://npm.taobao.org/mirrors/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz && \
    tar -xvf Python-${PYTHON_VERSION}.tgz && \
    cd Python-${PYTHON_VERSION} && \
    ./configure --enable-optimizations && \
    make && make install && \
    cd .. && rm Python-${PYTHON_VERSION}.tgz && rm -r Python-${PYTHON_VERSION} && \
    ln -s /usr/local/bin/python3 /usr/local/bin/python && \
    ln -s /usr/local/bin/pip3 /usr/local/bin/pip && \
    python -m pip install --upgrade pip && \
    rm -r /root/.cache/pip

ARG PYTORCH_VERSION
ARG PYTORCH_VERSION_SUFFIX
ARG TORCHVISION_VERSION
ARG TORCHVISION_VERSION_SUFFIX
ARG TORCHAUDIO_VERSION
ARG TORCHAUDIO_VERSION_SUFFIX
ARG PYTORCH_DOWNLOAD_URL

RUN if [ ! $TORCHAUDIO_VERSION ]; \
    then \
        TORCHAUDIO=; \
    else \
        TORCHAUDIO=torchaudio==${TORCHAUDIO_VERSION}${TORCHAUDIO_VERSION_SUFFIX}; \
    fi && \
    if [ ! $PYTORCH_DOWNLOAD_URL ]; \
    then \
        pip install \
            torch==${PYTORCH_VERSION}${PYTORCH_VERSION_SUFFIX} \
            torchvision==${TORCHVISION_VERSION}${TORCHVISION_VERSION_SUFFIX} \
            ${TORCHAUDIO}; \
    else \
        pip install \
            torch==${PYTORCH_VERSION}${PYTORCH_VERSION_SUFFIX} \
            torchvision==${TORCHVISION_VERSION}${TORCHVISION_VERSION_SUFFIX} \
            ${TORCHAUDIO} \
            -f ${PYTORCH_DOWNLOAD_URL}; \
    fi && \
    rm -r /root/.cache/pip

WORKDIR /workspace
docker build \
    --build-arg BASE_IMAGE=${BASE_IMAGE} \
    --build-arg PYTHON_VERSION=${PYTHON_VERSION} \
    --build-arg PYTORCH_VERSION=${PYTORCH_VERSION} \
    --build-arg PYTORCH_VERSION_SUFFIX=${PYTORCH_VERSION_SUFFIX} \
    --build-arg TORCHVISION_VERSION=${TORCHVISION_VERSION} \
    --build-arg TORCHVISION_VERSION_SUFFIX=${TORCHVISION_VERSION_SUFFIX} \
    --build-arg TORCHAUDIO_VERSION=${TORCHAUDIO_VERSION} \
    --build-arg TORCHAUDIO_VERSION_SUFFIX=${TORCHAUDIO_VERSION_SUFFIX} \
    --build-arg PYTORCH_DOWNLOAD_URL=${PYTORCH_DOWNLOAD_URL} \
    -t cnstark/pytorch:${IMAGE_TAG} \
    -f docker/ubuntu/Dockerfile \
    .
#!/bin/sh

export BASE_IMAGE=nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04

export PYTHON_VERSION=3.9.16

export PYTORCH_VERSION=1.12.1
export PYTORCH_VERSION_SUFFIX=+cu113
export TORCHVISION_VERSION=0.13.1
export TORCHVISION_VERSION_SUFFIX=+cu113
export TORCHAUDIO_VERSION=0.12.1
export TORCHAUDIO_VERSION_SUFFIX=+cu113
export PYTORCH_DOWNLOAD_URL=https://download.pytorch.org/whl/cu113/torch_stable.html

export IMAGE_TAG=1.12.1-py3.9.16-cuda11.3.1-devel-ubuntu20.04

../docker/ubuntu/build.sh

另外一个例子
runtime的包,没有cuda的编译工具nvcc
devel的,是有cuda的nvcc包的

FROM pytorch/pytorch:1.12.1-cuda11.3-cudnn8-devel
LABEL author=""

ENV PASSWORD="Craiditx2023" 

COPY ./requirement.txt /opt/

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone \ 
    && sed -i "s/archive.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list && sed -i "s/security.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list \
    && apt clean && apt update && apt install -yq gnupg \
    && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub \
    && apt clean && apt update && apt install -yq --no-install-recommends sudo \
    && apt install -yq --no-install-recommends libgl1-mesa-glx libglib2.0-0 libsm6 libxext6 libxrender-dev openssh-server git wget curl

RUN conda config --set show_channel_urls yes && conda init\
    && echo "channels:" >>  ~/.condarc && echo "  - defaults" >>  ~/.condarc && echo "default_channels:" >>  ~/.condarc && echo "  - http://mirrors.aliyun.com/anaconda/pkgs/main" >>  ~/.condarc && echo "  - http://mirrors.aliyun.com/anaconda/pkgs/r" >>  ~/.condarc && echo "  - http://mirrors.aliyun.com/anaconda/pkgs/msys2" >>  ~/.condarc && echo "custom_channels:" >>  ~/.condarc && echo "  conda-forge: http://mirrors.aliyun.com/anaconda/cloud" >>  ~/.condarc && echo "  msys2: http://mirrors.aliyun.com/anaconda/cloud" >>  ~/.condarc && echo "  bioconda: http://mirrors.aliyun.com/anaconda/cloud" >>  ~/.condarc && echo "  menpo: http://mirrors.aliyun.com/anaconda/cloud" >>  ~/.condarc && echo "  pytorch: http://mirrors.aliyun.com/anaconda/cloud" >>  ~/.condarc && echo "  simpleitk: http://mirrors.aliyun.com/anaconda/cloud" >>  ~/.condarc \
    && pip install --upgrade pip && pip config set global.index-url https://mirrors.aliyun.com/pypi/simple && pip install setuptools \
    && sed -i "s/#PubkeyAuthentication/PubkeyAuthentication/g" /etc/ssh/sshd_config && sed -i "s/#AuthorizedKeysFile/AuthorizedKeysFile/g" /etc/ssh/sshd_config && sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config \
    && sudo /etc/init.d/ssh restart \
    && echo "root:${PASSWORD}" | chpasswd
ENTRYPOINT /etc/init.d/ssh restart && /bin/bash

docker build -t craiditx/pytorch1.12.1-cuda11.3-cudnn8-devel:0.1  .

docker run -itd -p 43251:22 -p 14380:80 --gpus all --name pytorch -e NVIDIA_VISIBLE_DEVICES=all lealaxy/pytorch:1.11-cuda11.3-cudnn8

conda的命令在RUN中执行不起来
目前的方案是在进入容器内部然后执行
conda create -n train python=3.9.16
conda activate train
pip install -r /opt/requirement.txt
这里行不通,而且pytorch基础就是python3.7的版本

posted @ 2024-03-11 10:44  嘟嘟小宝贝  阅读(839)  评论(0)    收藏  举报