需求:
多个部门的算法同事只有一台GPU的服务器,需要进行环境隔离,并保证虚拟出来的机器可以和主服务器的GPU进行直连接。
- 安装所需的软件:
首先,确保你的Linux服务器 192.168.1.100:上已经安装了Docker和NVIDIA驱动。
- 安装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
- 制作镜像
命令:
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
- 容器内下载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 即可 )
问题:
- 沟通需要将/data/下的2.6B模型挂载到容器:
- docker虚拟出来的机器怎么挂载/data 磁盘到容器内?
- docker没有网络端口映射出来啊?网络设置能不能虚拟的网口和物理在同一个网段里面啊?
- 之前跑的容器镜像怎么办,重新安装环境挺麻烦的?
- 添加共享内存?
命令:
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)