别再折腾双系统了!用Win11的WSL2搭建Ubuntu22.04深度学习环境(CUDA+PyTorch)保姆级避坑指南

你是否曾经为了在Windows系统上运行Linux环境而反复折腾双系统?或者被虚拟机的性能问题困扰?现在,Win11的WSL2(Windows Subsystem for Linux 2)提供了一个完美的解决方案。本文将带你一步步在WSL2中搭建Ubuntu22.04深度学习环境,安装CUDA和PyTorch,并分享那些官方文档不会告诉你的实用技巧和避坑指南。

1. 为什么选择WSL2而不是双系统或虚拟机?

传统上,开发者在Windows上运行Linux环境主要有三种选择:双系统、虚拟机或WSL。让我们通过一个对比表格来看看它们的优劣:

特性 双系统 虚拟机 WSL2
性能 接近原生
启动速度 中等
资源占用 独占
系统切换 需要重启 无需重启 无需重启
文件共享 复杂 中等 无缝
GPU支持 原生 有限 完整

WSL2的主要优势在于:

  • 接近原生的性能 :WSL2使用轻量级虚拟机技术,性能损失极小
  • 无缝集成 :可以直接在Windows资源管理器中访问Linux文件系统
  • 完整的GPU支持 :通过WSLg可以直接运行Linux GUI应用
  • 开发友好 :可以直接在VS Code中使用WSL作为开发环境

提示:如果你的主要工作是深度学习开发,WSL2提供了最佳的平衡点——既保留了Windows的易用性,又获得了Linux的开发环境。

2. 准备工作:安装WSL2和Ubuntu22.04

2.1 系统要求检查

在开始之前,请确保你的系统满足以下要求:

  • Windows 11 21H2或更高版本
  • 支持虚拟化的CPU(Intel VT-x或AMD-V)
  • 至少16GB RAM(推荐32GB用于深度学习)
  • NVIDIA显卡(CUDA支持需要)

2.2 启用WSL2功能

  1. 以管理员身份打开PowerShell,运行以下命令:
wsl --install

这个命令会自动启用所需的Windows功能并安装默认的Linux发行版。

  1. 如果你想手动控制安装过程,可以分步执行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  1. 设置WSL2为默认版本:
wsl --set-default-version 2

2.3 安装Ubuntu22.04

  1. 打开Microsoft Store,搜索"Ubuntu 22.04 LTS"并安装
  2. 安装完成后,从开始菜单启动Ubuntu,它会自动完成初始化设置
  3. 设置用户名和密码(注意:这里设置的密码不会影响Windows系统)

注意:首次启动可能需要几分钟时间来完成初始化,请耐心等待。

3. 配置Ubuntu开发环境

3.1 更换国内软件源

为了加快软件下载速度,建议更换为国内镜像源:

  1. 备份原有源列表:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
  1. 编辑源列表:
sudo nano /etc/apt/sources.list
  1. 替换为阿里云镜像源(Ubuntu22.04):
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
  1. 更新软件包列表:
sudo apt update && sudo apt upgrade -y

3.2 安装基础开发工具

运行以下命令安装常用开发工具:

sudo apt install -y build-essential git curl wget vim zsh

4. 安装CUDA Toolkit和GPU驱动

4.1 Windows端准备工作

  1. 确保Windows端已安装最新版NVIDIA驱动
  2. 下载并安装WSL2专用的CUDA驱动(从NVIDIA官网下载)

4.2 WSL2中安装CUDA Toolkit

  1. 添加NVIDIA仓库密钥:
sudo apt-key del 7fa2af80
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
  1. 添加CUDA仓库:
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/3bf863cc.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/ /"
  1. 安装CUDA Toolkit:
sudo apt update
sudo apt install -y cuda-toolkit-12-2
  1. 配置环境变量:
echo 'export PATH=/usr/local/cuda-12.2/bin${PATH:+:${PATH}}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc
source ~/.bashrc
  1. 验证安装:
nvcc --version
nvidia-smi

提示:如果nvidia-smi命令报错,请确保Windows端的NVIDIA驱动已正确安装,并且WSL2已重启。

5. 安装Miniconda和PyTorch

5.1 安装Miniconda

  1. 下载Miniconda安装脚本:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
  1. 安装Miniconda(建议安装在/opt目录):
sudo bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3
  1. 配置环境变量:
echo 'export PATH="/opt/miniconda3/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
  1. 初始化conda(选择no以避免自动激活base环境):
conda init
  1. 配置conda清华镜像源:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --set show_channel_urls yes

5.2 安装PyTorch

  1. 创建并激活conda环境:
conda create -n pytorch python=3.10
conda activate pytorch
  1. 安装PyTorch(根据你的CUDA版本选择):
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
  1. 验证PyTorch GPU支持:
python -c "import torch; print(torch.cuda.is_available())"

6. 常见问题与解决方案

6.1 WSL2内存占用过高

WSL2默认会使用最多50%的物理内存,可以通过创建 .wslconfig 文件来限制内存使用:

  1. 在Windows用户目录下创建或编辑 .wslconfig 文件:
[wsl2]
memory=8GB
swap=4GB
localhostForwarding=true
  1. 重启WSL2:
wsl --shutdown

6.2 CUDA版本不兼容

如果遇到CUDA版本不兼容问题,可以尝试以下解决方案:

  1. 检查PyTorch支持的CUDA版本:
import torch
print(torch.version.cuda)
  1. 根据PyTorch要求的CUDA版本安装对应的CUDA Toolkit

6.3 文件系统性能问题

WSL2的Linux文件系统性能优于Windows文件系统,建议:

  • 将项目文件放在Linux文件系统中( /home/username
  • 避免在Windows文件系统中直接操作Linux文件

7. 高级配置与优化

7.1 使用VS Code远程开发

  1. 在Windows上安装VS Code和"Remote - WSL"扩展
  2. 在WSL终端中进入项目目录并输入:
code .

这会自动在Windows端启动VS Code并连接到WSL环境

7.2 配置Zsh和Oh My Zsh

  1. 安装Zsh:
sudo apt install zsh
  1. 安装Oh My Zsh:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
  1. 配置主题和插件:
sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="agnoster"/' ~/.zshrc
echo 'plugins=(git python conda zsh-autosuggestions zsh-syntax-highlighting)' >> ~/.zshrc

7.3 配置Docker in WSL2

  1. 在Windows上安装Docker Desktop并启用WSL2后端
  2. 在WSL2中可以直接使用Docker命令

8. 实际项目中的应用示例

8.1 运行Jupyter Notebook

  1. 在conda环境中安装Jupyter:
conda install jupyter
  1. 启动Jupyter Notebook:
jupyter notebook --ip=0.0.0.0 --no-browser
  1. 在Windows浏览器中打开显示的URL

8.2 训练一个简单的PyTorch模型

创建一个简单的PyTorch训练脚本 train.py

import torch
import torch.nn as nn
import torch.optim as optim

# 检查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")

# 创建一个简单的模型
model = nn.Sequential(
    nn.Linear(10, 50),
    nn.ReLU(),
    nn.Linear(50, 1)
).to(device)

# 模拟数据
inputs = torch.randn(100, 10).to(device)
targets = torch.randn(100, 1).to(device)

# 训练循环
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

for epoch in range(100):
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = criterion(outputs, targets)
    loss.backward()
    optimizer.step()
    
    if epoch % 10 == 0:
        print(f"Epoch {epoch}, Loss: {loss.item():.4f}")

运行脚本:

python train.py

在实际项目中,我发现WSL2的性能表现非常接近原生Linux系统,特别是在使用CUDA加速时几乎感觉不到性能损失。最大的优势是可以随时切换回Windows环境处理其他工作,而不需要重启系统。

更多推荐