Windows Subsystem for Linux (WSL) 创建、运行带CUDA支持的Ubuntu系统

本文最后更新于:2022年8月5日 晚上

Windows Subsystem for Linux (WSL)是适用于 Linux 的 Windows 子系统可让开发人员直接在 Windows 上按原样运行 GNU/Linux 环境(包括大多数命令行工具、实用工具和应用程序),且不会产生传统虚拟机或双启动设置开销。

相关资料

简介

Windows Linux子系统(WSL)是Windows 10的一项功能,使用户可以直接在Windows上运行本机Linux命令行工具。 WSL是一个容器化的环境,用户可以在其中从Windows 10 Shell的命令行运行Linux本机应用程序,而无需双启动环境的复杂性。在内部,WSL与Microsoft Windows操作系统紧密集成,从而使其可以与传统的Windows桌面和现代商店应用程序一起运行Linux应用程序。

 CUDA WSL

  • 借助WSL 2和GPU半虚拟化技术,Microsoft使开发人员能够在Windows上运行GPU加速的应用程序

安装步骤

以下文档描述了在WSL 2环境中开始运行CUDA应用程序或容器的工作流程

注意:从开普勒架构开始,在GPU上启用了WSL 2上的CUDA。但是,官方建议在Turing或更新的体系结构上的WSL 2上运行CUDA。

  • 从Microsoft Windows Insider程序安装最新版本
  • 为WSL2安装 NVIDIA 驱动
  • 安装WSL2
  • 安装Linux发行版
  • 为WSL配置CUDA环境
  • 为WSL安装 nvidia-docker

从Microsoft Windows Insider程序安装最新版本

注册加入微软Windows内部人员计划

  • 登录微软账号

  • 注册成功

安装 Win 10 的最新版本

查看Windows 10 版本
  • Win + R 在运行中输入命令 winver

  • 可以看到我的系统版本 1919 内部版本18363,这是不够的
  • 需要版本2004以上 内部版本19041 或更高

加入Windows预览体验计划

  • Win+S 搜索预览体验计划

如果没有这个开始按钮,一片空白,请移步解决Windows 预览体验计划没有用户选择界面的问题

  • 然后链接到自己的微软账户

  • CUDA建议使用Dev渠道,以获得最新的更新与最高的cuda性能,此处我们选择Dev渠道:

求稳的用户建议选择Beat渠道

  • 重启计算机

  • 成功加入预览成员

进行 Windows 更新

  • Win+S 搜索windows更新

  • 开启高级选项中的更新Windows时接收其他Microsoft产品的更新以更新Linux内核

  • 更新吧

这个更新可能需要分步
也就是一次重启更新一部分文件
需要不停更新,直到无新可更

更新后检查Windows 版本

  • win + R 命令 winver
  • Beta 渠道更新结果:

  • Dev渠道更新结果

21364.1已经超过了CUDA建议的21332内部版本号

检查历史更新记录

  • Windows 更新 面板中查看更新历史记录

如果没有 Linux 内核更新请返回开启更新Windows时接收其他Microsoft产品的更新开关

CUDA建议Linux内核版本 5.4.91+获得最好性能,当前没有达到,应该也是够用的

安装 NVIDIA 驱动

从WSL页面CUDA的下载部分下载NVIDIA驱动程序。根据您系统中的NVIDIA GPU的类型选择合适的驱动程序-GeForce和Quadro。

下载驱动

  • 选择自己的驱动类型

  • 登录英伟达账号

  • 下载驱动

安装驱动

  • 使用可执行文件安装驱动程序,这是我们需要安装的唯一驱动程序。

DirectX WSL驱动程序会与其他驱动程序组件一起自动安装,因此不需要其他操作。该驱动程序通过支持DX12 API在WSL2.0上启用图形。在WSL上具有DirectML支持的TensorFlow将获得用于训练和推理工作量的NV GPU硬件加速。

更多信息:https://docs.microsoft.com/en-us/windows/win32/direct3d12/gpu-tensorflow-wsl

查看驱动版本

  • cmd 运行 nvidia-smi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
C:\Users\Admin>nvidia-smi
Thu Apr 22 17:27:03 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.14 Driver Version: 470.14 CUDA Version: 11.3 |
|-------------------------------+----------------------+----------------------+
| GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... WDDM | 00000000:01:00.0 On | N/A |
| 0% 48C P8 14W / 135W | 250MiB / 6144MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1308 C+G Insufficient Permissions N/A |
| 0 N/A N/A 10776 C+G Insufficient Permissions N/A |
| 0 N/A N/A 14460 C+G ...s (x86)\YYNote\YYNote.exe N/A |
+-----------------------------------------------------------------------------+

官方提醒:

  1. 不要在WSL中安装任何Linux显示驱动程序。 Windows显示驱动程序将同时安装用于本机Windows和WSL支持的常规驱动程序组件。
  2. NVIDIA了解到在移动平台上报告的特定安装问题,该问题在2020年11月16日发布了WIP驱动程序465.12。已知的解决方法是在系统启动时从设备管理器中禁用和重新启用GPU适配器。我们正在努力解决此问题,并将很快提供更新的驱动程序。

安装 WSL 2

安装 WSL 1

现在的我们有三种方法安装WSL 1

  1. 使用简化安装命令

    此方法需要有三个前提:

    1. 加入 Windows 预览体验计划
    2. 安装 Windows 10 的预览版(OS 版本 20262 或更高版本)。
    3. 使用管理员特权打开命令行窗口
    1
    wsl --install
  2. 控制面板 –> 程序与功能 –> 启动或关闭Windows功能 勾选 适用于Linux的Windows子系统

  3. 或使用管理员权限打开powershell,输入命令:

    1
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

此时为了成功安装 WSL 事实上需要重启电脑,但是升级 WSL2 还需要重启一次,所以此处可以选择等会再重启

开启虚拟化功能

有两种方法完成开启

  1. 管理员权限开启 powershell,执行命令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    C:\WINDOWS\system32> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

    部署映像服务和管理工具
    版本: 10.0.21364.1

    映像版本: 10.0.21364.1

    启用一个或多个功能
    [==========================100.0%==========================]
    操作成功完成。
  2. 控制面板 –> 程序与功能 –> 启动或关闭Windows功能 勾选 虚拟机平台

  • 执行上述之一的步骤后,重启计算机,完成 WSL 安装并更新到 WSL 2

开启Hyper-V

  • 控制面板 –> 程序与功能 –> 启动或关闭Windows功能 勾选 Hyper-V 选项。

在BIOS中开启虚拟化功能

下载Linux内核更新包

如果使用的是 ARM64 计算机,请下载 ARM64 包。 如果不确定自己计算机的类型,请打开命令提示符或 PowerShell,并输入:systeminfo

系统类型可以看到本机基于 x64 需要下载x64包

  • 运行上一步中下载的更新包。 (双击以运行 - 系统将提示你提供提升的权限,选择“是”以批准此安装。)

  • 如果提示当前WSL版本更新就忽略这个包吧

将 WSL 2 设置为默认版本

  • 打开 PowerShell,然后在安装新的 Linux 发行版时运行以下命令,将 WSL 2 设置为默认版本:
1
2
3
4
wsl --set-default-version 2
-->
有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
操作成功完成。

查看 wsl 版本

1
2
3
wsl --list --verbose
//
wsl -l -v
  • 输出:
1
2
3
C:\Windows\system32>wsl -l -v
NAME STATE VERSION
* Ubuntu-18.04 Running 1

由于我之前安装了wsl1的ubuntu,列表中有一个Version为1的开发版

安装Linux发行版

安装Linux

  • 选择自己需要的Linux发行版:

事实上我尝试了 16.04和18.04的ubuntu 均出现安装CUDA时闪退的问题,没有解决

换成了20.04 顺利安装CUDA

Linux 分发版链接
  • 在分发版的页面中,选择“获取”
  • 进入到Microsoft Store 获取发行版,我安装成功了的是20.04版

安装 Windows Terminal (可选)

Windows Terminal启用多个选项卡(在多个Linux命令行,Windows命令提示符,PowerShell,Azure CLI等之间快速切换),创建自定义键绑定(用于打开或关闭选项卡的快捷键,复制+粘贴等),使用搜索功能和自定义主题(配色方案,字体样式和大小,背景图像/模糊/透明度)

Install Windows Terminal

  • 和 Xshell 差不多感觉

测试 Linux

  • 在Microsoft Store 或开始菜单搜索 Ubuntu 启动 Ubuntu 终端
1
2
3
4
5
6
7
8
9
10
11
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: zywvvd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

说明发行版正常运行

检查发行版WSL版本

  • 在powershell中输入命令:
1
wsl -l -v

–>

1
2
3
C:\Users\Admin> wsl -l -v
NAME STATE VERSION
* Ubuntu Running 2
  • 显示VERSION为2,表明WSL2发行版安装成功

为WSL配置CUDA环境

当前CUDA WSL仅对Ubuntu 做了支持

恰好我装的发行版是Ubuntu,需要安装 WSL-Ubuntu 的CUDA

  • 当前支持WSL的CUDA最早版本为11.1
  • 我安装CUDA成功的发行版是20.04(16.04和18.04均失败了,原因还没有找到)

Ubuntu 18.04

  • 这个版本受到CUDA官方眷顾,官网直接给出了安装命令
1
2
3
4
5
$ apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub

$ sh -c 'echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/cuda.list'

$ apt-get update
  • 安装WSL2 的CUDA
1
$ apt-get install -y cuda-toolkit-11-0

事实上,我并没有运行成功,所以个人建议用下面的安装方法

Ubuntu 16.04 或其他Ubuntu版本

  • 使用命令:
1
2
3
4
5
6
7
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda-repo-wsl-ubuntu-11-1-local_11.1.0-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-11-1-local_11.1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-wsl-ubuntu-11-1-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda
  • 或下载 runfile(local)

下载完成后

1
2
apt-get install -y gcc g++ make
./cuda_11.1.0_455.23.05_linux.run

测试CUDA

注意此时是没有 nvidia-smi的,因为没有在WSL中安装驱动,驱动是在Win中装的

  1. nvcc

    1
    2
    3
    4
    5
    6
    $ /usr/local/cuda/bin/nvcc -V
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2020 NVIDIA Corporation
    Built on Tue_Sep_15_19:10:02_PDT_2020
    Cuda compilation tools, release 11.1, V11.1.74
    Build cuda_11.1.TC455_06.29069683_0
  2. cuda sample

    • 使用cuda sample的1_Utilities
    1
    2
    3
    cd /usr/local/cuda/samples/1_Utilities/deviceQuery
    sudo make
    ./deviceQuery
    • 输出
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    $ ./deviceQuery
    ./deviceQuery Starting...

    CUDA Device Query (Runtime API) version (CUDART static linking)

    Detected 1 CUDA Capable device(s)

    Device 0: "NVIDIA GeForce GTX 1660"
    CUDA Driver Version / Runtime Version 11.4 / 11.1
    CUDA Capability Major/Minor version number: 7.5
    Total amount of global memory: 6144 MBytes (6442450944 bytes)
    (22) Multiprocessors, ( 64) CUDA Cores/MP: 1408 CUDA Cores
    GPU Max Clock rate: 1860 MHz (1.86 GHz)
    Memory Clock rate: 4001 Mhz
    Memory Bus Width: 192-bit
    L2 Cache Size: 1572864 bytes
    Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
    Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers
    Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 2048 layers
    Total amount of constant memory: 65536 bytes
    Total amount of shared memory per block: 49152 bytes
    Total shared memory per multiprocessor: 65536 bytes
    Total number of registers available per block: 65536
    Warp size: 32
    Maximum number of threads per multiprocessor: 1024
    Maximum number of threads per block: 1024
    Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
    Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
    Maximum memory pitch: 2147483647 bytes
    Texture alignment: 512 bytes
    Concurrent copy and kernel execution: Yes with 2 copy engine(s)
    Run time limit on kernels: Yes
    Integrated GPU sharing Host Memory: No
    Support host page-locked memory mapping: Yes
    Alignment requirement for Surfaces: Yes
    Device has ECC support: Disabled
    Device supports Unified Addressing (UVA): Yes
    Device supports Managed Memory: Yes
    Device supports Compute Preemption: Yes
    Supports Cooperative Kernel Launch: Yes
    Supports MultiDevice Co-op Kernel Launch: No
    Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0
    Compute Mode:
    < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

    deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.4, CUDA Runtime Version = 11.1, NumDevs = 1
    Result = PASS

为WSL安装 nvidia-docker

安装docker

1
curl https://get.docker.com | sh
  • 检查docker是否安装成功
1
2
$ docker --version
Docker version 20.10.6, build 370c289

安装nvidia-docker2

从nvidia-docker2 v2.3和基础运行库(libnvidia-container> = 1.2.0-rc.1)开始,为WSL 2提供支持。

1
2
3
4
5
6
7
8
9
10
11
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

curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container-experimental.list | sudo tee /etc/apt/sources.list.d/libnvidia-container-experimental.list

sudo apt-get update

sudo apt-get install -y nvidia-docker2
  • 检查nvidia-docker是否安装成功
1
2
$ nvidia-docker --version
Docker version 20.10.6, build 370c289

参考资料


Windows Subsystem for Linux (WSL) 创建、运行带CUDA支持的Ubuntu系统
https://www.zywvvd.com/notes/system/windows/about-wsl/wsl-build/wsl-build/
作者
Yiwei Zhang
发布于
2021年4月22日
许可协议