包含 CUDA 12.2.2 与 cuDNN 8.x 的 Dockerfile (Ubuntu 22.04)
下面是一个平台推荐的 Dockerfile 示例,用于构建包含系统级 CUDA 和 cuDNN 的 Docker 镜像。基于 Ubuntu 22.04 构建,并安装 CUDA 12.2.2 版本和 cuDNN 8.x。安装完成后,系统级 CUDA 环境就绪,可使用 nvcc 等开发编译工具。部分应用明确要求特定的 cuDNN 8.x(或更早版本),可参考本文中的 Dockerfile 方案:即使用 NVIDIA 官方的 parse_redist.py 工具免密下载并安装这些老版本的组件。
提示
在平台预置镜像不满足要求,或无法访问 Docker Hub 时,推荐您使用下方 Dockerfile 自行构建镜像。
FROM cr.infini-ai.com/infini-ai/ubuntu:22.04-20240429
ENV PATH=/usr/local/cuda/bin:/usr/local/cuda-12.2/bin${PATH:+:${PATH}} \
LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda-12.2/lib64:/usr/lib/x86_64-linux-gnu${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} \
CUDA_HOME=/usr/local/cuda \
CPATH=/usr/include${CPATH:+:${CPATH}} \
LIBRARY_PATH=/usr/lib/x86_64-linux-gnu${LIBRARY_PATH:+:${LIBRARY_PATH}}
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y wget build-essential git python3 \
&& rm -rf /var/lib/apt/lists/* \
&& wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run \
&& sh cuda_12.2.2_535.104.05_linux.run --toolkit --silent --override \
&& echo '/usr/local/cuda/lib64' >> /etc/ld.so.conf \
&& echo '/usr/local/cuda-12.2/lib64' >> /etc/ld.so.conf \
&& ldconfig \
&& rm cuda_12.2.2_535.104.05_linux.run
RUN git clone https://ghfast.top/https://github.com/NVIDIA/build-system-archive-import-examples.git \
&& cd build-system-archive-import-examples \
&& python3 -u ./parse_redist.py --product cudnn --label 8.9.7.29 --os linux --arch x86_64 \
&& cp flat/linux-x86_64/cuda12/include/cudnn*.h /usr/local/cuda/include \
&& cp -P flat/linux-x86_64/cuda12/lib/libcudnn* /usr/local/cuda/lib64 \
&& chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn* \
&& ldconfig \
&& cd / \
&& rm -rf build-system-archive-import-examples注意
- 如果需要修改具体的 CUDA 基础版本(如
12.2.2),请查阅 CUDA Toolkit Archive 获取对应的 runfile 名称。 - 由于从 cuDNN Archive 传统页面手动下载 8.x 或更早历史版本通常需要 NVIDIA 开发者账号验证,因此本文采用了官方的 redist 解析脚本完成免密自动化下载。
本文包含的 Dockerfile 可用于:
- 镜像中心 基于 Dockerfile 创建镜像 功能
- AI Studio 开发机内使用 Docker-in-Docker 方式构建镜像。
Dockerfile 说明
从宏观上看,我们在构建此镜像时主要进行了以下优化和配置:
- 基础镜像及环境:以精简安全的 Ubuntu 22.04 为基础,提前注入了完整的 CUDA 搜索路径和各种
C语言头文件路径。 - CUDA 工具包安装:使用离线 runfile 静默安装基础计算工具链。使用
--toolkit参数跳过显卡驱动器(Driver)的安装,仅安装 CUDA 开发库。因为容器内部必须依赖并继承物理宿主机的底层 GPU 驱动程序,强行在容器中安装驱动会导致底层设备环境冲突或不可用。 - cuDNN 免密归档安装:克隆官方针对构建系统的自动化脚本,精准解析并拉取无需登录验证的 Redis 包,再手动将其库和头文件链接至系统 CUDA 目录中。
- 动态链接更新:每安装完一个包含
.so的大型底层库,均手动刷新/etc/ld.so.conf并执行ldconfig,确保上层应用在启动时能立即寻址到新库。
配置预期的环境变量
ENV PATH=/usr/local/cuda/bin:/usr/local/cuda-12.2/bin${PATH:+:${PATH}} \
LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda-12.2/lib64:/usr/lib/x86_64-linux-gnu${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} \
CUDA_HOME=/usr/local/cuda \
CPATH=/usr/include${CPATH:+:${CPATH}} \
LIBRARY_PATH=/usr/lib/x86_64-linux-gnu${LIBRARY_PATH:+:${LIBRARY_PATH}}尽早声明环境变量可以帮助构建过程及最终的容器运行时明确查找路径。上述配置将预期的 CUDA 及相关 C/C++ 编译所需的路径加入系统的全局搜索优先级列表中。
获取并安装 CUDA 工具链
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y wget build-essential git python3 \
&& rm -rf /var/lib/apt/lists/* \
&& wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run \
&& sh cuda_12.2.2_535.104.05_linux.run --toolkit --silent --override \
&& echo '/usr/local/cuda/lib64' >> /etc/ld.so.conf \
&& echo '/usr/local/cuda-12.2/lib64' >> /etc/ld.so.conf \
&& ldconfig \
&& rm cuda_12.2.2_535.104.05_linux.run首先安装 wget、编译用的 build-essential,以及后续步骤需要的 git 与 python3,并清理 apt 缓存以缩减镜像体积。下载 CUDA 安装包后,利用 --toolkit --silent --override 实现静默免交互安装。由于此处隔离环境必须跳过宿主机级别的 Driver 配置,--toolkit 保证了系统与容器硬件层面的兼容。安装结束后,更新链接缓存并删除庞大的 .run 安装包释放层空间。
使用自动化工具拉取 cuDNN
RUN git clone https://ghfast.top/https://github.com/NVIDIA/build-system-archive-import-examples.git \
&& cd build-system-archive-import-examples \
&& python3 -u ./parse_redist.py --product cudnn --label 8.9.7.29 --os linux --arch x86_64 \
&& cp flat/linux-x86_64/cuda12/include/cudnn*.h /usr/local/cuda/include \
&& cp -P flat/linux-x86_64/cuda12/lib/libcudnn* /usr/local/cuda/lib64 \
&& chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn* \
&& ldconfig \
&& cd / \
&& rm -rf build-system-archive-import-examples注意
从 cuDNN Archive 传统页面手动下载 8.x 或更早历史版本通常需要 NVIDIA 开发者账号登录状态。这里的技巧是采用了 NVIDIA 官方提供给构建系统拉取解压专用的 redist 脚本解析库。
这段代码会克隆 NVIDIA 的自动化脚本环境并执行解析任务,自动抓取 8.9.7.29 对应平台的归档构建依赖。解压完成后将其中的 .h 头文件与 .so 核心动态链接库搬运至先前 CUDA 所在的 /usr/local/cuda/ 目录中,并设定安全的全局可读权限。最后调用 ldconfig 将这些深度学习算子库注册到系统中,并清空所有临时编译目录和源码。