To Dark Mode
Featured Images
Photo by CHUTTERSNAP on Unsplash

服务器新装 GPU 的容器化配置笔记

在 JupyterHub 环境下

Zhenghao Wu

Status: Finished Confidence: Verified in practice Importance: 8

Post Details

前言

最近需要给一台以前配置的 CPU 服务器装上 GPU,这台机器之前已经配置好了存储和基于 Docker 和 JupyterHub 的计算环境。这里就记录一下装上 GPU 后的配置过程。本文只涉及系统和软件层面的调整。也就是新增的显卡已经安装到设备内,且设备已经能够被系统识别。可以通过 lspci | grep "NVIDIA" 命令查看设备是否被识别。

下面为两个成功识别显卡设备的例子:

$ lspci | grep "NVIDIA"
af:00.0 3D controller: NVIDIA Corporation GA100 [A100 PCIe 80GB] (rev a1)
d8:00.0 3D controller: NVIDIA Corporation GA100 [A100 PCIe 80GB] (rev a1)
# 专业卡会显示为 3D controller
$ lspci | grep "NVIDIA"
31:00.0 VGA compatible controller: NVIDIA Corporation Device 2685 (rev a1)
31:00.1 Audio device: NVIDIA Corporation Device 22ba (rev a1)
b1:00.0 VGA compatible controller: NVIDIA Corporation Device 2685 (rev a1)
b1:00.1 Audio device: NVIDIA Corporation Device 22ba (rev a1)
# 游戏卡会显示为 VGA compatible controller

另外系统版本为 Ubuntu 22.04。系统已经安装 Docker,且 Docker 版本大于 19.03。

1. 禁用 Nouveau 驱动

Nouveau 驱动是一个开源的 NVIDIA 显卡驱动,但是在使用 NVIDIA 官方驱动时,需要禁用 Nouveau 驱动。否则会导致显卡驱动无法正常加载。

2. 安装 NVIDIA 驱动

3. 安装 CUDA

3.1 下载 CUDA 安装包

CUDA 是 NVIDIA 提供的一个并行计算平台和编程模型。我们可以通过 CUDA 来加速计算。但是在安装 CUDA 之前,我们需要确认安装的版本,新的驱动版本可能不支持旧的 CUDA 版本。

在刚刚步骤中,我们可以看到 nvidia-smi 的输出中有 CUDA 的版本(右上角)。这里我们可以看到 CUDA 的版本为 12.4。

我们可以在 NVIDIA 官网(https://developer.nvidia.com/cuda-toolkit-archive)上查看 CUDA 的版本。这里我们可以看到 12.4 的 CUDA 版本为 12.4.0 和 12.4.1。这里我们选择安装 12.4.1 版本。

在页面中,会要求你选择系统的情况,这里我们选择 Linux -> x86_64 -> Ubuntu -> 22.04 -> runfile (local)。

页面中会展示下载链接和安装的指令。

wget https://developer.download.nvidia.com/compute/cuda/12.4.1/local_installers/cuda_12.4.1_550.54.15_linux.run
sudo sh cuda_12.4.1_550.54.15_linux.run

3.2 安装 CUDA

使用 wget 下载 CUDA 安装包,然后使用 sh 执行安装。

安装过程中会有一些提示,其中包括是否安装驱动,因为我们先前已经安装了驱动,所以我们要取消驱动安装的勾选(因为内带的驱动版本可能不是最新的)。

3.3 配置环境变量

安装完成后,我们需要配置环境变量。主要是将 CUDA bin 的路径添加到环境变量中。

4. 安装 nvidia-container-toolkit

nvidia-container-toolkit 是一个用于 Docker 的工具,用于支持 NVIDIA GPU 的 Docker 容器。

6. 构建 Docker 镜像

我们将采用 EPTI 基础 Dockerfile 集(基于 docker-stacks 和 nvidia/cuda 镜像构建)。包含了 miniconda,jupyterlab,pytorch 等常用的库。当你在执行构建时,需要修改 Dockerfile 中的 FORM 字段。

这个集含多个 Dockerfile,他们的依赖关系为:

nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04
└── @/docker-stacks-foundation-gpu-cuda<CUDA VERSION>:latest
    └── @/base-gpu-notebook-cuda<CUDA VERSION>:latest
        └── @/pytorch-gpu-notebook-cuda<CUDA VERSION>:latest

@ = reg.epti.moe/epti-jupyter (这个是生产环境内使用的内部镜像,你可以改成自己的名字)

其中:

  1. reg.epti.moe/epti-jupyter/docker-stacks-foundation-gpu-cuda12.4 相关文件存储在 foundation 文件夹啊中,进入后使用 docker build . -t reg.epti.moe/epti-jupyter/docker-stacks-foundation-gpu-cuda12.4:latest 指令来构建。

    • 基于 NVIDIA CUDA 12.4.1 的基础镜像(cudnn devel 版本)
    • 配置了基础操作系统环境,安装必要的系统包
    • 创建了名为 jovyan 的非 root 用户
    • 使用 Micromamba 安装和管理 Python(默认 3.11)及相关包
    • 配置了 Jupyter 运行所需的各种环境变量和目录权限
    • 设置了容器启动相关的配置,包括入口点和启动钩子
  2. reg.epti.moe/epti-jupyter/base-gpu-notebook-cuda12.4 相关文件存储在 base 文件夹中,进入后使用 docker build . -t reg.epti.moe/epti-jupyter/base-gpu-notebook-cuda12.4:latest 指令来构建。

    • 基于 foundation 构建,安装系统包:fonts-liberation(字体),pandoc(文档转换),run-one(命令运行管理)
    • Jupyter 组件安装:JupyterLab/Jupyter Notebook/JupyterHub/NBClassic
    • 配置设置:端口 8888/健康检查/启动脚本和配置文件
  3. reg.epti.moe/epti-jupyter/pytorch-gpu-notebook-cuda12.4 相关文件存储在 pytorch 文件夹中,进入后使用 docker build . -t reg.epti.moe/epti-jupyter/pytorch-gpu-notebook-cuda12.4:latest 指令来构建。

    • 基于 base 构建,安装 PyTorch 和相关库
    • 安装了 torch、torchvision、torchaudio
    • 安装了 tensorboard、visual studio code 支持

7. 添加 Docker 镜像到 JupyterHub 配置中

在 JupyterHub 的配置文件中,我们需要添加 Docker 镜像的配置。请使用 root 权限修改 jupyterhub_config.py 配置文件。找到 c.DockerSpawner.allowed_images 配置项,添加新的镜像。这里的格式是字典,键为镜像名称,值为镜像地址。以下是配置的一个例子。

c.DockerSpawner.allowed_images = {
    '[GPU] Pytorch 2.4.1 (Python 3.11, CUDA12.4)': 'reg.epti.moe/epti-jupyter/pytorch-gpu-notebook-cuda12.4:latest',
    '[ R ] 基础环境': 'reg.epti.moe/epti-jupyter/r-notebook:latest',
    '[PYTHON] 基础环境': 'reg.epti.moe/epti-jupyter/minimal-notebook:latest',
}

小结

这里我们记录了在 Ubuntu 22.04 系统上配置新添加 NVIDIA GPU 的过程。主要包括了禁用 Nouveau 驱动、安装 NVIDIA 驱动、安装 CUDA、安装 nvidia-container-toolkit、构建 Docker 镜像、添加 Docker 镜像到 JupyterHub 配置中。这里我们使用了 EPTI 的基础镜像集,构建了一个 PyTorch 的 GPU 镜像。这个镜像可以用于 JupyterHub 的 GPU 计算环墋中。

Article Card

For "服务器新装 GPU 的容器化配置笔记"

Author Zhenghao Wu
Publish & Update Date 2024-11-24
Tags Docker Container Docker Images Self-host GPU JupyterHub NVIDIA GPU CUDA PyTorch RTX 4090D NVIDIA A100
Extra Materials
  • 【2022新教程】Ubuntu server 20.04如何安装nvidia驱动和cuda-解决服务器ssh一段时间后连不上的问题
  • CUDA Tookit Documentation
  • Installing the NVIDIA Container Toolkit
  • How to prevent NVIDIA drivers from automatically upgrading on Ubuntu?

Related Posts