对于 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 上成功训练了模型。
- 更新 Windows 10 以构建 20149 或更高版本。在撰写本文时,只有 Insider Dev 分支可以工作——您可以在 Windows Insider webpage*.
上查看内部版本号
- 安装 NVIDIA CUDA WSL driver (需要免费注册)
- 安装Docker Desktop
- 它将指导您完成启用 WSL2(如果您尚未启用)。
- 如果您已经安装了它,请将其更新到最新版本并启用
Settings - General - Use the WSL2 backed engine
。
- 为了能够从 WSL2 内部使用
docker
CLI(而不仅仅是从 PowerShell/cmd),在 Settings - Resources - WSL INTEGRATION
. 中启用集成
- 使用命令
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
的图像(例如 official TensorFlow images)时看到提到 --runtime=nvidia
。只需在提供的命令中将 --runtime=nvidia
替换为 --gpus=all
。
* 更新:Insider Dev 频道现已移至 Windows 11。目前尚不清楚此功能是否会达到稳定 Windows 10,或保持独占 Windows11.
我正在尝试 运行 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 上成功训练了模型。
- 更新 Windows 10 以构建 20149 或更高版本。在撰写本文时,只有 Insider Dev 分支可以工作——您可以在 Windows Insider webpage*. 上查看内部版本号
- 安装 NVIDIA CUDA WSL driver (需要免费注册)
- 安装Docker Desktop
- 它将指导您完成启用 WSL2(如果您尚未启用)。
- 如果您已经安装了它,请将其更新到最新版本并启用
Settings - General - Use the WSL2 backed engine
。 - 为了能够从 WSL2 内部使用
docker
CLI(而不仅仅是从 PowerShell/cmd),在Settings - Resources - WSL INTEGRATION
. 中启用集成
- 使用命令
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
的图像(例如 official TensorFlow images)时看到提到 --runtime=nvidia
。只需在提供的命令中将 --runtime=nvidia
替换为 --gpus=all
。
* 更新:Insider Dev 频道现已移至 Windows 11。目前尚不清楚此功能是否会达到稳定 Windows 10,或保持独占 Windows11.