【问题标题】:Is GPU pass-through possible with docker for Windows?docker for Windows 是否可以通过 GPU 直通?
【发布时间】:2018-09-10 08:51:16
【问题描述】:

我正在尝试在 Windows 10 的 docker 容器中运行应用程序。

但我无法让 GPU 在 docker 中工作。

我读到它需要“GPU 直通”。

我应该如何解决这个问题?

【问题讨论】:

    标签: docker windows-10 virtualization hyper-v


    【解决方案1】:

    更新(2020 年 12 月) 如果您使用 WSL 2 作为 Docker 的后端,您现在可以在 Windows 上进行 GPU 直通:WSL 2 GPU Support is Here - 这是比运行 Docker 稍微简洁的方法内部 WSL。

    原答案:

    Windows 目前不支持从 Docker 容器内访问 GPU。

    您需要nvidia-docker,但目前仅在 Linux 平台上受支持。使用 Hyper-v 的 GPU 直通需要离散设备分配 (DDA),目前仅在 Windows Server 中,并且 (at least in 2015) 没有计划改变这种情况。因此,NVIDIA 目前没有将nvidia-docker 移植到 Windows。

    这里有更多信息: https://devblogs.nvidia.com/nvidia-docker-gpu-server-application-deployment-made-easy/

    更新(2019 年 10 月)nvidia-docker 已弃用,因为 Docker 19.03 原生支持 NVIDIA GPU。而是安装nvidia-container-runtime,并使用docker run --gpus all 标志。您还可以在 Windows 主机上运行 Windows Containers with GPU acceleration,使用 Docker 19.03,但不能使用 Linux 容器。

    更新(2020 年 8 月):现在在适用于 Linux 的 Windows 子系统 (WSL 2) 中运行 Docker 时,您现在可以进行 GPU 直通了。

    此链接在 WSL 2 中的 Ubuntu 中的 Docker 内安装、设置和运行 TensorFlow Jupyter 笔记本,并支持 GPU: https://ubuntu.com/blog/getting-started-with-cuda-on-ubuntu-on-wsl-2

    注意 - 我自己还没有这样做。

    【讨论】:

    • nvidia-docker 不是类 UNIX 操作系统(或至少在设备是文件的情况下)上 GPU 直通的唯一选项,应该可以使用 --device 标志转发 GPU。一个例子是ROCm container
    • 有一些关于在 Windows Docker 容器中使用 GPU - techcommunity.microsoft.com/t5/Containers/… 但仅适用于 DirectX API 的更新。
    • 我刚刚问了similar question,并被建议使用docker。我的目标略有不同——在 Windows 机器上使用带有 Linux 的 VirtualBox 下的 GPU 加速。从这个答案中,我假设我不能遵循这个建议,但看起来两个问题是相关的
    • @ERJAN 更新答案以反映新路线:在 WSL2 中的 Ubuntu 中运行 Docker,并通过 GPU 传递
    • @erjan 您可以将 TensorFlow 容器替换为不同的容器,这只是一个示例。对于 GPU 支持,您的容器也需要安装 CUDA Toolkit。这个可能是:ngc.nvidia.com/catalog/containers/nvidia:pytorch
    【解决方案2】:

    现在 Windows 10 上的 docker 可以访问 WSL2(自 Windows 10 版本 2004 起),它为 Windows 10 上的 Linux docker 容器的 GPU 支持扫清了道路。

    根据这个官方博客,微软“将在未来几个月内开始在 Windows 10 Insider 版本中预览对 WSL 的 GPU 计算支持”: https://devblogs.microsoft.com/commandline/the-windows-subsystem-for-linux-build-2020-summary/#wsl-gpu

    我希望 Docker GPU 支持很快就会出现。

    更新:

    现在可以在非常特定的情况下在 Windows 中进行 GPU 直通,包括:

    • 容器也必须是 Windows
    • 仅进程级隔离,无 hyper-v
    • 它仅适用于基于 DirectX 的应用程序
    • 对于机器学习,这意味着只有 Microsoft ML 可以工作。

    参考:https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/gpu-acceleration

    更新 2:

    现在可以在最新的 Windows Insider 版本上从 Windows 主机上的 Linux docker 进行 GPU 传递,请参阅:

    https://ubuntu.com/blog/getting-started-with-cuda-on-ubuntu-on-wsl-2

    这可能会在下一次重大更新中流入主流 Windows。

    更新 3:

    确认 Windows 内部版本 2021 将包括用于 WSL 的 GPU 直通。在此处查看公告的详细信息: https://blogs.windows.com/windowsdeveloper/2021/05/25/the-windows-developers-guide-to-microsoft-build-2021/

    【讨论】:

    • 所以可以使用需要 nvidia 驱动程序但仅在特定条件下的烧瓶应用程序运行 docker 容器?
    • 我认为如果 nvidia 驱动程序是标准图形驱动程序,我认为 CUDA 还没有工作。
    • 你能看看这个类似的问题吗? stackoverflow.com/questions/63600436/…
    【解决方案3】:

    2021 年更新答案

    如果您需要从 Windows 10 上的 Linux 容器访问 NVIDIA CUDA,如果您满足(当前)使用 Insider 构建的要求,那么有一种简单的方法可以做到这一点。我使用这种方法成功地在 TensorFlow 2 中的 GPU 上训练模型。

    1. 更新 Windows 10 以构建 20149 或更高版本。在撰写本文时,只有 Insider Dev 分支可以工作——您可以在 Windows Insider webpage* 上查看内部版本号。
    2. 安装NVIDIA CUDA WSL driver(需要免费注册)
    3. 安装Docker Desktop
      • 如果您还没有启用 WSL2,它将指导您完成。
      • 如果您已经安装,请将其更新到最新版本并启用Settings - General - Use the WSL2 backed engine
      • 为了能够从 WSL2 内部(不仅仅是 PowerShell/cmd)使用 docker CLI,请启用 Settings - Resources - WSL INTEGRATION 中的集成。
    4. 使用命令docker run --rm -it --gpus=all nvcr.io/nvidia/k8s/cuda-sample:nbody进行测试

    您需要将--gpus=all 传递给docker run 以使容器能够访问GPU。 (如果您使用 VSCode 远程容器,请将 "runArgs": ["--gpus=all"], 添加到 devcontainer.json。)

    您可能会在用于nvidia-docker 的图像描述中提到--runtime=nvidia(例如official TensorFlow images)。只需在提供的命令中将--runtime=nvidia 替换为--gpus=all

    * 更新:Insider Dev 频道现已移至 Windows 11。目前尚不清楚此功能是否会在稳定版 Windows 10 中使用,还是仍为 Windows 11 独有。

    【讨论】:

    • 这行得通,但只需双启动 PoP OS / 其他 Linux 以用于 ML 的工作量就更少了 + 你可以提高几个 % 的性能
    • @Ron 唯一显着的性能差异是磁盘卷 I/O,这主要可以通过从 WSL 文件系统安装卷来缓解——或者从 Docker 桌面设置启用 CLI 集成并运行 @987654338 @来自 WSL 的命令,或使用 `\\wsl$` 文件系统。
    • 我的理解是否正确,您必须成为 Windows 预览体验计划的成员才能启用此功能?如果是这样,您是否知道在不加入 Insider Program 的情况下获得此访问权限的计划是什么?由于各种原因,我不可能加入这个计划,这就是我问的原因。否则很高兴听到有这样的进展。
    • @Nerxis 您需要安装 Windows 10 build 20149 或更高版本,您可以通过以下任一方式获得:1. 在 Insider 计划中注册 Microsoft 帐户并更新现有安装 2. 从内部 ISO 映像:docs.microsoft.com/en-us/windows-insider/isos 3. 等待几个月的更新才能进入主要发布渠道
    【解决方案4】:

    提供样品!

    ffmpeg -hide_banner -codecs | grep 264
    DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_cuvid ) (encoders: h264_nvenc h264_v4l2m2m nvenc nvenc_h264 )
    

    这表明ffmpeg版本可以处理:h264_nvencnvencnvenc_h264

    ffmpeg -i video.mp4 -vf scale=iw/2:ih/2 -vcodec h264_nvenc "video_2.mp4"
    

    在我的 WSL2/Insider 上,我收到一条消息,指出我没有安装正确的 nvidia 驱动程序。因为驱动安装在windows操作系统的下方。

    与 Microsoft NVIDIA 的查询结果表明硬件加速没有通过,他们近期也没有这样做的计划。

    windows 操作系统上的 Windows docker,可能没问题。会检查的。

    【讨论】:

      【解决方案5】:

      请注意,在 WSL2/windows-Insider 实现中不支持视频解码编码的硬件加速

      因此,任何 GPU 功能都可以在 WSL2 上几乎不受限制地使用,但视频编解码不能由硬件完成。

      尝试让 ffmpeg 使用硬件加速会导致错误消息。 (skvideo,它是一个 ffmpeg 包装器,崩溃

      还不确定 gStreamer。但可以肯定的是,它不能使用硬件加速,因为它不是通过接口“汇集”的。

      据我所知 - 目前没有计划添加支持。

      最好, 米奇

      【讨论】:

      • 这个答案不仅没有帮助,而且也不正确,因为接受的答案表明它可以通过 GPU 直通来完成。
      • 见我上面的第二篇文章。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 2018-08-24
      • 2017-03-19
      相关资源
      最近更新 更多