ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

WSL2深度学习环境搭建:从零配置Ubuntu 22.04到PyTorch GPU验证

WSL2深度学习环境搭建:从零配置Ubuntu 22.04到PyTorch GPU验证 1. 项目概述为什么要在WSL里搞深度学习如果你是一个在Windows上做机器学习或深度学习的开发者大概率经历过这样的痛苦项目依赖的某个库只在Linux上有稳定版本或者团队其他人的开发环境都是Ubuntu你本地跑通的代码一到服务器就出各种幺蛾子。以前解决这类问题的主流方案是装双系统或者用虚拟机。双系统切换麻烦虚拟机又吃资源性能损耗大。直到Windows Subsystem for LinuxWSL的出现尤其是WSL2它让我们能在Windows里获得一个近乎原生的Linux内核直接调用宿主机硬件这为在Windows上搭建一个高效、隔离的Linux开发环境提供了绝佳路径。这次要做的就是在WSL2上安装Ubuntu 22.04 LTS并在此基础上从零开始配置一个完整的深度学习环境。这不仅仅是安装几个软件更是一个理解现代AI开发工具链的实践过程。我们会涵盖从WSL初始设置、Ubuntu系统安装与基础配置到NVIDIA GPU驱动、CUDA Toolkit、cuDNN的安装最后用Conda创建虚拟环境并安装PyTorch进行验证。整个过程我会把每一步的原理、踩过的坑和优化技巧都讲清楚目标是让你得到一个开箱即用、性能接近原生Linux的深度学习工作站无论是跑TensorFlow还是PyTorch的实验都能得心应手。2. 环境准备与WSL2安装部署2.1 系统要求与准备工作在开始之前我们必须确保宿主机你的Windows电脑满足最低要求。WSL2需要Windows 10版本 2004内部版本 19041或更高版本或者Windows 11。对于深度学习而言硬件是重中之重你必须拥有一块NVIDIA的独立显卡。集成显卡如Intel UHD Graphics是不支持CUDA计算的这一点务必确认。你可以通过任务管理器“性能”选项卡查看是否有“GPU 1”通常是你的N卡。接下来我们需要在Windows功能中启用WSL和虚拟机平台。以管理员身份打开PowerShell运行以下两条命令dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完毕后强烈建议立即重启电脑。很多后续问题比如WSL安装失败、网络异常都源于没有重启使得系统更改完全生效。重启后我们需要将WSL的默认版本设置为WSL2。WSL1是早期的翻译层架构而WSL2使用了真正的Linux内核并通过Hyper-V虚拟机实现在文件I/O和系统调用兼容性上远超WSL1对Docker和CUDA的支持也更好。在PowerShell中运行wsl --set-default-version 2如果系统提示需要更新Linux内核它会提供一个下载链接。下载并安装那个“WSL2 Linux内核更新包”即可。2.2 安装Ubuntu 22.04 LTS子系统安装Linux发行版有两种主流方法。第一种是通过微软商店Microsoft Store直接搜索“Ubuntu 22.04 LTS”点击安装。这种方法最简单但对于国内用户商店访问可能不稳定。第二种是命令行安装这也是我更推荐的方式因为它更可控。打开PowerShell或命令提示符输入wsl --install -d Ubuntu-22.04这个命令会自动完成剩余的所有安装步骤。但这里有一个巨坑很多朋友反馈wsl --install速度极慢甚至卡住不动。这主要是因为默认的安装源在国外。如果你的网络环境不佳这个过程会非常痛苦。我的解决方案是手动下载发行版镜像并离线安装。我们去Ubuntu官方WSL仓库https://github.com/ubuntu/WSL/releases找到Ubuntu-22.04.appx包并下载。下载完成后将其重命名为Ubuntu-22.04.zip然后解压。在解压后的文件夹里你会找到一个名为ubuntu2204.exe的文件双击它就会启动Ubuntu的安装和初始化过程。这种方法完美避开了网络问题。安装过程中系统会提示你创建UNIX用户名和密码。这个密码很重要以后使用sudo提权操作时都需要输入请务必记住。2.3 基础系统配置与优化安装完成后我们先进行一些基础配置让这个子系统用起来更顺手。首先更新软件源和升级现有包sudo apt update sudo apt upgrade -y接着安装一些开发必备工具包sudo apt install -y build-essential curl wget git vim net-toolsbuild-essential包含了gcc, g, make等编译工具链是后续很多软件编译安装的基础。curl/wget命令行下载工具。git版本控制必不可少。vim一个高效的文本编辑器当然你可以按喜好换成nano。net-tools包含ifconfig等网络诊断工具。关于WSL与Windows的文件互访WSL2的一个便利之处是深度融合。在WSL中你可以通过/mnt/c/、/mnt/d/等路径直接访问Windows的C盘、D盘。反之在Windows文件资源管理器的地址栏输入\\wsl$\Ubuntu-22.04其中“Ubuntu-22.04”是你的发行版名称就能直接访问WSL子系统的根文件系统。这极大方便了数据交换。网络互通问题WSL2默认使用NAT网络其IP地址与宿主机不在同一个网段。这意味着从Windows无法直接通过IP访问WSL内的服务比如一个Jupyter Notebook。解决办法是在WSL中启动服务时绑定到0.0.0.0然后在Windows中使用localhost访问。这是因为WSL2通过虚拟交换机实现了localhost的转发。如果遇到“无法配置网络”之类的错误可以尝试在PowerShell中用管理员身份运行wsl --shutdown彻底关闭WSL然后重启这能解决大部分网络临时故障。3. NVIDIA驱动与CUDA工具链安装3.1 宿主机Windows的NVIDIA驱动安装这是整个流程中最关键、也最容易出错的一步。一个核心原则WSL2中的CUDA运行依赖于宿主机Windows中安装的NVIDIA显卡驱动。WSL2内不需要、也不应该单独安装显卡驱动。确定显卡型号在Windows中右键点击“开始菜单” - “设备管理器” - “显示适配器”记下你的NVIDIA显卡具体型号例如NVIDIA GeForce RTX 4070。下载官方驱动前往NVIDIA官方网站的驱动程序下载页面https://www.nvidia.com/Download/index.aspx手动搜索你的显卡型号和操作系统Windows 10/11选择“标准”或“DCH”类型通常选DCH这是新架构。务必下载“Game Ready Driver”或“Studio Driver”它们都包含了对WSL2和CUDA的支持。不要使用Windows Update自动安装的驱动那个版本可能太旧。执行清洁安装运行下载的安装程序。在安装选项中强烈建议勾选“执行清洁安装”。这会移除旧驱动文件避免冲突。安装完成后再次重启Windows。安装成功后你可以在Windows的命令提示符或PowerShell中运行nvidia-smi命令。如果能看到显卡信息、驱动版本和CUDA版本例如“CUDA Version: 12.4”说明驱动安装正确并且该驱动内建了对应版本的CUDA用户态驱动User Mode Driver这是WSL2使用GPU的前提。3.2 在WSL2中安装CUDA ToolkitCUDA Toolkit是NVIDIA提供的用于GPU计算的软件开发平台包含了编译器、库文件、头文件和工具。在WSL2中安装它我们才能编译和运行CUDA程序。NVIDIA为WSL提供了专用的CUDA Toolkit安装包。访问NVIDIA CUDA Toolkit下载页面https://developer.nvidia.com/cuda-downloads在“Operating System”中选择“Linux”在“Architecture”中选择“x86_64”在“Distribution”中选择“WSL-Ubuntu”在“Version”中选择“2.0”最后选择你需要的CUDA版本例如12.4和安装类型“deb (network)”。页面会给出详细的安装指令。对于Ubuntu 22.04通常如下# 首先安装必要的依赖和添加GPG密钥 wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt-get update # 然后安装CUDA Toolkit。注意版本号要与驱动支持的版本匹配。 # 例如安装CUDA 12.4 sudo apt-get -y install cuda-toolkit-12-4这个安装过程会从网络下载几百MB到上GB的数据请保持网络通畅。安装完成后需要将CUDA路径加入到环境变量中。编辑你的shell配置文件如~/.bashrcecho export PATH/usr/local/cuda-12.4/bin${PATH::${PATH}} ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda-12.4/lib64${LD_LIBRARY_PATH::${LD_LIBRARY_PATH}} ~/.bashrc source ~/.bashrc之后在WSL终端中输入nvcc --version如果能看到CUDA编译器的版本信息说明CUDA Toolkit安装成功。注意这里安装的cuda-toolkit主要包含的是运行时库cudart和开发工具nvcc。它与宿主机驱动内置的CUDA版本最好保持一致或略低。你可以通过nvidia-smi查看驱动支持的“最高”CUDA版本只要安装的Toolkit版本不高于这个值即可。3.3 安装cuDNN深度学习加速库cuDNN是NVIDIA深度神经网络加速库它针对深度学习的常用操作如卷积、池化、归一化进行了高度优化。像PyTorch、TensorFlow这类框架在底层都会调用cuDNN来获得极致性能。安装cuDNN需要先注册一个免费的NVIDIA开发者账号。登录后在cuDNN下载页面https://developer.nvidia.com/cudnn选择与你安装的CUDA Toolkit版本匹配的cuDNN版本。例如CUDA 12.x就选择对应12.x的cuDNN。下载得到的是一个.tar.xz压缩包例如cudnn-linux-x86_64-8.x.x.x_cuda12-archive.tar.xz。我们在WSL中进行安装# 1. 将下载的压缩包从Windows目录复制到WSL家目录假设包在Windows下载文件夹 cp /mnt/c/Users/你的用户名/Downloads/cudnn-linux-x86_64-*.tar.xz ~/ # 2. 解压 tar -xvf cudnn-linux-x86_64-*.tar.xz # 3. 复制文件到CUDA Toolkit目录 cd cudnn-linux-x86_64-*_cuda12-archive sudo cp include/cudnn*.h /usr/local/cuda-12.4/include/ sudo cp lib/libcudnn* /usr/local/cuda-12.4/lib64/ # 4. 修改文件权限 sudo chmod ar /usr/local/cuda-12.4/include/cudnn*.h /usr/local/cuda-12.4/lib64/libcudnn*为了验证cuDNN是否安装成功可以编译并运行一个NVIDIA提供的样例。首先安装样例依赖并编译# 进入CUDA样例目录 cd /usr/local/cuda-12.4/samples/ sudo make -j$(nproc)如果编译成功可以运行一个简单的设备查询样例./bin/x86_64/linux/release/deviceQuery如果输出结果最后显示“Result PASS”并且能看到你的GPU信息那么恭喜你CUDA和cuDNN环境基本就绪了。4. 使用Conda管理Python与深度学习框架4.1 Miniconda安装与虚拟环境创建在深度学习项目中我们强烈建议使用虚拟环境来隔离不同项目的依赖避免版本冲突。Anaconda体积庞大Miniconda是一个更轻量化的选择它只包含Conda、Python和一些基础包。从Miniconda官网下载Linux版本的安装脚本选择Python 3.10或3.11的64位版本。在WSL终端中执行# 下载安装脚本 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh # 运行安装脚本 bash Miniconda3-latest-Linux-x86_64.sh安装过程中按照提示阅读许可协议一直按回车输入“yes”同意建议将安装路径设置为默认/home/你的用户名/miniconda3并在最后一步选择“yes”来让Conda初始化你的shell通常是.bashrc。安装完成后关闭并重新打开终端或者执行source ~/.bashrc使配置生效。你会看到命令行提示符前多了(base)这表示你已经在Conda的base环境中了。接下来我们创建一个专用于深度学习的虚拟环境# 创建一个名为dl_envPython版本为3.10的环境 conda create -n dl_env python3.10 -y # 激活该环境 conda activate dl_env激活后提示符会从(base)变为(dl_env)之后所有pip或conda安装的包都将只存在于这个环境中。4.2 在虚拟环境中安装PyTorch与验证GPU现在我们在dl_env环境中安装PyTorch。访问PyTorch官网https://pytorch.org/get-started/locally/选择你的配置PyTorch Build稳定版、你的操作系统Linux、包管理工具Conda或Pip这里以Pip为例、语言Python、以及计算平台CUDA 12.4。网站会生成对应的安装命令。例如对于CUDA 12.4命令可能如下pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124使用--index-url指定PyTorch的CUDA版本仓库可以确保下载到与你的CUDA版本匹配的预编译轮子wheel安装速度最快。安装完成后我们启动Python交互环境来验证GPU是否可用import torch print(fPyTorch版本: {torch.__version__}) print(fCUDA是否可用: {torch.cuda.is_available()}) print(fCUDA版本: {torch.version.cuda}) print(f当前GPU设备: {torch.cuda.get_device_name(0)})如果一切顺利你将看到输出类似PyTorch版本: 2.3.0cu124 CUDA是否可用: True CUDA版本: 12.4 当前GPU设备: NVIDIA GeForce RTX 4070看到CUDA是否可用: True和正确的GPU设备名就证明你的WSL深度学习环境已经完全配置成功PyTorch可以正常调用GPU进行计算了。4.3 环境配置的持久化与常用工具为了让这个环境用起来更方便我们可以进行一些持久化配置。将常用的环境变量和别名写入~/.bashrc或专门的环境配置文件。例如可以设置一个别名快速激活深度学习环境echo alias act_dlconda activate dl_env ~/.bashrc source ~/.bashrc以后只需要输入act_dl就能快速进入环境。此外你可能还需要安装一些数据科学常用库pip install numpy pandas matplotlib scikit-learn jupyter notebook安装Jupyter Notebook后可以在WSL中启动它并在Windows浏览器中通过http://localhost:8888访问实现跨系统的交互式编程。5. 疑难杂症与性能调优实录5.1 安装与配置过程中的常见错误nvidia-smi在WSL中报错“NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver”原因这是最常见的问题。根本原因是宿主机Windows的NVIDIA驱动未安装、版本太旧、或者安装不正确。解决回到Windows彻底卸载现有NVIDIA驱动使用DDU工具或在“添加删除程序”中卸载所有NVIDIA组件然后从官网下载最新版驱动执行“清洁安装”。安装后务必重启Windows再在WSL中测试。WSL2中CUDA样例编译失败提示找不到libcudart或其他CUDA库原因环境变量LD_LIBRARY_PATH没有正确设置或者CUDA Toolkit安装不完整。解决首先确认~/.bashrc中的LD_LIBRARY_PATH已设置并已source。其次检查/usr/local/cuda符号链接是否正确指向了你安装的版本如cuda-12.4。可以用ls -l /usr/local/cuda查看。如果不正确可以手动创建sudo ln -sf /usr/local/cuda-12.4 /usr/local/cuda。PyTorch安装后torch.cuda.is_available()返回False排查步骤 a. 在WSL中运行nvidia-smi确认能识别GPU且驱动版本合适。 b. 在Python中运行import torch; print(torch.__version__)确认PyTorch版本后缀包含cuXXX如cu124这表示安装的是CUDA版本。 c. 检查PyTorch的CUDA版本与系统CUDA Toolkit版本是否大致兼容。PyTorch的CUDA版本如12.4应不高于nvidia-smi显示的驱动支持的最高版本且最好与Toolkit版本一致。 d. 如果以上都正确尝试在WSL中运行ldconfig -p | grep cudart查看CUDA运行时库是否被系统找到。WSL2磁盘I/O性能问题现象在WSL内进行大量文件操作如解压数据集、pip install时速度异常慢。原因WSL2访问Windows挂载盘/mnt/c/的性能开销较大。解决将你的项目和数据放在WSL的Linux原生文件系统内即~/或/home目录下。你可以通过\\wsl$\在Windows资源管理器中访问这些文件。如果需要从Windows盘复制大量数据到WSL可以考虑先用Windows工具处理好再复制进去。5.2 性能优化与使用建议分配更多资源给WSL2WSL2默认会动态分配内存和CPU。对于深度学习任务我们可以限制其最大使用量以避免与Windows争抢资源。在用户目录C:\Users\你的用户名\下创建或编辑文件.wslconfig内容如下[wsl2] memory16GB # 限制最大内存使用根据你的物理内存调整例如32G物理内存可分16G processors8 # 限制使用的CPU核心数 localhostForwardingtrue保存后在PowerShell中运行wsl --shutdown关闭WSL再重新启动Ubuntu配置生效。使用CUDA的持久化模式GPU初始化有一定开销。可以启用持久化模式让GPU驱动在系统启动后保持初始化状态减少第一个CUDA应用的启动延迟。在WSL中需要sudo权限sudo nvidia-persistenced --user nvidia-persistenced你可以将此命令添加到系统服务中使其开机自启。监控GPU使用情况在WSL中nvidia-smi是最直接的监控工具。你可以使用watch -n 1 nvidia-smi来每秒刷新一次GPU状态实时观察显存占用、GPU利用率等信息。版本管理CUDA、cuDNN、PyTorch/TensorFlow的版本兼容性是个复杂矩阵。建议在开始新项目时先查阅框架官方文档的版本兼容性表格确定一个稳定的组合。使用Conda虚拟环境就是为了灵活应对这种多版本需求。整个环境搭建下来最深的体会就是“路径依赖”和“版本对齐”的重要性。从Windows驱动版本到WSL2内核再到CUDA Toolkit、cuDNN最后到深度学习框架这是一条环环相扣的链条。任何一个环节版本不匹配都可能导致最终失败。因此最好的实践是记录下你成功配置的每一个组件的具体版本号。这能为未来的环境重建或问题排查节省大量时间。这个在WSL2中构建的Ubuntu深度学习环境几乎具备了原生Linux的开发体验又无缝集成在Windows的便利之中对于需要跨平台工作的开发者来说确实是一个高效而优雅的解决方案。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进