背景
工作学习要用 Ubuntu,打游戏要用 Windows,双系统的方案开关机不太方便,而且也不是很稳定,这一点在读研期间就尝试过。
听说 WSL2 可以在 Hyper-V 上直接运行 Linux(微软定制版 kernel),性能比 WSL1 有了很大提升。
所以本文要测试一下在 Windows 11 上的 WSL2 和原生 Windows 11 系统上进行深度学习训练的性能差异。
B 站视频中也查到了相关的测试,基本上是 WSL2 比 Windows 11 快很多,百分之25?
但本着求真务实的态度,还是自己测试一下。
测试环境
硬件配置
参考这里关于配置选择的内容。
系统环境
- Windows 11
Windows 11 系统信息
- WSL2(Ubuntu 24.04)
wsl 版本:
PS C:\Users\wgxls> wsl --version
WSL 版本: 2.4.13.0
内核版本: 5.15.167.4-1
WSLg 版本: 1.0.65
MSRDC 版本: 1.2.5716
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.26100.1-240331-1435.ge-release
Windows 版本: 10.0.26100.4061
Linux 版本:
root@wgxls-desktop:~# neofetch
.-/+oossssoo+/-. root@wgxls-desktop
`:+ssssssssssssssssss+:` ------------------
-+ssssssssssssssssssyyssss+- OS: Ubuntu 24.04.2 LTS on Windows 10 x86_64
.ossssssssssssssssssdMMMNysssso. Kernel: 5.15.167.4-microsoft-standard-WSL2
/ssssssssssshdmmNNmmyNMMMMhssssss/ Uptime: 1 hour, 20 mins
+ssssssssshmydMMMMMMMNddddyssssssss+ Packages: 886 (dpkg)
/sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Shell: bash 5.2.21
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Theme: Adwaita [GTK3]
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Icons: Adwaita [GTK3]
ossyNMMMNyMMhsssssssssssssshmmmhssssssso Terminal: vscode
ossyNMMMNyMMhsssssssssssssshmmmhssssssso CPU: AMD Ryzen 7 9700X (16) @ 3.799GHz
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ GPU: 45bb:00:00.0 Microsoft Corporation Basic Render Driver
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Memory: 1383MiB / 31250MiB
/sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
+sssssssssdmydMMMMMMMMddddyssssssss+
/ssssssssssshdmNNNNmyNMMMMhssssss/
.ossssssssssssssssssdMMMNysssso.
-+sssssssssssssssssyyyssss+-
`:+ssssssssssssssssss+:`
.-/+oossssoo+/-.
软件环境
- python 环境
python 版本使用的是 3.10,没有使用更高的版本是担心我的老代码可能不兼容。
cuda 版本都使用的 12.8,没有在系统环境中安装什么 cuda 和 cudnn,直接使用 pytorch 的包管理器安装。
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
- 测试代码
测试代码使用我的毕业论文代码,我手上可以拿来直接跑的就只有这一份。
我总共进行了 2 次测试,分别是 1 个 epoch 和 50 个 epoch 的训练。
测试一: 测试 50 个 epoch 的训练时间
训练的过程其实就是 2 个 for 循环,外层循环是 epoch,内层循环是每个 batch 的训练。
训练数据总共是 800 张图像,每个 batch 的大小是 8,所以每个 epoch 有 100 次迭代。
我在代码中记录了开始和结束时间。
def train(config):
...
start_time = time.time() # 记录开始时间
for epoch in range(config.num_epochs):
for iteration, data in enumerate(train_loader):
...
optimizer.step()
end_time = time.time() # 记录结束时间
print(f"Total training time for {config.num_epochs} epochs: {end_time - start_time:.2f} seconds")
测试二: 测试 1 个 epoch 的训练时间
同样的代码,只是将 config.num_epochs
改为 1。
更改了记录开始和结束时间的位置如下:
def train(config):
...
for epoch in range(config.num_epochs):
start_time = time.time() # 记录开始时间
for iteration, data in enumerate(train_loader):
...
optimizer.step()
end_time = time.time() # 记录结束时间
print(f"Total training time for {config.num_epochs} epochs: {end_time - start_time:.2f} seconds")
下文介绍结果时会解释为什么我还要测试 1 个 epoch 的训练时间。
注: 按网上的说法,WSL2 访问 Windows 文件系统的速度很慢,所以在测试WSL2 时,我将数据集放在了 WSL2 的文件系统中,而不是 Windows 的文件系统中。
测试结果
测试一: 测试 50 个 epoch 的训练时间
结果如下:
- Windows 11: Total training time for 50 epochs: 1298 seconds
- WSL2: Total training time for 50 epochs: 944 seconds
WSL2 比 Windows 11 快 37.5%
测试过程中我发现在 Windows 11 系统中,在每个 epoch 结束时,GPU 的使用率会下降到 0%,并且要等待较长一段时间(相比每个 batch 的时间)才会恢复到正常的使用率。
Windows 11 GPU占用
而在 WSL2 中,也有 GPU 使用率下降的情况,但下降的幅度和时间都比 Windows 11 短很多。
WSL2 GPU占用
我没有深入调查这个现象的原因,但我猜测可能是 Windows 11 在每个 epoch 结束时会进行一些额外的操作,所以我又进行了测试二,只测试一个 epoch 的训练时间。
测试二: 测试 1 个 epoch 的训练时间
结果如下:
- Windows 11: Total training time for 1 epochs: 25.83 seconds
- WSL2: Total training time for 1 epochs: 18.86 seconds
WSL2 比 Windows 11 快 36.95%
结果竟然和测试一的结果差不多,WSL2 依然比 Windows 11 快很多。
总结
WSL2 在深度学习训练性能上确实比 Windows 11 快很多,约为 37% 左右。
考虑到 WSL2 和 Windows 11 之间的交互非常丝滑,如果你平时对 Linux 的需求主要在于一些应用层的开发和测试,WSL2 是一个非常不错的选择。基本上是开箱即用。
但如果你对 Linux 的需求是在系统层面工作,比如驱动开发、内核模块开发等,WSL2 可能就不太适合了。
因为我发现这个 kernel 里面 lsmod
竟然什么都没有。
root@wgxls-desktop:~# lsmod
Module Size Used by
要么放弃 Windows,用原生 Linux 系统。