0x00 背景

本文讲述如何在 Windows Subsystem for Linux 里跑起一个支持 CUDA 的 docker 容器来的。

CUDA on WSL Overview

我们的工作相当于将上图中的 NVIDIA CUDA 换成了 docker container。

0x01 步骤

0x00 安装 WSL

首先,现在 win11 默认装的 WSL 已经是2.0版本了,所以无需在命令里单独使用 wsl –set-default-version 2 指定2.0版本的 WSL 了。仅使用如下命令即可一键安装 Ubuntu 发行版的 WSL:

1
wsl --install -d Ubuntu

Tips

不用重启 Windows,仅重启 Ubuntu subsystem 的方法:

1
wsl --shutdown

同时,我们可以关闭Windows Subsystem for Linux GUI来降低WSL的CPU占用,以及解决日常高CPU占用、屏幕频繁刷新以及频繁获取失去焦点的bug。可以在%UserProfile%目录下新建一个.wslconfig文件,并写入如下配置:

1
2
[wsl2]
guiApplications=false

搞完以后,重启WSL即可。该文件内的详细配置可参考微软官方文档

0x01 安装 NVIDIA 驱动

首先,你需要在宿主机,也就是 Windows 机器上安装为 WSL 特制的,兼容 GPU 半虚拟化技术(GPU paravirtualization technology)的 NVIDIA 驱动,驱动下载地址:https://developer.nvidia.com/cuda/wsl/download

0x02 安装 Docker

需要注意的一点是,在 WSL 里面不能使用 apt install docker.io 的形式安装 docker,如果你这么做了,你会发现装的这个 docker 压根启动不起来,需要使用如下方式安装 docker:

1
curl https://get.docker.com | sh

安装完成之后,使用如下命令即可启动 docker 服务:

1
service docker start

0x03 安装 NVIDIA Container Toolkit

有了这个才能让之前装的 docker 支持 GPU,否则使用 docker --gpus all 启动容器的时候将会报错:

1
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].

执行如下命令安装 NVIDIA Container Toolkit:

1
2
3
4
5
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
&& curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
&& apt-get update
&& apt-get install -y nvidia-docker2

然后重启 docker:

1
service docker restart

这个时候我们启动一个 GPU container,验证安装是否成功:

1
docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi

如果安装成功了,应该会看到如下输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.00 Driver Version: 510.06 CUDA Version: 11.6 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... On | 00000000:01:00.0 Off | N/A |
| N/A 0C P0 9W / N/A | 134MiB / 4096MiB | N/A Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+