使用CUDA运行时构建Docker镜像

5

我正在创建一个需要测试GPU可用性的镜像。同时,GPU容器运行良好:

$ docker run --rm --runtime=nvidia nvidia/cuda:9.2-devel-ubuntu18.04 nvidia-smi
Wed Aug  7 07:53:25 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 396.54                 Driver Version: 396.54                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  TITAN X (Pascal)    Off  | 00000000:04:00.0 Off |                  N/A |
| 24%   43C    P8    17W / 250W |   2607MiB / 12196MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

但在使用GPU构建时失败:

$ cat Dockerfile
FROM nvidia/cuda:9.2-devel-ubuntu18.04

RUN nvidia-smi
# RUN build something
# RUN tests require GPU

$ docker build .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nvidia/cuda:9.2-devel-ubuntu18.04
 ---> cdf6d16df818
Step 2/2 : RUN nvidia-smi
 ---> Running in 88f12f9dd7a5
/bin/sh: 1: nvidia-smi: not found
The command '/bin/sh -c nvidia-smi' returned a non-zero code: 127

我是docker的新手,但我认为在构建镜像时需要进行检查。那么我该如何使用cuda运行时构建docker镜像呢?


错误127表示命令未找到。因此,您没有安装或可用nvidia-smi。 - talonmies
@talonmies 我可以在主机和 Docker 容器中运行 nvidia-smi。只有在构建 Docker 镜像时才会失败。 - zingdle
因此,在Docker构建过程中,您无法使用nvidia-smi。 - talonmies
@talonmies 是的。我尝试在构建时添加 --runtime=nvidia,但没有成功。 - zingdle
3个回答

6

使用--default-runtime=nvidia配置Docker守护进程解决了问题。

更多信息,请参见此Wiki页面


1
对于 Docker >= 19.03 的更新答案,请参见此问题:https://dev59.com/OlIH5IYBdhLWcg3wa9to - RunOrVeith
值得注意的是,如果您不想修改docker守护进程的参数,可以将“--runtime=nvidia”传递给您的“docker run”命令。 - Ethan
@Ethan nvidia-docker已经被弃用。从Docker 19.03开始应该使用--gpus [all|num|dev],就像@RunOrVeith所说的那样。有关更多信息,请参见此答案中的评论。 - Matt Popovich

0

今天(2023年3月27日),我在构建带有CUDA运行时的Docker镜像时遇到了另一个问题。

尽管配置了正确的NVIDIA运行时,但我的docker build .docker-compose命令无法访问CUDA。

我通过禁用新的docker build kit来解决了这个问题:

DOCKER_BUILDKIT=0 docker build .

或者

DOCKER_BUILDKIT=0 docker-compose build

您还可以通过修改/etc/docker/daemon.json来永久禁用新的 Docker 构建工具,添加以下内容:

{
  "features": {
    "buildkit" : true
  }
} 

看起来新的Docker构建工具在处理CUDA和GPU方面存在一些问题,所以如果您正在使用它,请查看我的解决方案。


-1
也许是因为您在Dockerfile上使用了“RUN”命令。我建议尝试使用“CMD”(请参阅此命令的文档)或“ENTRYPOINT”,以便使用参数调用“docker run”。我认为,“RUN”命令是为之前需要执行的作业而设计的,而不是具有输出和其他特性的进程。
祝你好运,

实际上,我是在构建镜像时运行测试,而不是在容器可用后运行。这些测试确保构建的二进制文件是正确的。 - zingdle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接