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

一、环境准备与离线包管理

在离线环境中部署GPU容器环境,首要任务是构建完整的依赖库。建议采用”基础镜像+增量包”模式:

  1. 基础系统镜像:使用CentOS7官方Minimal ISO制作本地YUM源,通过createrepo工具构建本地仓库。示例命令:
    1. mkdir /localrepo && cp *.rpm /localrepo
    2. createrepo /localrepo
  2. GPU驱动包:从NVIDIA官网下载对应驱动(如NVIDIA-Linux-x86_64-470.xx.xx.run)及CUDA Toolkit离线包(需匹配驱动版本)。推荐使用wget --no-check-certificate在联网环境下载后传输至离线服务器。
  3. 容器运行时:准备Docker CE离线包(包含docker-ce、docker-ce-cli、containerd.io)及nvidia-docker2组件。建议使用yumdownloader工具下载完整依赖链。

二、GPU驱动离线安装

  1. 内核头文件准备

    1. rpm -ivh kernel-devel-$(uname -r).rpm kernel-headers-$(uname -r).rpm

    需确保版本与当前运行内核完全一致,可通过uname -r验证。

  2. 驱动安装

    1. chmod +x NVIDIA-Linux-x86_64-*.run
    2. ./NVIDIA-Linux-x86_64-*.run --silent --dkms --no-opengl-files

    关键参数说明:

  • --silent:静默安装
  • --dkms:动态内核模块支持
  • --no-opengl-files:仅安装计算相关组件
  1. 验证安装
    1. nvidia-smi
    2. # 应显示GPU信息及驱动版本
    3. modinfo nvidia | grep version
    4. # 验证内核模块

三、容器运行时配置

  1. Docker离线安装

    1. rpm -ivh docker-ce-*.rpm docker-ce-cli-*.rpm containerd.io-*.rpm
    2. systemctl enable docker
  2. NVIDIA Container Toolkit配置

    1. distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
    2. && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
    3. && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/yum.repos.d/nvidia-docker.repo
    4. # 离线场景需手动创建repo文件并放置离线包
    5. rpm -ivh nvidia-container-toolkit-*.rpm
  3. 运行时配置
    编辑/etc/docker/daemon.json

    1. {
    2. "default-runtime": "nvidia",
    3. "runtimes": {
    4. "nvidia": {
    5. "path": "/usr/bin/nvidia-container-runtime",
    6. "runtimeArgs": []
    7. }
    8. }
    9. }

    重启服务:

    1. systemctl restart docker

四、容器化GPU验证

  1. 基础验证

    1. docker run --gpus all nvidia/cuda:11.0-base nvidia-smi
    2. # 应显示容器内GPU信息
  2. 深度学习框架测试

    1. docker run --gpus all -it tensorflow/tensorflow:latest-gpu python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
    2. # 应输出GPU设备列表

五、离线环境维护建议

  1. 版本锁定机制
    创建/etc/yum/repos.d/local.repo固定包版本:

    1. [local]
    2. name=Local Repository
    3. baseurl=file:///localrepo
    4. enabled=1
    5. gpgcheck=0
  2. 容器镜像管理
    使用docker savedocker load进行镜像传输:

    1. docker save -o cuda_image.tar nvidia/cuda:11.0-base
    2. docker load -i cuda_image.tar
  3. 安全更新策略

  • 定期通过外网服务器同步安全补丁
  • 使用yum update --disablerepo=* --enablerepo=local仅更新本地包
  • 建立补丁审核流程,避免引入不兼容更新

六、常见问题处理

  1. 驱动与内核不匹配
    错误现象:modprobe: ERROR: could not insert 'nvidia': Unknown symbol in module
    解决方案:

    1. # 确认内核版本
    2. uname -r
    3. # 安装对应版本的kernel-devel
    4. rpm -qa | grep kernel-devel
  2. 容器GPU不可见
    错误现象:docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
    排查步骤:

  • 检查nvidia-container-cli日志:
    1. journalctl -u nvidia-containerd
  • 验证/etc/nvidia-container-runtime/config.toml配置
  1. 性能异常
    建议使用nvidia-smi dmon监控GPU利用率,若发现异常:
  • 检查/etc/modprobe.d/nvidia.conf中的参数设置
  • 验证/usr/lib/modprobe.d/dist-blacklist.conf是否屏蔽了nouveau驱动

七、进阶配置

  1. 多GPU调度
    通过NVIDIA_VISIBLE_DEVICES环境变量控制:

    1. docker run --gpus '"device=0,1"' -it tensorflow/tensorflow:latest-gpu
  2. MIG设备配置
    对于A100等支持MIG的GPU:

    1. nvidia-smi mig -i 0 -C 3g.10gb
    2. # 创建MIG实例后,容器中通过device ID访问
  3. 性能优化参数
    /etc/nvidia/nvidia-application-profiles-*.rc中配置:

    1. [gpu_0]
    2. # 启用持久模式减少初始化开销
    3. Option "PersistentMode" "1"
    4. # 优化自动boost功能
    5. Option "AutoBoost" "0"
    6. Option "AutoBoostDefault" "0"

本方案已在多个生产环境验证,可支持从TensorFlow/PyTorch训练到CUDA计算的全场景GPU容器化需求。建议定期进行nvidia-bug-report.sh收集诊断信息,建立完善的离线环境更新机制。