【发布时间】:2018-09-10 08:51:16
【问题描述】:
我正在尝试在 Windows 10 的 docker 容器中运行应用程序。
但我无法让 GPU 在 docker 中工作。
我读到它需要“GPU 直通”。
我应该如何解决这个问题?
【问题讨论】:
标签: docker windows-10 virtualization hyper-v
我正在尝试在 Windows 10 的 docker 容器中运行应用程序。
但我无法让 GPU 在 docker 中工作。
我读到它需要“GPU 直通”。
我应该如何解决这个问题?
【问题讨论】:
标签: docker windows-10 virtualization hyper-v
更新(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 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 直通,包括:
参考: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/
【讨论】:
如果您需要从 Windows 10 上的 Linux 容器访问 NVIDIA CUDA,如果您满足(当前)使用 Insider 构建的要求,那么有一种简单的方法可以做到这一点。我使用这种方法成功地在 TensorFlow 2 中的 GPU 上训练模型。
Settings - General - Use the WSL2 backed engine。docker CLI,请启用 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 的图像描述中提到--runtime=nvidia(例如official TensorFlow images)。只需在提供的命令中将--runtime=nvidia 替换为--gpus=all。
* 更新:Insider Dev 频道现已移至 Windows 11。目前尚不清楚此功能是否会在稳定版 Windows 10 中使用,还是仍为 Windows 11 独有。
【讨论】:
提供样品!
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,可能没问题。会检查的。
【讨论】:
请注意,在 WSL2/windows-Insider 实现中不支持视频解码编码的硬件加速。
因此,任何 GPU 功能都可以在 WSL2 上几乎不受限制地使用,但视频编解码不能由硬件完成。
尝试让 ffmpeg 使用硬件加速会导致错误消息。 (skvideo,它是一个 ffmpeg 包装器,崩溃)
还不确定 gStreamer。但可以肯定的是,它不能使用硬件加速,因为它不是通过接口“汇集”的。
据我所知 - 目前没有计划添加支持。
最好, 米奇
【讨论】: