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

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。

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

扫描二维码关注公众号,回复: 13677686 查看本文章
  • 可以看到我的系统版本 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硬件加速。

更多信息:docs.microsoft.com/en-us/windo…

查看驱动版本

  • cmd 运行 nvidia-smi
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. 使用管理员特权打开命令行窗口
    wsl --install
    复制代码
  2. 控制面板 –> 程序与功能 –> 启动或关闭Windows功能 勾选 适用于Linux的Windows子系统

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

    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    复制代码

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

开启虚拟化功能

有两种方法完成开启

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

    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 设置为默认版本:
wsl --set-default-version 2
-->
有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
操作成功完成。
复制代码

查看 wsl 版本

wsl --list --verbose
// 或
wsl -l -v
复制代码
  • 输出:
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 终端
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中输入命令:
wsl -l -v
复制代码

-->

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官方眷顾,官网直接给出了安装命令
$ 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
$ apt-get install -y cuda-toolkit-11-0
复制代码

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

Ubuntu 16.04 或其他Ubuntu版本

  • 使用命令:
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)

下载完成后

apt-get install -y gcc g++ make
./cuda_11.1.0_455.23.05_linux.run
复制代码

测试CUDA

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

  1. nvcc

    $ /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
    cd /usr/local/cuda/samples/1_Utilities/deviceQuery
    sudo make
    ./deviceQuery
    复制代码
    • 输出
    $ ./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

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

安装nvidia-docker2

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

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是否安装成功
$ nvidia-docker --version
Docker version 20.10.6, build 370c289
复制代码

参考资料

猜你喜欢

转载自juejin.im/post/7062151645613785124