1. 为什么选择Win11 + WSL2 + Docker Desktop方案
如果你是一名Windows用户,想要搭建深度学习环境,过去可能会面临各种兼容性问题。传统的方案要么性能损失严重,要么配置复杂到让人抓狂。而Win11 + WSL2 + Docker Desktop的组合,可以说是目前Windows平台上最优雅的解决方案。
我最初尝试在Windows上直接安装CUDA和PyTorch,结果被各种依赖冲突折磨得够呛。后来转向WSL2,发现虽然解决了Linux环境的问题,但每次切换项目都要重新配置环境。直到用上Docker Desktop,才真正体会到什么叫"一次配置,到处运行"的爽快感。
这个方案最大的优势在于:
- 性能接近原生Linux:WSL2使用了真正的Linux内核,GPU直通技术让CUDA性能损失不到5%
- 环境隔离干净:每个项目可以用不同的Docker镜像,再也不用担心库版本冲突
- 开发体验统一:VS Code可以无缝连接WSL和Docker环境,代码补全、调试都能正常使用
- 部署方便:本地调试好的镜像可以直接推送到生产服务器
实测下来,在RTX 4090上训练ResNet50,这个方案比原生Windows快3倍,比虚拟机方案快5倍以上。更重要的是,再也不用担心把系统搞崩了——环境出问题?删掉容器重来就行。
2. 环境准备与基础配置
2.1 安装WSL2并配置Ubuntu
首先确保你的Windows 11版本不低于22000,建议更新到最新版。按下Win+X选择"终端(管理员)",依次执行以下命令:
# 启用WSL功能 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # 启用虚拟机平台 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart # 设置WSL2为默认版本 wsl --set-default-version 2重启电脑后,打开Microsoft Store安装Ubuntu 22.04 LTS。第一次启动时会提示设置用户名和密码,这里要注意:
- 用户名不要用大写字母,后续Docker挂载目录时可能会出问题
- 密码可以简单点,反正只在WSL内使用
安装完成后,建议执行以下优化配置:
# 更新软件源 sudo apt update && sudo apt upgrade -y # 安装常用工具 sudo apt install -y build-essential curl wget git # 配置SSH(可选但推荐) sudo apt install -y openssh-server sudo sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config sudo service ssh restart2.2 安装NVIDIA驱动
Windows和WSL2共享同一套NVIDIA驱动,所以只需要在Windows端安装最新驱动即可。去NVIDIA官网下载Game Ready驱动,不要选Studio驱动。
安装完成后,在PowerShell和WSL中分别执行nvidia-smi,应该能看到相同的输出。如果WSL中报错,可能是WSL版本太旧,执行wsl --update升级内核。
我遇到过的一个坑是:某些笔记本的双显卡机型需要在BIOS中禁用集成显卡,否则WSL2无法正确识别独立显卡。如果你发现nvidia-smi显示"No devices were found",可以尝试这个方案。
3. Docker Desktop深度配置
3.1 安装与WSL2集成
从Docker官网下载Docker Desktop for Windows,安装时务必勾选"Use WSL 2 based engine"选项。安装完成后不要立即启动,先做以下配置:
- 打开Docker Desktop设置
- 在"General"中启用"Start Docker Desktop when you log in"
- 在"Resources" → "WSL Integration"中,为你安装的Ubuntu发行版启用集成
启动Docker Desktop后,在WSL终端执行docker info,应该能看到类似这样的输出:
Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 24.0.6 Storage Driver: overlay2 Backing Filesystem: extfs Logging Driver: json-file Cgroup Driver: systemd Cgroup Version: 2 ...3.2 配置NVIDIA Container Toolkit
为了让Docker容器能使用GPU,需要安装NVIDIA Container Toolkit。在WSL中执行以下命令:
# 添加GPG密钥 curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg # 添加仓库 curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list # 安装工具包 sudo apt update sudo apt install -y nvidia-container-toolkit # 配置Docker运行时 sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker验证配置是否成功:
docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi这个命令会下载一个基础CUDA镜像并运行nvidia-smi,你应该能看到和宿主机相同的GPU信息。
4. 构建PyTorch深度学习环境
4.1 使用官方预构建镜像
PyTorch官方提供了丰富的Docker镜像,我们可以直接拉取使用:
# 拉取PyTorch镜像 docker pull pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime # 运行容器并挂载代码目录 docker run -it --gpus all -v $(pwd):/workspace --ipc=host pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime这里有几个重要参数:
--gpus all:让容器访问所有GPU-v $(pwd):/workspace:把当前目录挂载到容器的/workspace--ipc=host:解决多进程共享内存问题
进入容器后,可以验证PyTorch是否正常识别GPU:
import torch print(torch.__version__) # 应该输出2.1.0 print(torch.cuda.is_available()) # 应该输出True4.2 自定义镜像构建
对于正式项目,建议基于官方镜像构建自定义Dockerfile。创建一个Dockerfile文件:
FROM pytorch/pytorch:2.1.0-cuda12.1-cudnn8-devel # 设置清华镜像源 RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 安装项目依赖 COPY requirements.txt . RUN pip install -r requirements.txt # 设置工作目录 WORKDIR /workspace CMD ["/bin/bash"]然后构建镜像:
docker build -t my-pytorch .我习惯为每个项目创建单独的镜像,这样不同项目的依赖完全隔离。比如一个做CV的镜像可以安装OpenCV,另一个做NLP的镜像安装transformers。
5. 开发环境实战技巧
5.1 VS Code远程开发配置
VS Code的Remote - WSL和Remote - Containers扩展是绝配。安装扩展后:
- 在WSL中进入项目目录,执行code .
- VS Code会自动连接到WSL环境
- 按F1输入"Remote-Containers: Attach to Running Container",选择你的PyTorch容器
现在你就能在容器内开发了,所有代码补全、调试功能都能正常使用。更棒的是,VS Code会自动帮你处理Python环境配置。
5.2 数据科学工作流优化
对于数据科学项目,我推荐以下配置:
docker run -it --gpus all \ -v $(pwd):/workspace \ -v /path/to/dataset:/data \ -p 8888:8888 -p 6006:6006 \ --ipc=host \ my-pytorch然后可以在容器内启动Jupyter Lab和TensorBoard:
jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root tensorboard --logdir=/workspace/logs --host 0.0.0.0 --port 6006这样在Windows浏览器访问localhost:8888就能用Jupyter,访问localhost:6006查看TensorBoard。
5.3 常见问题排查
CUDA out of memory错误:尝试减小batch size,或者在docker run时添加--shm-size=8g参数。
Docker容器启动慢:可能是WSL2虚拟硬盘碎片化,执行以下命令优化:
wsl --shutdown optimize-vhd -Path "C:\Users\YourName\AppData\Local\Packages\Canonical...\ext4.vhdx" -Mode Full显卡无法识别:首先确保Windows和WSL中nvidia-smi都能正常工作。如果不行,尝试:
# 在WSL中检查NVIDIA设备 ls /dev/nvidia*如果缺少设备文件,可能需要更新WSL内核或NVIDIA驱动。