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 英伟达官方下载链接,这里提供了 GEFORCEQUADRO 两种系列显卡的驱动。本次安装以 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 子系统下安装 cudacuda-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 distroUbuntu-18.04 即可使得后续 Docker 容器可以通过 WSL 2 访问 GPU。
    1. notion image
 
收工~

© Zack Zhou 2021