赞
踩
目录
WSL2 Ubuntu 20.04使用NVIDIA CUDA
WSL2 Ubuntu安装NVIDIA cuDNN深度学习库
⚠️⚠️⚠️注意⚠️⚠️⚠️
现在微软推出了Ubuntu22.04的WSL2发行版,22.04和之前的版本有较大变化,目前博主测试了好几种办法,发现只能安装在默认位置。如果安装在其他地方,或者是安装好再移动过去,运行ubuntu.exe时都会报错“文件被加密”。因此本教程不适用于最新的Ubuntu22.04,小伙伴们敬请周知~
如果有自定义位置安装22.04的方法,欢迎大家分享!
✅以下链接是微软官方文档给出的手动安装方法,步骤和上面的教程一致:
旧版 WSL 的手动安装步骤 | Microsoft Docshttps://docs.microsoft.com/zh-cn/windows/wsl/install-manual
⚠️注意:如果装在C盘,在应用商店进行launch操作可能会报错如下:
WslRegisterDistribution failed with error: 0xc03a001a
原因是安装包所在的文件夹被压缩处理了,解决方案请见这里。
⚠️⚠️⚠️注意⚠️⚠️⚠️
请在微软应用商店搜索时务必输入全名Ubuntu20.04。
现在微软推出了新的Ubuntu 22.04的WSL2发行版,应用商店默认的Ubuntu版本号已经更新至22.04。目前发现,改变22.04的安装位置可能导致虚拟机无法启动。
因此,请确保下载的版本是Ubuntu 20.04。
自定义位置安装过程与C盘安装教程相似。最大区别在于,我们按照教程或官方文档从微软商店下载Ubuntu之后,不要点击“启动”,而是要将安装包复制到我们想要的位置,之后Ubuntu就会被安装到该位置。具体步骤如下。
首先,请按照教程或官方文档从头进行下去,一直到从微软商店下载好Ubuntu20.04为止(请在微软应用商店搜索时务必输入全名Ubuntu20.04,且下载完毕后不要点“启动”)。在从微软商店下载好Ubuntu20.04之后,在开始菜单会出现类似下图的图标,这就是刚刚下载的Ubuntu20.04安装程序。
在按照教程复制完安装程序,并且完成Ubuntu安装后,我们可以右键图标,将这个原始安装包卸载。
⚠️注意:现在请不要卸载!
使用微软商店下载的应用安装包会默认保存在C:\Program Files\WindowsApps目录下。
如果发现没有权限打开C:\Program Files\WindowsApps文件夹,可以用PowerShell(管理员权限运行)的命令打开,对应的操作为:
cd "C:\Program Files\WindowsApps"
Ubuntu安装包默认保存在WindowsApps目录下的某个文件夹里。文件夹名称的开头应该类似于CanonicalGroupLimited。
寻找当前目录下以CanonicalGroupLimited开头的文件夹:
dir CanonicalGroupLimited*
可能会有多个类似的文件夹,依次查看这些文件夹:
dir CanonicalGroupLimited(不要回车执行)
然后按多次tab键,可以在这些类似的文件夹名之间切换。切换到你想要查看的文件夹,回车执行命令。如果文件夹里面有ubuntu<版本号>.exe文件,这就是我们要找的文件夹。
ubuntu<版本号>.exe就是Ubuntu的安装程序;安装完成后,该程序还可用来启动或访问Ubuntu。
⚠️注意:你想要安装Ubuntu的位置必须存在,否则接下来的复制操作会报错:
Copy-Item: Container cannot be copied onto existing leaf item.
如果我们想把Ubuntu安装在F盘的“ubuntu2004”文件夹下,就得确保这个文件夹存在。如果不存在,就要手动创建:
mkdir F:\ubuntu2004
接着,把安装包所在文件夹下的所有文件复制到你想要安装Ubuntu的文件夹。对应的命令行操作为:
cp <安装包所在的文件夹名>\* <你想要安装ubuntu文件夹的路径>
举个例子,这里我们将安装包和相关文件复制到了F盘的“ubuntu2004”文件夹下:
打开复制到的文件夹,双击运行ubuntu<版本号>.exe即可,等待ubuntu系统初始化。初始化完毕后,按照C盘安装教程第8步配置好用户名和密码,完成安装。
⚠️注意:
在第一次运行ubuntu<版本号>.exe时,如果出现如下异常情况之一:
- 出现一个黑窗口,输出一些信息(或没有输出信息)后卡住,没有出现正常的用户创建流程。
- 没有出现创建新用户的提示,而是直接作为root用户登录了。
请不用惊慌,按照以下顺序进行错误排查:
- 是否按照官方文档进行了步骤1~5?
- 下载安装时需要在应用商店搜索全名Ubuntu20.04,教程暂时不支持最新推出的Ubuntu22.04。
- 如果1、2均确认无误,电脑上是否安装过Vmware或VirtualBox?
如果排查出问题1、2,请参考“WSL运行状态、开/关机、卸载”一节,卸载掉刚刚安装的WSL Ubuntu发行版(如果卸载时发现刚刚并没有安装成功,则不用卸载),然后从头开始走一遍教程即可。
如果出现异常现象2,且没有排查出问题,请保持当前root用户的登录状态,然后参考下文“WSL2 Ubuntu创建新用户并修改默认登录用户”一节进行解决即可。解决后应当不影响日后的正常使用,如果出现问题欢迎反馈给博主~
如果排查出问题3,博主尚未深入研究过,请通过评论或私聊反馈给博主~
最终,目录下会多出一个vhdx虚拟硬盘文件,它就是Ubuntu WSL2虚拟机挂载的“硬盘”。在WSL2 Ubuntu虚拟机中下载资源、安装软件,都会让这个虚拟硬盘文件变大。
安装结束后,安装目录中的ubuntu<版本号>.exe就是Ubuntu的启动/访问程序。
正如教程开篇提到的,在开始菜单中可以找到原始安装包的应用图标,右键将其卸载。卸载后Ubuntu从微软商店的已安装列表中消失。
从此,安装目录中的ubuntu<版本号>.exe就是Ubuntu的启动程序,我们把它添加到开始菜单。
以后可以直接从开始菜单打开Ubuntu,也可以通过Windows键+S键直接搜索ubuntu打开:
对于那些安装了Windows Terminal的小伙伴,Ubuntu会自动添加至其中:
如果发现Windows Terminal的下拉列表里没有这个项目 ,那代表它被自动隐藏了。我们点击“设置”后应当能在左侧边栏找到它。将其取消隐藏,然后保存设置。
本节用到的wsl命令参考自官方文档:
WSL可以安装多个Linux发行版(如Ubuntu、Kali等等)。操作系统由内核+外围程序组成,Linux是操作系统内核的名字,由基于Linux内核的软件组成的操作系统叫做Linux发行版(如Ubuntu、Kali等等)。
我们可以打开powershell,通过以下命令查询机器上安装的所有发行版:
wsl --list --verbose
输出一张表格,分别记录了WSL中每一个Linux发行版的名称(NAME)、状态(STATE)和版本(VERSION)。
WSL中,Linux发行版的开机/启动方法非常简单,只需要运行该发行版的安装-启动程序即可。
关机操作,在powershell中执行以下命令来关闭某一个linux发行版:
wsl --terminate <发行版名称>
或者关闭所有发行版:
wsl --shutdown
⚠️注意:发行版开机后,只要不手动执行关机操作,或者不关闭物理机器,它将一直保持开机。物理机器在关闭、重新启动后,发行版会关机。
当你确认不再需要某个WSL Linux发行版后,可以执行以下命令将其彻底删除。
⚠️注意:
该操作将会删除指定发行版的所有数据!即使再次重装该发行版,数据也不会回来!
wsl --unregister <发行版名称>
在执行完毕后,检查一下物理机器上现存的所有WSL Linux发行版,已删除的发行版应当不再出现。
wsl --list --verbose
如果您之前为该发行版创建了某些快捷方式(如开始菜单中的“磁贴”、Windows Terminal中的“Profile”、文件浏览器中的“快速访问”等),可以手动将它们删除。
在保证Linux发行版正在运行的情况下,在文件浏览器中输入以下路径,即可访问发行版的文件系统:
\\wsl$
此时我们可以在左侧边栏中,将路径加入快速访问(“固定到快速访问”功能也可能是在上方的文件夹工具栏里,不同系统貌似不一样,找不到的话可以百度一下)。
如果您需要在WSL2 Ubuntu中创建一个新的用户,并且以后每次运行WSL2 Ubuntu时,都会默认以这个新用户的身份登录,可以参考本节教程。
首先,使用如下命令手动创建新的用户账号。执行该命令后,会让你输入新用户的密码和一些其他信息。成功创建用户后,/home/目录下将会出现新用户的家目录。
sudo adduser <想要创建的用户名>
新用户创建完成,然后我们将新用户加入sudo群组,这样新的用户可以直接使用sudo命令。成功执行以下命令后,具有sudo权限的新用户账号就算是创建完毕~
sudo usermod -aG sudo <新创建的用户名>
接下来,创建并修改针对该Ubuntu的WSL配置文件。这样一来,我们以后运行这个发行版时,可以默认使用新用户身份登录。以管理员sudo权限,创建或编辑该配置文件:
/etc/wsl.conf
在文件中加入如下内容,保存该配置。
- [user]
- default=<新创建的用户名>
最后,在Windows系统中打开powershell,手动让该WSL2 Ubuntu发行版停止运行(具体方法请参考“WSL运行状态、开/关机、卸载”一节)。
成功停止运行后,重新运行WSL2 Ubuntu(双击ubuntu<版本号>.exe,或者直接在Windows Terminal中运行)。此时配置文件改动生效,应当默认登录为新的用户。
微软在Github上发布了wslg项目,旨在为WSL2提供更加自然的GUI图形界面支持,并且提到wslg可以通过安装虚拟GPU驱动来得到物理GPU的加速。
⚠️注意:
该功能对windows系统版本有要求。按下Windows键+R键后,在弹出的“运行”窗口中输入winver,可以快速查询系统版本。
系统要求 Windows 10 Insider Preview build 21362+(wslg项目README描述)或 Windows 11 Build 22000+(微软官方文档描述)。大家可以通过参加Windows预览体验计划升级系统。
wslg在Github的项目地址:
微软官方文档:
Run Linux GUI apps with WSL | Microsoft Docs
博主的win11按照官方文档的描述升级了WSL2的GUI支持。使用上的效果就是,在WSL2的Linux发行版命令行中打开某个GUI图形界面应用(如xterm)后,windows系统会打开一个新的窗口,窗口中运行着该应用,可以进行图形界面的交互。
当Windows系统设置了显示内容放大,并且放大倍数是整数时(如100%、200%等),wslg会按照相应的放大倍数放大GUI的内容。但若放大倍数不是整数(如125%、150%等),wslg默认不会对GUI内容进行非整数倍放大。本节第一幅图片便是没有放大的效果。
我们需要以管理员权限运行linux发行版,然后新建wslg的配置文件.wslgconfig:
touch /mnt/c/ProgramData/Microsoft/WSL/.wslgconfig
然后在文件中添加如下内容,来打开非整数倍放大功能:
- [system-distro-env]
- WESTON_RDP_DISABLE_FRACTIONAL_HI_DPI_SCALING=false
最后,对发行版进行“关机”“开机”操作,使改动生效。下图是修改配置后的效果:
参考的Github回答:
WSLg does not seem to support fractional scaling · Issue #23 · microsoft/wslg · GitHub
作为一个虚拟机,WSL2居然可以访问到物理宿主机的GPU设备,博主之前还没听说过有哪家公司的虚拟机可以做到这一点。如果WSL2当真可以做到,并且性能可以接受的话,那真是科研党的福音!
⚠️注意:
- 该功能对windows系统版本有要求。系统要求Windows 11或Windows 10, version 21H2。
- 关于支持在WSL2上运行CUDA的显卡型号,NVIDIA文档中只保证了GeForce系列和NVIDIA RTX/Quadro系列显卡支持此功能。文档并未提及其他系列和型号的显卡,可以自行尝试按教程配置,但有可能失败。
微软撰写的为WSL2启用GPU加速的官方文档。该文档记载了WSL2使用NVIDIA CUDA(需要NVIDIA品牌的GPU)和DirectML(GPU不限品牌,AMD/Intel/NVIDIA都可,但需要支持DirectX 12技术)的方法:
GPU acceleration in WSL | Microsoft Docs
在本节中我们主要介绍WSL2 Ubuntu 20.04使用Nvidia CUDA的操作方法,遵循NVIDIA公司给出的官方教程:
CUDA on WSL :: CUDA Toolkit Documentation (nvidia.com)
CUDA(Compute Unified Device Architecture)是由NVIDIA开发的一个并行计算平台和一种并行编程模式,旨在为NVIDIA的GPU提供通用的计算能力。
具体说来,CUDA是NVIDIA为他们公司自己的GPU开发的一套“工具库和工具程序”,它将复杂的底层GPU驱动接口封装起来,只暴露出一套自己的接口给上层应用。你只需要在自己的代码(如C++、Fortran等)中按照规则调用CUDA,再经过CUDA专用编译工具(如nvcc等)的翻译,最终的可执行程序就可以使用GPU进行计算了。
用来解决问题的上层应用 | 科研人员或程序员使用TensoFlow、PyTorch等深度学习框架来解决某些复杂问题,并且需要GPU提供算力。 |
TensoFlow、PyTorch等深度学习框架 | 这些深度学习框架需要调用一些基础的“获得CUDA支持、编译好的C++等程序”,并把它们包装成高级语言的接口,供上层应用调用。 |
C++、Fortran等程序 | 深度学习框架开发人员在程序代码中嵌入cuDNN或者CUDA相关的代码(即在代码中调用cuDNN和CUDA暴露出的简单接口),然后源代码经过nvcc等编译器翻译为底层GPU驱动程序能看懂的机器码。 |
cuDNN | NVIDIA将一些复杂的深度学习算法和数据结构用CUDA提供的接口实现,然后暴露出简洁的接口给上层应用。 |
CUDA | NVIDIA将自己设计的GPU的复杂底层驱动接口封装起来,暴露出一套简洁、专用的接口给上层应用, |
nvcc等CUDA专用编译器 | 专用编译器将程序代码中内嵌的CUDA代码翻译为底层GPU驱动程序能看懂的机器码。 |
NVIDIA GPU驱动程序 | 底层的显卡驱动程序会根据机器码给的指令,操控显卡进行动作。 |
NVIDIA GPU物理设备 | 显卡,手能触碰到的物理设备。显卡上的电路根据指令进行动作。 |
从物理设备开始一直到上层应用,CUDA有一条复杂的软件版本依赖链。我们通常从自己电脑的物理GPU型号开始,确定每个环节的软件版本:
GPU物理设备的型号 | ——决定——> | GPU驱动的版本号 | 对应关系 |
GPU驱动的版本号 | ——决定——> | CUDA的版本号 | 对应关系 |
CUDA的版本号 | ——决定——> | cuDNN的版本号 | 对应关系 |
CUDA的版本号,同上 | ——决定——> | PyTorch等深度学习框架的版本号 | 对应关系 |
举个例子(这一步只是先确定版本,还没到安装环节。后面有具体的安装教程,别着急哟~)
总结下来,博主的CUDA配置清单如下,大家也可以整理一下自己要安装的软件清单:
物理显卡型号 | NVIDIA GeForce GTX 1050 Ti |
显卡驱动版本号 | 470.14 |
CUDA版本号 | 11.3 |
cuDNN版本号 | 8.2.1 |
PyTorch版本号 (不用的话可以不装) | 1.12.0-gpu-cuda113 |
明确了要安装软件的版本,接下来就可以正式进入下载安装环节啦~
按照NVIDIA给出的教程,首先需要安装Windows平台上的NVIDIA显卡驱动。
⚠️注意:
- 如果Windows系统已经安装了NVIDIA显卡驱动,据不可靠消息来源报道,显卡驱动版本在455.41以上的话,应当可以支持此功能(如果后面运行CUDA失败,还请卸载CUDA,然后更新显卡驱动到最新)。
- 如果已经有NVIDIA显卡驱动,可以按Windows键+S键,搜索系统里安装的NVIDIA的显卡管理程序(如GeForce Experience,它在任务栏也会显示图标),通过它升级显卡驱动。
如果系统里没有装过NVIDIA显卡驱动,或想要手动更新的话,请在官方下载地址下载安装最新的、符合自己显卡型号的WIndows显卡驱动(“操作系统”一定要选择Windows,而不是Linux)。举个例子,假如电脑显卡是GTX1050ti(笔记本版),操作系统是Windows 11,下图是应该选择的显卡驱动配置:
配置完毕后,点击“搜索”,查找最新的显卡驱动。搜索出结果后,点击“下载”,会弹出文件下载窗口。
如果觉得浏览器下载太慢,可以复制下载链接到迅雷或者其他下载器:
下载完毕后,运行安装程序。一般来说,按照推荐选项安装即可。 安装完毕后,重启电脑。
安装完毕后,可以在命令行执行nvidia-smi.exe检查显卡驱动信息,正常输出则安装正确。如果无法直接找到这个可执行文件,可以在命令行输入它的(默认)安装位置。
'C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe'
当我们在Windows上安装完NVIDIA显卡驱动后,下一步就是安装CUDA的核心本体——CUDA工具包。CUDA工具包囊括了CUDA的相关工具库文件和工具程序,如nvcc编译器等。拥有了CUDA工具包,我们就可以在程序代码中嵌入CUDA语句来方便地使用GPU,然后通过CUDA的编译器将代码翻译成可执行文件。本节主要参考来源:CUDA on WSL :: CUDA Toolkit Documentation
⚠️注意:鉴于平台限制,WSL2下的CUDA工具包目前仍有少数功能没有得到完全支持,如CUDA代码的调试器等,详细请见文档。
当你进行到这一步时,应该已经清楚自己需要安装的CUDA版本了,我们把要安装的CUDA版本号记作:
<CUDA_MAJOR>.<CUDA_MINOR>
CUDA_MAJOR是CUDA的大版本号,CUDA_MINOR是CUDA的小版本号
假如说我们要安装CUDA 11.6,那么CUDA_MAJOR=11,CUDA_MINOR=6
打开WSL2 Ubuntu 20.04,执行如下语句来获取NVIDIA CUDA的官方本地安装包仓库。首先,我们根据自己要装的CUDA版本号,依次定义这两个临时环境变量:
- export CUDA_MAJOR=大版本号,如11
- export CUDA_MINOR=小版本号,如6
由于最近几个月NVIDIA更新了自己apt源的GPG密钥,我们需要先删除它原来过时的密钥:
sudo apt-key del 7fa2af80
接着,下载并安装NVIDIA CUDA的本地安装包仓库:
- 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/${CUDA_MAJOR}.${CUDA_MINOR}.0/local_installers/cuda-repo-wsl-ubuntu-${CUDA_MAJOR}-${CUDA_MINOR}-local_${CUDA_MAJOR}.${CUDA_MINOR}.0-1_amd64.deb
- sudo dpkg -i cuda-repo-wsl-ubuntu-${CUDA_MAJOR}-${CUDA_MINOR}-local_${CUDA_MAJOR}.${CUDA_MINOR}.0-1_amd64.deb
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/128520
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。