在本地构建CUDA 10.x的Docker镜像
首先
通过查看https://hub.docker.com/r/nvidia/cuda,可以看到已删除了已过期的CUDA版本的Docker镜像。然而,在网络上的公开实现中,可能会使用CUDA 10.x系列的Docker镜像,这给进行这些操作时带来了困扰。
由于幸运的是,Docker镜像创建环境已经在https://gitlab.com/nvidia/container-images/cuda上公开,因此在这里我们尝试在本地构建以下的Docker镜像。
-
- nvidia/cuda:10.2-base-ubuntu18.04
-
- nvidia/cuda:10.2-runtime-ubuntu18.04
-
- nvidia/cuda:10.2-devel-ubuntu18.04
- nvidia/cuda:10.2-cudnn8-devel-ubuntu18.04
同时,这次尝试的Docker镜像的目标CPU架构将设定为x86_64(aarch64尚未验证)。
【2023/10/14追記】在https://qiita.com/dandelion1124/items/31a3452b05510097daa0#comment-d91729d962b247d4378e的评论中,我收到消息说NGC的目录 (https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda)里有旧版的CUDA图像。
2. 確認操作所需的環境
我已经在以下环境中进行了操作确认。
-
- OS: Ubuntu 22.04
-
- Docker Engine: 23.0.4
-
- nvidia-container-toolkit: 1.13.2
- NVIDIA driver: 530.30.02
创建支持CUDA的Docker镜像。
首先,我们要构建一个带有CUDA的Docker镜像。首先,我们要克隆Git仓库。
git clone https://gitlab.com/nvidia/container-images/cuda.git
由于出现了https://gitlab.com/nvidia/container-images/cuda/-/issues/213上的问题,因此我将在构建脚本(build.sh)中进行以下更改,以避免出现这个问题。
- run_cmd docker buildx build --pull ${LOAD_ARG} ${PUSH_ARG} ${PLATFORM_ARG} \
+ run_cmd docker build ${LOAD_ARG} ${PUSH_ARG} ${PLATFORM_ARG} \
-t "${IMAGE_NAME}:${CUDA_VERSION}-base-${OS}${OS_VERSION}${IMAGE_SUFFIX:+-${IMAGE_SUFFIX}}" \
"${BASE_PATH}/${OS_PATH_NAME}/base"
- run_cmd docker buildx build --pull ${LOAD_ARG} ${PUSH_ARG} ${PLATFORM_ARG} \
+ run_cmd docker build ${LOAD_ARG} ${PUSH_ARG} ${PLATFORM_ARG} \
-t "${IMAGE_NAME}:${CUDA_VERSION}-runtime-${OS}${OS_VERSION}${IMAGE_SUFFIX:+-${IMAGE_SUFFIX}}" \
--build-arg "IMAGE_NAME=${IMAGE_NAME}" \
"${BASE_PATH}/${OS_PATH_NAME}/runtime"
- run_cmd docker buildx build --pull ${LOAD_ARG} ${PUSH_ARG} ${PLATFORM_ARG} \
+ run_cmd docker build ${LOAD_ARG} ${PUSH_ARG} ${PLATFORM_ARG} \
-t "${IMAGE_NAME}:${CUDA_VERSION}-devel-${OS}${OS_VERSION}${IMAGE_SUFFIX:+-${IMAGE_SUFFIX}}" \
--build-arg "IMAGE_NAME=${IMAGE_NAME}" \
另外,由于在https://gitlab.com/nvidia/container-images/cuda/-/commit/5d080f35a0e9324007c3b007539afe47f2da5c84提交中,已将过时的CUDA版本文件移动到dist/end-of-life目录中,所以需要将其复制到dist目录中。
cp -r dist/end-of-life/10.2 dist/
因为我们已经准备好了,所以使用构建脚本(build.sh)来构建Docker镜像。
./build.sh -d --image-name nvidia/cuda --cuda-version 10.2 --os ubuntu --os-version 18.04 --arch x86_64 --load
如果正常运行,将生成以下的Docker镜像。
-
- nvidia/cuda:10.2-base-ubuntu18.04
-
- nvidia/cuda:10.2-runtime-ubuntu18.04
- nvidia/cuda:10.2-devel-ubuntu18.04
使用CUDA和cuDNN创建Docker镜像。
以下是用CUDA和cuDNN创建Docker镜像的前提下的指导。请访问https://gitlab.com/nvidia/container-images/cuda/-/issues/210#note_1469139165。
我们的构建脚本目前不支持cudnn。
据说,当前的构建脚本(build.sh)似乎没有处理cuDNN。因此,我们将使用存储库中的Dockerfile来进行处理。
cd dist/10.2/ubuntu1804/devel/cudnn8
docker build -t nvidia/cuda:10.2-cudnn8-devel-ubuntu18.04 --build-arg IMAGE_NAME=nvidia/cuda --build-arg TARGETARCH=amd64 .
当程序正常执行,将生成以下的Docker镜像。
- nvidia/cuda:10.2-cudnn8-devel-ubuntu18.04