对于 Windows,docker 是否可以实现 GPU 直通?

Is GPU pass-through possible with docker for Windows?

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

但我无法让 GPU 在 docker 内部工作。

我读到它需要 "GPU Pass-through."

我该如何解决这个问题?

更新(2020 年 12 月) 如果您使用 WSL 2 作为 Docker 的后端,您现在可以在 Windows 上进行 GPU 直通: WSL 2 GPU Support is Here - 这是一种比 运行ning Docker inside WSL.

稍微简洁的方法

原回答:

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

您需要 nvidia-docker,但目前仅 Linux 平台支持。 Hyper-v 的 GPU 直通需要离散设备分配 (DDA),目前仅在 Windows 服务器中,并且 (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 Containers with GPU acceleration 在 Windows 主机上,使用 Docker 19.03,而不是 Linux 容器。

更新(2020 年 8 月):当 运行ning Docker 在 Windows Linux (WSL 2) 的子系统。

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

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

现在 Windows 10 上的 docker 可以访问 WSL2(从 Windows 10 2004 版开始)它已经为 Linux 的 GPU 支持扫清了道路 docker 集装箱 Windows 10.

根据此官方博客,MS“将在接下来的几个月内在 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

更新二:

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

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/

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

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

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

还不确定 gStreamer。但可以肯定的是,它不能使用硬件加速,因为它不是通过界面“漏斗”的。

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

最好的, 米奇

提供样本!

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_nvenc nvenc nvenc_h264

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

在我的 WSL2/Insider 上,我收到一条消息,提示我没有安装正确的 nvidia 驱动程序。因为驱动安装在windowsOS.

下面

向 Microsoft NVIDIA 询问后发现硬件加速没有通过,他们近期也没有这样做的计划。

Windows docker 在寡妇 os 上,可能没问题。会检查的。

2021 年更新的答案

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

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

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

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

* 更新:Insider Dev 频道现已移至 Windows 11。目前尚不清楚此功能是否会达到稳定 Windows 10,或保持独占 Windows11.