Win10 Docker 通过 WSL 2 使用 GPU
date
Aug 14, 2021
slug
win10-docker-wsl2-gpu
status
Published
tags
WSL2
Env.Config
Docker
summary
type
Post
2022年3月28日更新
该教程可能已经 outdated
0. 准备工作
- 编译好的 WSL 2 内核,点击下载
- Windows 10 内测版(21354版本号)镜像,官方下载链接
1. 升级 Windows 10 内测版(21354版本号)
- 打开
Windows10_InsiderPreview_Client_x64_zh-cn_21354.iso
Windows 10 内测版(21354版本号)镜像,双击setup.exe
;

- 选择
下一步
,等待一段时间出现右图,选择接受
;


- 等待其获取更新,出现如下界面,选择
保留个人文件和应用
(确保本机文件不会被清空)后,选择安装
即可完成升级 Windows 10 内测版(21354版本号)。

2. 安装 WSL 2
该部分教程有一部分来源于 https://docs.microsoft.com/en-us/windows/wsl/install-win10,若本教程滞后时,建议参考 Microsoft 官方安装 WSL 2 教程。
- 以管理员身份打开
Windows PowerShell
,输入以下代码并回车;
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
- 输入以下代码并回车;
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
- 重启系统;
- 通过x64 机器内核升级包链接下载并升级
WSL
内核,如果是arm64
架构机器,请通过 arm64 机器内核升级包链接下载;(若链接失效,请通过官方 WSL 2 教程指导进行安装)(2021年8月11日默认安装的版本为 v5.10.*)
- 以管理员身份打开
Windows PowerShell
,并输入以下代码将WSL 1
升级至WSL 2
;
wsl --set-default-version 2
- 通过 Windows 自带
Microsoft Store
应用,搜索并下载Ubuntu 18.04
系统;

- 通过 Windows 自带
Microsoft Store
应用,搜索并下载Windows Terminal
app,打开Windows Terminal
app 可以看到Windows PowerShell
和此前已安装好的Ubuntu 18.04
系统,可该应用访问Ubuntu 18.04
系统的终端;(推荐安装)


- 打开
Windows PowerShell
,输入以下代码查看Ubuntu 18.04
子系统 WSL Version 是否为 2。若为 2,WSL 2
安装成功,否则(也就是 WSL Version 为 1),根据步骤 9 进行操作,将其升级为 2;
wsl --list -v

- 升级子系统 WSL Version。在
Windows PowerShell
中输入wsl --shutdown
并回车,将子系统关闭;再通过参考以下代码升级子系统版本。
wsl --set-version <distribution name> <versionNumber>
<distribution name>
即使用 wsl --list -v
中所列出的子系统名字, <versionNumber>
即 WSL 版本号,指定为 2 即可。首次打开
Ubuntu 18.04
子系统时,会要求创建用户名并初始化密码。3. WSL 2 内核降级
- 首先通过
Windows PowerShell
打开Ubuntu-18.04
子系统,输入uname -r
查看内核版本;
若版本号为 5.10 开头,则需要进行内核版本降级,因为 Windows 10 内测版 21354版本号与该内核版本不兼容,导致 GPU 无法正常使用,输入
nvidia-smi
命令时会报错:
Failed to initialize NVML: GPU access blocked by the operating system
Failed to properly shut down NVML: GPU access blocked by the operating system。
参考链接:
1. https://forums.developer.nvidia.com/t/failed-to-initialize-nvml-gpu-access-blocked-by-the-operating-system/174610
2. Windows 10 内测版 21359 版本修复了该问题
因此需要降级 5.10.* 版本到 5.4.*- 使用我提前编译好的 x86 内核替换
C:\WINDOWS\System32\lxss\tools
中的kernel
,替换前请备份!并更改名字为kernel
- 替换后重启,再次通过步骤 1 检查内核版本,输入
nvidia-smi
也表现正常。
WSL 2 内核的编译指南请查看往期文章,点击跳转
4. 为 WSL 2 安装 CUDA 驱动
该部分教程有一部分来源于 https://docs.nvidia.com/cuda/archive/11.3.1/wsl-user-guide/index.html#running-cuda,本教程采用了英伟达官方 11.3.1 版本的 cuda 安装教程(以 Ubuntu 18.04 为例)。而从 11.4 开始,其教程修改为以 Ubuntu 20.04 为例(可能存在不一致的地方)。
- 打开 CUDA on WSL 英伟达官方下载链接,这里提供了
GEFORCE
和QUADRO
两种系列显卡的驱动。本次安装以GeForce GTX 1080 Ti
显卡为例,其属于GEFORCE
系列,因此选择前者进行下载并安装;

- 安装过程默认选择确定(OK)或下一步(NEXT)即可;
- 通过
Windows Terminal
打开Ubuntu 18.04
子系统终端,依次输入以下代码添加 CUDA 安装库;
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo sh -c 'echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/cuda.list'
sudo apt-get update
- 输入以下代码安装 CUDA 11.0,可通过修改版本号安装其他版本,格式为
cuda-toolkit-<version>
,该过程耗时较久。
sudo apt-get install -y cuda-toolkit-11-0
请不要在 WSL 2 子系统下安装
cuda
、 cuda-11-0
、或 cuda-drivers
包,因为这些包会在 WSL 2 上安装 Linux 的 NVIDIA 驱动,而 WSL 2 只需要安装 cuda-toolkit
。5. 配置 Docker 使用 WSL 2
该部分的主要目的是使得 Docker 容器可以通过 WSL 2 访问 GPU 功能。
- 首先安装 Docker Desktop。打开 Docker Desktop for Windows 下载链接,点击
Download for Windows
下载 Docker Desktop 安装包并双击安装即可;

- 打开
Docker Desktop
设置中的General
,开启Use the WSL 2 based engine
,如需通过 Docker API 调用容器中的代码,则需要开启Expose daemon on tcp://localhost:2375 without TLS
功能;

- 打开
Docker Desktop
设置中的Resources
,选中WSL INTEGRATION
,再选中Enable integration with my default WSL distro
和Ubuntu-18.04
即可使得后续 Docker 容器可以通过 WSL 2 访问 GPU。

收工~