如何使Docker能够识别NVIDIA驱动程序?

22

我有一个装载了Pytorch模型的容器。每次尝试启动它时,都会收到以下错误:

Traceback (most recent call last):
  File "server/start.py", line 166, in <module>
    start()
  File "server/start.py", line 94, in start
    app.register_blueprint(create_api(), url_prefix="/api/1")
  File "/usr/local/src/skiff/app/server/server/api.py", line 30, in create_api
    atomic_demo_model = DemoModel(model_filepath, comet_dir)
  File "/usr/local/src/comet/comet/comet/interactive/atomic_demo.py", line 69, in __init__
    model = interactive.make_model(opt, n_vocab, n_ctx, state_dict)
  File "/usr/local/src/comet/comet/comet/interactive/functions.py", line 98, in make_model
    model.to(cfg.device)
  File "/usr/local/lib/python3.7/site-packages/torch/nn/modules/module.py", line 381, in to
    return self._apply(convert)
  File "/usr/local/lib/python3.7/site-packages/torch/nn/modules/module.py", line 187, in _apply
    module._apply(fn)
  File "/usr/local/lib/python3.7/site-packages/torch/nn/modules/module.py", line 187, in _apply
    module._apply(fn)
  File "/usr/local/lib/python3.7/site-packages/torch/nn/modules/module.py", line 193, in _apply
    param.data = fn(param.data)
  File "/usr/local/lib/python3.7/site-packages/torch/nn/modules/module.py", line 379, in convert
    return t.to(device, dtype if t.is_floating_point() else None, non_blocking)
  File "/usr/local/lib/python3.7/site-packages/torch/cuda/__init__.py", line 161, in _lazy_init
    _check_driver()
  File "/usr/local/lib/python3.7/site-packages/torch/cuda/__init__.py", line 82, in _check_driver
    http://www.nvidia.com/Download/index.aspx""")
AssertionError:
Found no NVIDIA driver on your system. Please check that you
have an NVIDIA GPU and installed a driver from
http://www.nvidia.com/Download/index.aspx

我知道nvidia-docker2正在运行。

$ docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
Tue Jul 16 22:09:40 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.39       Driver Version: 418.39       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 208...  Off  | 00000000:1A:00.0 Off |                  N/A |
|  0%   44C    P0    72W / 260W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce RTX 208...  Off  | 00000000:1B:00.0 Off |                  N/A |
|  0%   44C    P0    66W / 260W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  GeForce RTX 208...  Off  | 00000000:1E:00.0 Off |                  N/A |
|  0%   44C    P0    48W / 260W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  GeForce RTX 208...  Off  | 00000000:3E:00.0 Off |                  N/A |
|  0%   41C    P0    54W / 260W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   4  GeForce RTX 208...  Off  | 00000000:3F:00.0 Off |                  N/A |
|  0%   42C    P0    48W / 260W |      0MiB / 10989MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
|   5  GeForce RTX 208...  Off  | 00000000:41:00.0 Off |                  N/A |
|  0%   42C    P0     1W / 260W |      0MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

然而,我一直都在遇到上述错误。

我尝试过以下方法:

  1. /etc/docker/daemon.json 中设置 "default-runtime": nvidia

  2. 使用 docker run --runtime=nvidia <IMAGE_ID>

  3. 在我的 Dockerfile 中添加以下变量:

ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility
LABEL com.nvidia.volumes.needed="nvidia_driver"

我希望这个容器能够正常运行 - 我们在生产环境中有一个可以工作且没有这些问题的版本。而且我知道Docker可以找到驱动程序,因为上面的输出显示了。任何想法?



你能给我们展示相应的Dockerfile吗? - Rex Low
你顺便安装了nvidia-smi命令吗? 我的配置json{     "runtimes": {         "nvidia": {             "path": "nvidia-container-runtime",             "runtimeArgs": []         }     } } - Alsushi
5个回答

10

我遇到了相同的错误。尝试了许多解决方案后,我发现以下方法可以解决问题。

docker run -ti --runtime=nvidia -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all <image_name>

9
为了让Docker使用主机GPU驱动程序和GPU,需要进行一些步骤:
  • 确保在主机系统上安装了Nvidia驱动程序
  • 按照这里的说明设置Nvidia容器工具包
  • 确保在镜像中已安装cuda、cudnn
  • 使用--gpus标志运行容器(如上面的链接中所述)
我猜您已经完成了前三个步骤,因为nvidia-docker2正在运行。所以既然您在运行命令中没有使用--gpus标志,这可能就是问题所在。
我通常使用以下命令运行我的容器:
docker run --name <container_name> --gpus all -it <image_name>

-it 表示容器是交互式的,可以启动一个 bash 环境。


2

对我来说,我是从一个基于普通的 ubuntu 基础 Docker 镜像运行的,即:

FROM ubuntu

使用 Nvidia 提供的 Docker 基础镜像解决了我的问题:
FROM nvidia/cuda:11.2.1-runtime-ubuntu20.04

2

如果您正在使用 GPU 强化的 AWS EC2 机器运行解决方案,并且使用 EKS 优化加速 AMI,就像我们的情况一样,那么您不需要自己设置运行时为 nvidia,因为这是加速 AMI 的默认运行时。可以通过检查 /etc/systemd/system/docker.service.d/nvidia-docker-dropin.conf 来验证相同的内容。

  • ssh 进入 AWS 机器
  • cat /etc/systemd/system/docker.service.d/nvidia-docker-dropin.conf

所需的全部工作只是设置这两个环境变量,正如 Chirag 在上面的 answerhere(Nvidia 容器工具包用户指南)中建议的那样。

  • -e NVIDIA_DRIVER_CAPABILITIES=compute,utility-e NVIDIA_DRIVER_CAPABILITIES=all
  • -e NVIDIA_VISIBLE_DEVICES=all

在找到最终解决方案之前,我还尝试在daemon.json中设置运行时。首先,我们使用的 AMI 没有daemon.json文件,而是包含一个key.json文件。尝试在这两个文件中设置运行时,但重新启动 Docker 时总是会覆盖key.json中的更改或者直接删除daemon.json文件。


0

只需使用"docker run --gpus all",添加"--gpus all"或"--gpus 0"!


你的回答可以通过添加更多支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Ethan
谢谢,这个答案让我避免了脑抽 :) - zb'

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