NVIDIA Container Toolkit

在 Windows 上部署的 Docker Linux 开发环境,支持调用 CUDA 与显示 GUI,且 Visual Studio Code 的 Remote 能自动识别 Container。

Requirements

  • Windows 10/11 ≥ Build 18362
  • WSL2 Kernel ≥ 5.10.43.3
  • Windows NVIDIA GPU Driver ≥ 495
  • Docker Desktop ≥ 3.1.0 / Docker ≥ 19.03
  • Visual Studio Code with Extension: Dev Containers

CUDA

Docs: CUDA on WSL User Guide

不需要任何配置,WSL2 内的发行版即可调用 CUDA。

性能损耗参见官方测试:Leveling up CUDA Performance on WSL2 with New Enhancements

Docker

Docs:

可以使用 Docker Desktop,也可以在 WSL2 内的 Linux 发行版上使用 Docker 标准的安装脚本,官方建议使用 Docker Desktop。

Docker Desktop 安装与脚本安装的架构有较大区别,会创建两个 WSL2 发行版 docker-desktop-datadocker-desktop 用来实际存储程序与数据。安装后的 Docker 是独立于其它 Linux 发行版的,能够被其它的发行版访问与调用,数据将不会存储在调用方的存储空间内。其它发行版对 Docker 的调用与安装在自身内时一致。

不需要依照 NVIDIA 的文档安装额外的 nvidia-docker2nvidia-container-toolkit 包,Docker 创建 Container 时支持参数 --gpus all,启用后 Container 能够访问 CUDA。

GUI

Docs:

在 Container 内安装 xvfbx11vnc 实现 GUI 支持,不安装完整桌面可节省资源。Xvfb 是一个 X Server,能够创建虚拟显示器。x11vnc 提供 VNC 服务器。两者均默认前台运行,可以使用多个 Terminal 保持运行,也可以使用 2>&1 &nohup 后台运行。

使用 Visual Studio Code 的 Remote 连接运行中的 Container,Visual Studio Code 会自动将 VNC 服务器端口映射至本地,一般为相同端口号。

运行 Xvfb 创建一个 ID 为 0 的 X Server,-screen 0 960x540x24 创建 ID 为 0 的 960x540 虚拟显示器,色深 24bit。

*注意包 xvfb 的 CLI 为 Xvfb

Xvfb :0 -screen 0 960x540x24

运行 x11vnc 创建 VNC 服务器,显示 ID 为 0 的 X Server 内容,默认监听 0.0.0.0:5900[+ID],且第一个 VNC 连接断开后关闭服务器。-allow 127.0.0.1 限制本地连接,-nevershared 限制单一连接,-forever 使连接中断后不关闭服务器,-timeout 1000 超时 1000s 无连接则关闭服务器。

x11vnc -allow 127.0.0.1 -nevershared -forever -timeout 1000 -display :0

在运行 GUI 程序前,使用环境变量指定 X Server。

export DISPLAY=:0

...

仅在单一 Terminal 内运行,关闭 Terminal 后关闭所有服务器。

Xvfb :0 -screen 0 960x540x24 >/dev/null 2>&1 & x11vnc -allow 127.0.0.1 -nevershared -forever -timeout 100 -display :0 >/dev/null 2>&1 & export DISPLAY=:0

...

随后在 Windows 端用 TigerVNCTightVNC 等访问 localhost 上 Visual Studio Code 自动映射的端口即可。


Header picture:https://github.com/NVIDIA/nvidia-container-toolkit

Last modification:October 15, 2022