Win10 Docker 通过 WSL 2 使用 GPU

date
Aug 14, 2021
slug
win10-docker-wsl2-gpu
status
Published
tags
WSL 2
Environment Installation
Docker
summary
type
Post

0. 准备工作

 

1. 升级 Windows 10 内测版(21354版本号)

  1. 打开 Windows10_InsiderPreview_Client_x64_zh-cn_21354.iso Windows 10 内测版(21354版本号)镜像,双击 setup.exe;
    1. notion image
  1. 选择 下一步,等待一段时间出现右图,选择 接受;
    1. notion image
      notion image
  1. 等待其获取更新,出现如下界面,选择 保留个人文件和应用(确保本机文件不会被清空)后,选择 安装 即可完成升级 Windows 10 内测版(21354版本号)。
    1. notion image
 

2. 安装 WSL 2

👨🏻‍💻
该部分教程有一部分来源于 https://docs.microsoft.com/en-us/windows/wsl/install-win10,若本教程滞后时,建议参考 Microsoft 官方安装 WSL 2 教程。
  1. 以管理员身份打开 Windows PowerShell,输入以下代码并回车;
    1. dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  1. 输入以下代码并回车;
    1. dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  1. 重启系统;
  1. 通过x64 机器内核升级包链接下载并升级 WSL 内核,如果是 arm64 架构机器,请通过 arm64 机器内核升级包链接下载;(若链接失效,请通过官方 WSL 2 教程指导进行安装)(2021年8月11日默认安装的版本为 v5.10.*)
  1. 以管理员身份打开 Windows PowerShell,并输入以下代码将 WSL 1 升级至 WSL 2;
    1. wsl --set-default-version 2
  1. 通过 Windows 自带 Microsoft Store 应用,搜索并下载 Ubuntu 18.04 系统;
    1. notion image
  1. 通过 Windows 自带 Microsoft Store 应用,搜索并下载 Windows Terminal app,打开 Windows Terminal app 可以看到 Windows PowerShell 和此前已安装好的 Ubuntu 18.04 系统,可该应用访问 Ubuntu 18.04 系统的终端;(推荐安装)
    1. notion image
      notion image
  1. 打开 Windows PowerShell,输入以下代码查看 Ubuntu 18.04 子系统 WSL Version 是否为 2。若为 2, WSL 2 安装成功,否则(也就是 WSL Version 为 1),根据步骤 9 进行操作,将其升级为 2;
    1. wsl --list -v
      notion image
  1. 升级子系统 WSL Version。在 Windows PowerShell 中输入 wsl --shutdown 并回车,将子系统关闭;再通过参考以下代码升级子系统版本。
    1. wsl --set-version <distribution name> <versionNumber>
      <distribution name> 即使用 wsl --list -v 中所列出的子系统名字, <versionNumber> 即 WSL 版本号,指定为 2 即可。
      👨🏻‍💻
      首次打开 Ubuntu 18.04 子系统时,会要求创建用户名并初始化密码。
 

3. WSL 2 内核降级

  1. 首先通过 Windows PowerShell 打开 Ubuntu-18.04 子系统,输入 uname -r 查看内核版本;
    1. ⚠️
      若版本号为 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.*
  1. 使用我提前编译好的 x86 内核替换 C:\WINDOWS\System32\lxss\tools 中的 kernel,替换前请备份!并更改名字为 kernel
  1. 替换后重启,再次通过步骤 1 检查内核版本,输入 nvidia-smi 也表现正常。
    1. ✍🏻
      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 为例(可能存在不一致的地方)。
  1. 打开 CUDA on WSL 英伟达官方下载链接,这里提供了 GEFORCE 和 QUADRO 两种系列显卡的驱动。本次安装以 GeForce GTX 1080 Ti 显卡为例,其属于 GEFORCE 系列,因此选择前者进行下载并安装;
    1. notion image
  1. 安装过程默认选择确定(OK)或下一步(NEXT)即可;
  1. 通过 Windows Terminal 打开 Ubuntu 18.04 子系统终端,依次输入以下代码添加 CUDA 安装库;
    1. 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
  1. 输入以下代码安装 CUDA 11.0,可通过修改版本号安装其他版本,格式为 cuda-toolkit-<version>,该过程耗时较久。
    1. 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 功能。
  1. 首先安装 Docker Desktop。打开 Docker Desktop for Windows 下载链接,点击 Download for Windows 下载 Docker Desktop 安装包并双击安装即可;
    1. notion image
  1. 打开 Docker Desktop 设置中的 General,开启 Use the WSL 2 based engine,如需通过 Docker API 调用容器中的代码,则需要开启 Expose daemon on tcp://localhost:2375 without TLS 功能;
    1. notion image
  1. 打开 Docker Desktop 设置中的 Resources,选中 WSL INTEGRATION,再选中 Enable integration with my default WSL distro 和 Ubuntu-18.04 即可使得后续 Docker 容器可以通过 WSL 2 访问 GPU。
    1. notion image
 
收工~

© Zack Zhou 2021 - 2022