CentOS7离线部署:容器化GPU环境全流程指南

CentOS7离线部署:容器化GPU环境全流程指南

一、环境需求与离线安装的必要性

在工业AI、自动驾驶等场景中,GPU算力是深度学习模型训练的核心。CentOS7作为企业级稳定系统,在离线内网环境中部署容器化GPU环境时,需解决两大挑战:依赖网络下载的安装包无法获取版本兼容性问题。本文以NVIDIA Tesla系列GPU为例,提供完整的离线部署方案。

1.1 硬件与软件需求

  • 硬件:NVIDIA GPU(需支持CUDA)、CentOS7服务器(建议内核版本≥3.10)
  • 软件
    • NVIDIA驱动(版本需与CUDA匹配)
    • CUDA Toolkit(如11.8)
    • cuDNN(如8.6.0)
    • Docker CE(支持NVIDIA Container Toolkit)
    • Kubernetes(可选,用于集群管理)

1.2 离线安装的核心步骤

  1. 基础系统准备:在联网环境下载所有依赖包
  2. 驱动与工具链安装:通过本地RPM包安装NVIDIA生态
  3. 容器运行时配置:启用GPU在容器中的透传
  4. 验证与测试:运行GPU加速的容器示例

二、离线安装前的准备工作

2.1 下载离线依赖包

在联网的CentOS7主机上执行以下操作:

  1. # 创建依赖包目录
  2. mkdir -p ~/offline-gpu-deps/{nvidia,docker,k8s}
  3. # 下载NVIDIA驱动(需根据显卡型号选择)
  4. wget https://us.download.nvidia.com/tesla/525.85.12/NVIDIA-Linux-x86_64-525.85.12.run -O ~/offline-gpu-deps/nvidia/driver.run
  5. # 下载CUDA Toolkit(以11.8为例)
  6. wget https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-repo-rhel7-11.8.0-1.el7.noarch.rpm -O ~/offline-gpu-deps/nvidia/cuda-repo.rpm
  7. # 下载Docker CE与NVIDIA Container Toolkit
  8. yum install --downloadonly --downloaddir=~/offline-gpu-deps/docker docker-ce docker-ce-cli containerd.io
  9. wget https://nvidia.github.io/nvidia-docker/centos7/nvidia-docker2.repo -O ~/offline-gpu-deps/docker/nvidia-docker.repo
  10. # 打包所有依赖(使用tar或rsync传输到离线环境)
  11. cd ~/offline-gpu-deps && tar -czvf gpu-offline-bundle.tar.gz *

2.2 离线环境系统检查

在目标离线服务器上执行:

  1. # 检查内核版本(需≥3.10)
  2. uname -r
  3. # 检查是否已安装旧版驱动(需卸载)
  4. lsmod | grep nvidia
  5. rpm -qa | grep -i nvidia
  6. # 禁用nouveau驱动(需添加到/etc/modprobe.d/blacklist.conf)
  7. echo "blacklist nouveau" | sudo tee -a /etc/modprobe.d/blacklist.conf
  8. sudo dracut --force

三、核心组件离线安装

3.1 NVIDIA驱动与CUDA安装

  1. 安装CUDA仓库

    1. rpm --install ~/offline-gpu-deps/nvidia/cuda-repo.rpm
    2. yum clean all && yum makecache
  2. 安装驱动与CUDA
    ```bash

    安装驱动(需进入文本模式,关闭X11)

    sudo init 3
    chmod +x ~/offline-gpu-deps/nvidia/driver.run
    sudo ./driver.run —silent —dkms

安装CUDA Toolkit

yum install -y cuda-11-8

  1. 3. **配置环境变量**:
  2. ```bash
  3. echo "export PATH=/usr/local/cuda-11.8/bin:$PATH" >> ~/.bashrc
  4. echo "export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH" >> ~/.bashrc
  5. source ~/.bashrc

3.2 Docker与NVIDIA Container Toolkit

  1. 安装Docker CE

    1. rpm --import https://download.docker.com/linux/centos/gpg
    2. yum localinstall -y ~/offline-gpu-deps/docker/*.rpm
    3. systemctl enable --now docker
  2. 配置NVIDIA Container Runtime
    ```bash
    distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
    && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \ # 离线环境需提前下载gpgkey
    && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/yum.repos.d/nvidia-docker.repo

离线安装nvidia-docker2

yum localinstall -y ~/offline-gpu-deps/docker/nvidia-docker2.rpm
systemctl restart docker

  1. 3. **验证GPU透传**:
  2. ```bash
  3. docker run --gpus all nvidia/cuda:11.8.0-base nvidia-smi

四、Kubernetes集群配置(可选)

4.1 离线安装Kubernetes

  1. 下载K8s组件

    1. # 在联网环境下载kubeadm、kubelet、kubectl
    2. yum install --downloadonly --downloaddir=~/offline-gpu-deps/k8s kubeadm kubelet kubectl
  2. 配置GPU调度

    1. # 创建DevicePlugin配置(需保存为nvidia-device-plugin.yaml)
    2. apiVersion: apps/v1
    3. kind: DaemonSet
    4. metadata:
    5. name: nvidia-device-plugin-daemonset
    6. namespace: kube-system
    7. spec:
    8. template:
    9. spec:
    10. containers:
    11. - name: nvidia-device-plugin-ctr
    12. image: nvidia/k8s-device-plugin:1.14 # 需提前下载镜像并保存为tar
    13. volumeMounts:
    14. - name: device-plugin
    15. mountPath: /var/lib/kubelet/device-plugins
    16. volumes:
    17. - name: device-plugin
    18. hostPath:
    19. path: /var/lib/kubelet/device-plugins
  3. 应用配置

    1. kubectl apply -f nvidia-device-plugin.yaml

五、验证与测试

5.1 单机验证

  1. # 运行TensorFlow GPU容器
  2. docker run --gpus all -it tensorflow/tensorflow:2.12.0-gpu python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
  3. # 输出示例:
  4. # [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

5.2 集群验证(K8s环境)

  1. # 创建GPU测试Job
  2. cat <<EOF | kubectl apply -f -
  3. apiVersion: batch/v1
  4. kind: Job
  5. metadata:
  6. name: gpu-test
  7. spec:
  8. template:
  9. spec:
  10. containers:
  11. - name: tf-gpu
  12. image: tensorflow/tensorflow:2.12.0-gpu
  13. command: ["python", "-c", "import tensorflow as tf; print(tf.test.is_gpu_available())"]
  14. restartPolicy: Never
  15. backoffLimit: 4
  16. EOF
  17. # 查看日志
  18. kubectl logs job/gpu-test

六、常见问题与解决方案

6.1 驱动安装失败

  • 现象nvidia-smi命令报错”Module not found”
  • 原因:内核版本不兼容或nouveau未禁用
  • 解决
    1. # 重新编译DKMS模块
    2. sudo dkms build -m nvidia -v $(modinfo -F version nvidia)
    3. sudo dkms install -m nvidia -v $(modinfo -F version nvidia)

6.2 Docker GPU透传失败

  • 现象docker run --gpus all报错”Unknown runtime specified nvidia”
  • 原因:未正确配置/etc/docker/daemon.json
  • 解决
    1. {
    2. "runtimes": {
    3. "nvidia": {
    4. "path": "/usr/bin/nvidia-container-runtime",
    5. "runtimeArgs": []
    6. }
    7. },
    8. "default-runtime": "nvidia"
    9. }

七、最佳实践建议

  1. 版本锁定:固定CUDA、cuDNN、Docker版本,避免升级导致兼容性问题
  2. 镜像管理:构建基础镜像时包含所有依赖,减少运行时下载
    1. FROM nvidia/cuda:11.8.0-base
    2. RUN apt-get update && apt-get install -y python3-pip \
    3. && pip3 install tensorflow-gpu==2.12.0
  3. 监控告警:通过Prometheus+Grafana监控GPU利用率、温度等指标

八、总结

本文通过分步骤的离线安装方案,实现了CentOS7环境下容器对GPU资源的透明调用。关键点包括:依赖包的全量下载驱动与CUDA的兼容性匹配Docker与K8s的GPU插件配置。实际部署中,建议先在测试环境验证所有组件,再推广到生产环境。对于大规模集群,可结合Ansible等工具实现自动化部署。