在 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 WSL 2 backend
- Get started with Docker remote containers on WSL 2
- Introducing the Docker Desktop WSL 2 Backend
可以使用 Docker Desktop,也可以在 WSL2 内的 Linux 发行版上使用 Docker 标准的安装脚本,官方建议使用 Docker Desktop。
Docker Desktop 安装与脚本安装的架构有较大区别,会创建两个 WSL2 发行版 docker-desktop-data
和 docker-desktop
用来实际存储程序与数据。安装后的 Docker 是独立于其它 Linux 发行版的,能够被其它的发行版访问与调用,数据将不会存储在调用方的存储空间内。其它发行版对 Docker 的调用与安装在自身内时一致。
不需要依照 NVIDIA 的文档安装额外的 nvidia-docker2
、nvidia-container-toolkit
包,Docker 创建 Container 时支持参数 --gpus all
,启用后 Container 能够访问 CUDA。
GUI
Docs:
在 Container 内安装 xvfb
和 x11vnc
实现 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 端用 TigerVNC、TightVNC 等访问 localhost
上 Visual Studio Code 自动映射的端口即可。
Header picture:https://github.com/NVIDIA/nvidia-container-toolkit