Pycharm 使用 docker 和 GPU 进行调试

Pycharm debugging using docker with GPUs

目标:

为了在 PyCharm 中调试 Python 应用程序,我将解释器设置为自定义 docker 图像,使用 Tensorflow,因此需要 GPU。据我所知,问题是 PyCharm 的 命令构建 没有提供发现可用 GPU 的方法。

终端 - 有效:

使用以下命令输入容器,指定要提供的 GPU (--gpus):

docker run -it --rm --gpus=all --entrypoint="/bin/bash" 3b6d609a5189        # image has an entrypoint, so I overwrite it

在容器内,我可以 运行 nvidia-smi 查看是否找到了 GPU,并确认 Tensorflow 找到了它,使用:

from tensorflow.python.client import device_lib
device_lib.list_local_devices()
# physical_device_desc: "device: 0, name: Quadro P2000, pci bus id: 0000:01:00.0, compute capability: 6.1"]

如果我不使用 --gpus 标志,则不会像预期的那样发现任何 GPU。 注意:使用 docker 版本 19.03 及更高版本,Nvidia 运行 次是本机支持的,因此不需要 nvidia-docker 以及 docker-运行参数 --runtime=nvidia 也已弃用。 Relevant thread.

PyCharm - 它不起作用

这是 运行 的配置:

(我意识到其中一些路径可能看起来不正确,但目前这不是问题)

我将解释器设置为指向相同的 docker 图像和 运行 Python 脚本,将自定义 LD_LIBRARY_PATH 设置为 [=116] 的参数=] 匹配 libcuda.so 在 docker 图像中 located 的位置(我在 运行ning 容器中以交互方式找到它),但仍然没有找到设备:

错误消息显示可以加载 CUDA 库(即在 LD_LIBRARY_PATH 上找到),但仍未找到设备。这就是为什么我认为必须在某处设置 docker 运行 参数 --gpus=all 的原因。我在 PyCharm.

中找不到这样做的方法

我尝试过的其他事情:

  1. 在 PyCharm 中,使用 Docker 执行模板配置(而不是 Python 模板),其中可以指定 运行 参数,所以我希望通过 --gpus=all,但那些选项的解析器似乎不支持:

  1. 我试图通过在 /etc/docker/daemon.json 中包含以下配置,将 docker 守护程序中的默认 运行 时间设置为 nvidia
{
    "runtimes": {
        "nvidia": {
            "runtimeArgs": ["gpus=all"]
        }
    }
}

不过,我不确定此格式是否正确。我已经尝试了上述的几个变体,但没有任何一个可以识别 GPU。上面的示例至少可以被解析并允许我重新启动 docker 守护程序而不会出错。

  1. 我在官方 Tensorflow docker 图像中注意到,他们安装了一个名为 nvinfer-runtime-trt-repo-ubuntu1804-5.0.2-ga-cuda10.0 的包(通过 apt install),这听起来是个很棒的工具,尽管似乎只适用于 TensorRT。我将它添加到我的 Docker 文件中作为在黑暗中拍摄的照片,但不幸的是它没有解决问题。

  2. 在PyCharm配置的环境变量中添加NVIDIA_VISIBLE_DEVICES=all等,没有成功。

我正在使用 Python 3.6、PyCharm Professional 2019.3 和 Docker 19.03。

原来 attempt 2. 在我 post 的 "Other things I tried" 部分是正确的方向,并且使用以下允许 PyCharm 的远程解释器(docker 图像)定位 GPU,就像终端能够做到的那样。

我在 /etc/docker/daemon.json 中添加了以下内容:

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

保存文件后还需要重启docker服务:

sudo service docker restart

注意:这会杀死系统上的所有 运行 docker 容器

Docker GPU 支持现已在 PyCharm 2020.2 中可用,没有全局 default-runtime。 只需在 configuration window.

的 'Docker container settings' 部分下设置 --gpus all

如果 no NVIDIA GPU device is present: /dev/nvidia0 does not exist 错误仍然出现,请确保取消选中 Run with Python Console,因为它仍然无法正常工作。

查看 Michał De 的回答,它有效。但是,交互式控制台仍然损坏。对于一些 docker inspect,我发现使用选项 Run with Python Console 会覆盖 docker 配置,忽略提供的选项 --gpus all。我无法忍受这样的生活质量损失,并强迫 pycharm 使用 docker-compose.

玩得很好

看哪,解决方法。


1.如何在 Tensorflow

中测试 GPU
import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))

应该return像

[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

2。确保你有一个简单的 docker 容器可以工作

docker pull tensorflow/tensorflow:latest-gpu-jupyter
docker run --gpus all -it tensorflow/tensorflow:latest-gpu-jupyter python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"

最后一张打印件应如步骤 1 中所述。否则请参阅 nvidia guide or tensorflow guide


3。创建一个 compose 文件并测试它

version: '3'
# ^ fixes another pycharm bug
services:
  test:
    image: tensorflow/tensorflow:latest-gpu-jupyter  
    # ^ or your own
    command: python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"  
    # ^ irrelevant, will be overwridden by pycharm, but usefull for testing
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
docker-compose --file your_compose_file up

同样,您应该会看到与步骤 1 中所述相同的输出。鉴于步骤 2 已成功,这应该不会令人感到意外。


4。在 pycharm

中将此 compose 设置为解释器
  • 配置文件:your_compose_file
  • 服务:测试(它只是工作,但你可以有更多 fun


5.在 运行 启用 GPU docker.

的同时享受您的交互式控制台