需求:
多个部门的算法同事只有一台GPU的服务器,需要进行环境隔离,并保证虚拟出来的机器可以和主服务器的GPU进行直连接。
  1. 安装所需的软件:

首先,确保你的Linux服务器 192.168.1.100:上已经安装了Docker和NVIDIA驱动。

Docker容器 直连 Linux GPU Server_bash

Docker容器 直连 Linux GPU Server_centos_02

  1. 安装NVIDIA容器工具包:

     为了让Docker容器可以访问GPU,需要安装NVIDIA Container Toolkit:添加包库并更新包列表:

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

安装nvidia-docker2:

sudo yum install -y nvidia-docker2

重启Docker服务:

sudo systemctl restart docker
  1. 制作镜像

命令:

docker search centos
       docker pull   centos
       docker run -dit --name=docker-gpu-nvidia id /bin/bash
       docker exec -it docker-gpu-nvidia /bin/bash

容器内配置固定的镜像源:

sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* && 
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

容器内安装必要的工具或依赖:

yum update -y && yum install -y \  wget \  epel-release \  gcc  \ && yum clean all
  1. 容器内下载cuda-12.2:

安装文档链接:

https://blog.csdn.net/qq_46699596/article/details/134552021

通过wget下载安装包:

wget https://developer.download.nvidia.com/compute/cuda/12.2.xx/local_installers/cuda_12.2.xx_linux.run

权限:

chmod +x  cuda_12.2.xx_linux.run

终端会弹出cuda的安装界面:

https://blog.csdn.net/qq_46699596/article/details/134552021

设置cuda环境变量:

ENV PATH /usr/local/cuda-12.2/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/cuda-12.2/lib64:${LD_LIBRARY_PATH}
source ~/.bashrc

重新生成新的镜像:

docker commit a0892b8eab2b nvidia-gpu-centos

GPU的docker run命令:

docker run --gpus all -dit  nvidia-gpu-cent /bin/bash

GPU可以进行限制,参考如下:
1. 限制容器使用特定的GPU,可以使用--gpus选项GPU 0和GPU 1:
docker run --gpus '"device=0,1"' -dit nvidia-gpu-cent /bin/bash

2. 可以使用--memory选项:
docker run --gpus '"device=0,1"' --memory=32g -dit nvidia-gpu-cent /bin/bash

3. 结合以上两者,想限制容器的使用GPU 0和GPU 1并:
docker run --gpus '"device=0,1"' --memory=32g -dit nvidia-gpu-cent /bin/bash

进入容器验证:

( 我把命令写shell里面了 docekr exec -it id /bin/bash 即可 )

Docker容器 直连 Linux GPU Server_bash_03

问题:

  1. 沟通需要将/data/下的2.6B模型挂载到容器:
  2. docker虚拟出来的机器怎么挂载/data 磁盘到容器内?
  3. docker没有网络端口映射出来啊?网络设置能不能虚拟的网口和物理在同一个网段里面啊?
  4. 之前跑的容器镜像怎么办,重新安装环境挺麻烦的?
  5. 添加共享内存?

命令

1. docker run -v /data:/container_data -it nvidia-docker-gpu

2. docker run --gpus all --memory=64g -dit \
    -v /data:/data:z \
    voice-nvidia-gpu-docker:v1 \
    /bin/bash
3. docker run --name some-container-name --hostname image-docker-nvidia \
    --gpus '"device=3,4,5"' \
    --memory=64g \
    --cpus=30 \
    -dit \
    --network=host \
    -v /data:/data \
    voice-nvidia-gpu-docker:v1 \
    /bin/bash
    
解释每个参数的作用:
--name some-container-name: 为容器指定一个名字。
--hostname image-docker-nvidia: 设置容器的主机名为 image-docker-nvidia。
--gpus '"device=3,4,5"': 指定要使用的 GPU 设备 ID 为 3、4 和 5。
--memory=64g: 设置容器的最大内存限制为 64GB。
--cpus=30: 设置容器可以使用的 CPU 核心数量为 30。
-dit: 以分离模式运行容器,并在后台启动。
--network=host: 使用宿主机的网络栈。
-v /data:/data: 将宿主机上的 /data 目录挂载到容器内的 /data 目录。
voice-nvidia-gpu-docker:v1: 指定要运行的 Docker 镜像名称和标签。
/bin/bash: 在容器启动后执行 /bin/bash,即启动一个 Bash shell。

4. 可以针对之前服务器跑的容器直接进行限制即可:
docker run \
    --gpus '"device=6"' \
    --memory=32g \
    --cpus=30 \
    -dit \
    --network=host \
    -v /data:/data \
    vdu_tools:v1.0.0:v1 \
    /bin/bash
    
5. docker run \
    --gpus '"device=3,4,5,7"' \
    --memory=300g \
    --cpus=30 \
    -dit \
    --network=host \
    -v /data:/data \
    --tmpfs /dev/shm:size=300G \
    voice-nvidia-gpu-docker:v1 \
    /bin/bash

限制命令信息:

一共8颗GPU,112颗CPU,因为需要分部门需要进行显卡、内存等限制分配:
docker run --gpus '"device=3,4,5"' --memory=64g --cpus=30 -dit \
    -v /data:/data \
    voice-nvidia-gpu-docker:v1 \
    /bin/bash
docker run --gpus '"device=6"' --memory=32g --cpus=30 -dit \
    -v /data:/data \
    image-nvidia-gpu-docker:v1 \
    /bin/bash
验证限制的内存:  echo "$(($(cat /sys/fs/cgroup/memory/memory.limit_in_bytes)/1024/1024/1024)) GB"
验证限制的cpu:   awk "BEGIN {print $(cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us) / $(cat /sys/fs/cgroup/cpu/cpu.cfs_period_us)}"
删除docker无用的进程: docker rm $(docker ps -a -q)