在openEuler 22.03 LTS SP3上部署NVIDIA Container Toolkit:从零到一的AI开发环境搭建

📅 发布时间:2026/7/10 15:06:30 👁️ 浏览次数:
在openEuler 22.03 LTS SP3上部署NVIDIA Container Toolkit:从零到一的AI开发环境搭建
1. 为什么要在openEuler上折腾NVIDIA容器如果你是一个AI开发者或者正在学习深度学习、大模型那你肯定离不开两样东西GPU和容器。GPU是算力的心脏而容器比如Docker则是帮你打包环境、避免“在我机器上能跑”这种尴尬的神器。但当你兴冲冲地买了一台国产服务器或者公司给你配了一台预装openEuler系统的机器时问题就来了怎么才能让Docker容器用上NVIDIA GPU的“洪荒之力”呢我刚开始接触openEuler时也踩过不少坑。网上教程大多是Ubuntu或CentOS的直接照搬过来十有八九会报错。openEuler作为一款优秀的国产操作系统其软件源、包管理方式都有自身的特点。特别是涉及到NVIDIA驱动、CUDA和容器运行时这种深度集成的环节更需要一个“量身定制”的步骤。今天我就把自己在openEuler 22.03 LTS SP3上从零开始搭建支持GPU的AI容器开发环境的完整过程以及中间遇到的各种“坑”和解决方案毫无保留地分享给你。跟着这篇指南走你不仅能成功跑起来还能明白每一步背后的道理以后遇到问题也能自己排查。简单来说我们的目标就是在一台干净的openEuler 22.03 LTS SP3系统上安装好NVIDIA显卡驱动然后部署NVIDIA Container Toolkit以前常被叫做nvidia-docker2最终实现用一条简单的docker run --gpus all命令就能在容器内直接调用宿主机的GPU进行AI训练和推理。整个过程我们会像搭积木一样一步步验证确保每个环节都牢固可靠。2. 万事开头难系统准备与驱动验证在安装任何容器工具之前我们必须确保地基是稳固的。这个地基就是你的openEuler系统和NVIDIA显卡驱动。很多朋友失败的原因都是跳过了这一步或者在这一步没检查清楚。2.1 系统更新与基础依赖首先用管理员权限登录你的openEuler系统。我习惯先做一次全面的系统更新这能避免很多因软件包版本过旧导致的依赖问题。sudo dnf update -y sudo dnf install -y curl vim wget git kernel-devel kernel-headers gcc make安装kernel-devel和kernel-headers非常重要因为后续安装或更新NVIDIA驱动时可能需要编译内核模块来匹配你当前运行的内核版本。虽然openEuler的软件源里可能没有NVIDIA官方驱动但我们需要这些包来保证系统环境的完整性。2.2 验证NVIDIA驱动状态这是最关键的一步。NVIDIA Container Toolkit本身不包含驱动它只是一个“桥梁”让容器能访问宿主机上已经安装好的驱动。所以驱动必须先行且工作正常。打开终端运行业界公认的“驱动力”检测命令nvidia-smi如果你看到了一个漂亮的表格显示了GPU型号、驱动版本、CUDA版本、GPU温度、显存占用等信息那么恭喜你驱动已经就绪。请务必记下Driver Version和CUDA Version这两个信息。例如你可能会看到Driver Version: 550.90.07和CUDA Version: 12.4。这里显示的CUDA版本是驱动支持的最高CUDA运行时版本不代表系统里安装了完整的CUDA Toolkit。如果命令报错“command not found”怎么办这说明你的系统还没有安装NVIDIA驱动。在openEuler上你有两个主要选择从NVIDIA官网下载.run文件手动安装这是最通用、最可控的方式。去NVIDIA官网根据你的GPU型号和操作系统选择Linux 64-bit下载对应的驱动。然后禁用系统自带的nouveau开源驱动进入文本模式进行安装。这个过程稍微繁琐但对openEuler这类发行版兼容性最好。从ELRepo等第三方源安装对于基于RHEL的发行版openEuler与之兼容ELRepo源提供了预编译的驱动包。你可以尝试添加ELRepo源然后通过dnf install nvidia-driver-latest-dkms这样的命令来安装。但需要注意版本匹配和签名问题。我个人的经验是在生产环境或追求稳定性的场景下更推荐方法一。虽然步骤多但一次装好后续问题少。手动安装驱动后务必重启系统并再次运行nvidia-smi确认安装成功。2.3 安装Docker引擎NVIDIA Container Toolkit是Docker的一个插件所以Docker是必需品。openEuler的默认源里就包含了Docker安装非常方便。sudo dnf install -y docker-engine docker-engine-selinux安装完成后启动Docker服务并设置开机自启sudo systemctl start docker sudo systemctl enable docker为了后续操作方便避免每次都加sudo我们可以将当前用户加入docker用户组sudo usermod -aG docker $USER重要提示执行完上面的命令后你需要完全退出当前终端会话并重新登录这个组权限变更才会生效。你可以通过运行newgrp docker命令立即生效但重新登录是最稳妥的方式。验证Docker安装是否成功docker --version docker run hello-world如果能看到Hello from Docker!的欢迎信息说明Docker引擎已经正常运转。3. 核心步骤安装与配置NVIDIA Container Toolkit好了现在我们的宿主机已经有了健康的GPU驱动和运行的Docker引擎。接下来就是搭建“桥梁”的时刻。NVIDIA Container Toolkit本质上是一组工具它包含了nvidia-container-runtime、nvidia-container-toolkit等组件它们会“劫持”Docker创建容器的过程把GPU设备、驱动库文件正确地映射到容器内部。3.1 配置NVIDIA容器工具库我们需要将NVIDIA提供的官方软件源添加到系统中。这里有一个小坑NVIDIA官方安装指南通常假设你是Ubuntu或CentOS。对于openEuler我们需要一点小技巧来让系统被正确识别。首先设置一个变量来定义你的系统发行版标识。对于openEuler 22.03我们可以尝试使用rhel8的标识因为它们在包管理上兼容。但更稳妥的方法是我们直接使用NVIDIA提供的通用脚本方式或者手动创建仓库文件。方法一使用包管理器直接配置推荐NVIDIA提供了一个配置工具能自动检测并设置正确的仓库。我们先安装这个工具的基础包# 安装基础工具用于添加仓库 sudo dnf install -y curl # 根据你的系统架构通常是x86_64设置变量 distributionrhel8 archx86_64 # 下载并添加NVIDIA容器工具库的GPG密钥和仓库配置 curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.repo | \ sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo方法二手动创建仓库文件备选如果上述方法失败或者你想更清晰地了解配置内容可以手动创建文件/etc/yum.repos.d/nvidia-container-toolkit.repo并填入以下内容[nvidia-container-toolkit] nameNVIDIA Container Toolkit baseurlhttps://nvidia.github.io/libnvidia-container/stable/rhel8/$arch enabled1 gpgcheck1 gpgkeyhttps://nvidia.github.io/libnvidia-container/gpgkey注意这里的baseurl路径中的rhel8和$arch需要根据你的实际情况调整。对于openEuler 22.03 (SP3)使用rhel8通常是可行的。$arch替换为你的架构如x86_64。3.2 安装NVIDIA Container Toolkit包添加仓库后更新DNF的元数据缓存然后安装核心工具包sudo dnf clean all sudo dnf makecache sudo dnf install -y nvidia-container-toolkit这个nvidia-container-toolkit包会自动处理很多依赖包括nvidia-container-runtime。安装过程如果没有报错就成功了一大半。3.3 配置Docker使用NVIDIA运行时安装完工具包后我们需要告诉Docker“以后创建容器时如果有GPU需求请使用我们刚安装的NVIDIA运行时来操作。”运行以下命令它会自动修改Docker的守护进程配置文件通常是/etc/docker/daemon.jsonsudo nvidia-ctk runtime configure --runtimedocker这个nvidia-ctk命令是工具包的一部分。执行后你可以检查一下/etc/docker/daemon.json文件应该能看到类似下面的内容被添加了进去{ runtimes: { nvidia: { path: /usr/bin/nvidia-container-runtime, runtimeArgs: [] } } }这意味着Docker现在认识了一个名为nvidia的运行时。3.4 重启Docker服务并验证配置文件的改动需要重启Docker服务才能生效sudo systemctl restart docker重启后我们来做一个关键的验证检查Docker是否已经识别到了NVIDIA运行时docker info | grep -i runtime在输出中你应该能看到Runtimes: nvidia runc io.containerd.runc.v2这样的信息。如果看到了nvidia就说明配置成功了这是很多教程里会忽略的检查点务必确认。4. 激动人心的时刻运行你的第一个CUDA容器“桥”已经搭好是时候通车测试了。我们将运行一个NVIDIA官方提供的最精简的CUDA容器并在容器内部运行nvidia-smi命令。如果能在容器里看到和宿主机一样的GPU信息那就大功告成4.1 基础测试命令运行以下命令sudo docker run --rm --runtimenvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi让我解释一下这个命令的每个部分--rm容器停止运行后自动删除保持环境清洁。--runtimenvidia指定使用我们刚才配置的NVIDIA运行时来创建这个容器。注意在较新版本的NVIDIA Container Toolkit和Docker中--runtimenvidia参数有时可以省略仅使用--gpus all即可。但为了明确和兼容我习惯都加上。--gpus all这是Docker的GPU访问API告诉Docker把所有的GPU都暴露给这个容器。你也可以指定具体的GPU比如--gpus device0,1。nvidia/cuda:11.6.2-base-ubuntu20.04这是NVIDIA在Docker Hub上维护的官方CUDA基础镜像。我们选择了一个版本11.6.2和基础系统Ubuntu 20.04相对稳定的组合。你可以根据需求选择其他标签比如nvidia/cuda:12.1.1-runtime-ubuntu22.04。nvidia-smi这是在容器内部要执行的命令。如果一切顺利你会在终端里看到和之前在宿主机上运行nvidia-smi几乎相同的输出表格表格顶部会显示驱动版本和CUDA版本。这意味着容器内的进程已经可以无缝地使用宿主机GPU了。4.2 进阶测试与参数解读你可以进行更多测试来加深理解测试1只列出GPU设备信息有时候你只关心有哪些GPU可以使用-L参数sudo docker run --rm --runtimenvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi -L输出会简洁地显示每个GPU的型号和UUID例如GPU 0: Tesla T4 (UUID: GPU-xxxx...) GPU 1: Tesla T4 (UUID: GPU-yyyy...)测试2运行一个实际的CUDA样例运行一个简单的CUDA向量加法程序来验证计算功能sudo docker run --rm --runtimenvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 bash -c cd /usr/local/cuda/samples/0_Simple/vectorAdd make ./vectorAdd这个命令会进入容器编译CUDA自带的vectorAdd示例并运行。如果看到Test PASSED的输出那就证明CUDA计算功能在容器内完全正常。测试3指定使用特定GPU如果你有多块GPU可以只让容器使用其中一块sudo docker run --rm --runtimenvidia --gpus device0 nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi这样容器就只能看到并使用的GPU 0。4.3 可能遇到的问题与排查如果测试失败了别慌我们可以按步骤排查错误docker: Error response from daemon: Unknown runtime specified nvidia.原因Docker没有识别到名为nvidia的运行时。解决首先确认/etc/docker/daemon.json配置是否正确并且是否已经执行了sudo systemctl restart docker。然后再次运行docker info | grep -i runtime检查。错误docker: Error response from daemon: could not select device driver...或No such device原因Docker的--gpus参数无法找到GPU设备。这通常是因为nvidia-container-toolkit没有正确安装或者宿主机驱动有问题。解决回到第二步确保宿主机nvidia-smi能正常运行。然后确认nvidia-container-toolkit包已安装并且nvidia-container-runtime二进制文件存在which nvidia-container-runtime。容器内nvidia-smi命令报错或显示NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver...原因这是最常见的问题。容器内部无法与宿主机NVIDIA驱动内核模块通信。解决首要原因是宿主机驱动未安装或安装失败。请严格按2.2节重新安装验证驱动。其次可能是驱动版本与nvidia-container-toolkit版本不兼容。尝试更新宿主机驱动到最新稳定版。还有一种可能是你正在使用云厂商的虚拟机实例其GPU是透传如AWS EC2或虚拟化如vGPU的可能需要额外的驱动安装步骤请参考云厂商文档。权限问题如果你已经将用户加入了docker组但运行docker命令仍需要sudo请确认你是否已经重新登录了终端。5. 实战构建一个自定义的AI开发环境镜像仅仅能运行官方镜像还不够我们的最终目标是搭建自己的开发环境。这里我以构建一个包含PyTorch、TensorFlow等常用AI框架的Jupyter Lab环境为例带你走一遍完整的自定义镜像构建流程。5.1 编写Dockerfile创建一个工作目录比如~/ai-dev然后在该目录下创建名为Dockerfile的文件# 基于一个包含完整CUDA运行时和cuDNN的Ubuntu镜像 FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 # 设置环境变量避免交互式安装提示 ENV DEBIAN_FRONTENDnoninteractive ENV PYTHONUNBUFFERED1 # 更新软件源并安装基础工具、Python和必要的系统库 RUN apt-get update apt-get install -y --no-install-recommends \ python3.10 \ python3-pip \ python3.10-venv \ git \ wget \ curl \ vim \ build-essential \ libgl1-mesa-glx \ libglib2.0-0 \ rm -rf /var/lib/apt/lists/* # 将python3链接为pythonpip3链接为pip可选根据习惯 RUN ln -s /usr/bin/python3.10 /usr/bin/python \ ln -s /usr/bin/pip3 /usr/bin/pip # 安装Jupyter Lab及常用数据科学库 RUN pip install --no-cache-dir --upgrade pip \ pip install --no-cache-dir \ jupyterlab \ notebook \ ipywidgets \ jupyter-archive # 安装主流的AI框架这里以PyTorch和TensorFlow为例请根据CUDA版本选择对应安装命令 # 从PyTorch官网获取适合CUDA 11.8的安装命令 RUN pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装TensorFlow RUN pip install --no-cache-dir tensorflow[and-cuda] # 安装其他常用库 RUN pip install --no-cache-dir \ numpy \ pandas \ matplotlib \ scikit-learn \ seaborn \ opencv-python-headless \ transformers \ datasets \ accelerate # 创建一个非root用户并设置工作目录安全最佳实践 RUN useradd -m -s /bin/bash aiuser USER aiuser WORKDIR /home/aiuser/work # 暴露Jupyter Lab的默认端口 EXPOSE 8888 # 设置容器启动命令 CMD [jupyter, lab, --ip0.0.0.0, --port8888, --no-browser, --allow-root]这个Dockerfile做了以下几件事选择了一个功能更全的基础镜像包含了CUDA运行时和cuDNN。安装了Python 3.10和系统依赖。安装了Jupyter Lab生态。安装了与CUDA 11.8兼容的PyTorch和TensorFlow。安装了一系列常用的数据科学和AI库。创建了一个非root用户提升了容器内运行的安全性。设定了启动命令为Jupyter Lab。5.2 构建并运行自定义镜像在Dockerfile所在的目录下执行构建命令docker build -t my-ai-lab:latest .这个过程可能会花费一些时间因为它需要下载基础镜像和安装所有软件包。构建成功后你可以运行这个镜像docker run --rm -it \ --runtimenvidia \ --gpus all \ -p 8888:8888 \ -v $(pwd)/workspace:/home/aiuser/work \ my-ai-lab:latest参数解释-p 8888:8888将宿主机的8888端口映射到容器的8888端口这样你就能在浏览器里访问Jupyter Lab了。-v $(pwd)/workspace:/home/aiuser/work将当前目录下的workspace文件夹挂载到容器内的工作目录。这样你在Jupyter Lab里创建的文件会保存在宿主机上即使容器删除数据也不会丢失。运行后终端会输出一个带有token的URL例如http://127.0.0.1:8888/lab?tokenxxx。复制这个URL到浏览器打开你就拥有了一个在openEuler上运行的、支持GPU加速的、功能齐全的AI开发环境了5.3 在容器内验证GPU和框架在Jupyter Lab里新建一个Notebook运行以下代码来验证环境import torch import tensorflow as tf print(fPyTorch版本: {torch.__version__}) print(fPyTorch CUDA可用: {torch.cuda.is_available()}) if torch.cuda.is_available(): print(fPyTorch GPU设备: {torch.cuda.get_device_name(0)}) print(f\nTensorFlow版本: {tf.__version__}) print(fTensorFlow GPU列表: {tf.config.list_physical_devices(GPU)}) # 运行一个简单的GPU张量计算 if torch.cuda.is_available(): x torch.rand(5, 3).cuda() print(f\nPyTorch GPU张量计算示例:\n{x x.t()})如果一切正常你会看到PyTorch和TensorFlow都成功检测到了GPU并且能进行运算。至此你的专属AI开发沙箱就完全搭建成功了。你可以在这个环境里自由地安装其他库跑你的模型训练脚本享受容器化带来的环境隔离和GPU直通的双重便利。