Windows 11 与 WSL2 的深度学习训练性能对比的测试中,我发现 WSL2 确实不适合做系统级的开发。从我接触的 Linux 设备驱动的角度来说,WSL2 无法安装内核模块,想要实现能够安装内核模块就需要自己编译 WSL2 的内核 https://github.com/microsoft/WSL2-Linux-Kernel
然而,当使用自定义内核时,很多模块都没有默认加载,导致我的 Docker 都没有正常工作。

Windows 对我来说最大的优势就是玩游戏方便,但据说 Linux 上的 wine 也可以运行大部分 Windows 游戏。

于是,我决定放弃 WSL,转向『LSW』,即 Linux Subsystem for Windows。

什么是 LSW?

LSW 其实是我的一个戏称,它是一个在 Docker 里面运行 Windows 的项目。

https://github.com/dockur/windows

在 Ubuntu 主机上安装好 Docker 后,使用下面的 docker-compose.yml 文件即可运行 Windows。

关于更多配置和使用方法,请参考原项目 dockur/windows

services:
  windows:
    image: dockurr/windows
    container_name: windows
    environment:
      VERSION: "11"
      DISK_SIZE: "64G"
      RAM_SIZE: "4G"
      CPU_CORES: "4"
      USERNAME: "username" # 替换为你的 Windows 用户名
      PASSWORD: "password" # 替换为你的 密码
      LANGUAGE: "Chinese"
      USER: "username" # 这个 username 用于从 Web 访问的验证
      PASS: "password" # 这个 password 用于从 Web 访问的验证
    devices:
      - /dev/kvm
      - /dev/net/tun
    cap_add:
      - NET_ADMIN
    ports:
      - 8006:8006
      - 3389:3389/tcp
      - 3389:3389/udp
    volumes:
      - ./storage:/storage
      - ./shared:/data
    restart: always
    stop_grace_period: 2m

启动 Docker 容器后,可以通过浏览器访问 http://localhost:8006 来使用 Windows。

容器内置了 RDP 服务,可以通过 RDP 客户端连接到 Windows 桌面。 Ubuntu 上可以使用 Remmina 或者其他 RDP 客户端。

整体的使用体验是延迟还在可以接受的范围内,在需要运行那些只有 Windows 支持的应用时,可以通过这个方式来运行。

⚠️ 如果你的 Windows 容器可能会暴露在公网,请务必设置 USER 和 PASS 环境变量来设置访问密码,否则任何人都可以访问你的 Windows 容器。

我感觉我的 Windows 容器就被人黑了: https://github.com/dockur/windows/issues/1321

但是玩游戏就不太行了,毕竟 Docker 的虚拟化吃不到 GPU 的性能。

但对于玩游戏,Linux 上有自己的解决方案。

Linux 的游戏性能

Steam 是有 Linux 版本的,很多 Steam 上的游戏都可以在 Linux 上运行。

但对于我这种玩盗版游戏的人来说,Steam 支持的再好我也用不上。

于是,我转向了 wine

Wine (“Wine Is Not an Emulator” 的首字母缩写)是一个能够在多种 POSIX-compliant 操作系统(诸如 Linux,macOS 及 BSD 等)上运行 Windows 应用的兼容层。Wine 不是像虚拟机或者模拟器一样模仿内部的 Windows 逻辑,而是將 Windows API 调用翻译成为动态的 POSIX 调用,免除了性能和其他一些行为的内存占用,让你能够干净地集合 Windows 应用到你的桌面。

Ubuntu 上 Wine 的安装过程参考 Wine 官方文档,我就不做无脑搬运了。

个人推荐安装 Staging branch 的 Wine,它的性能和稳定性应该介于 Stable branchDevelopment branch 之间。

安装完成后,即可通过 wine xxx.exe 来运行 Windows 应用。第一次运行时会自动创建 Wine 的配置目录,通常在 ~/.wine 下。

使用 winecfg 可以打开 Wine 的配置界面,可以设置 Windows 版本、音频驱动等。

你可能会遇到一些字体相关的问题,我采用了以下方法来解决:

https://blog.csdn.net/hknaruto/article/details/1363384251

玩游戏时可能会遇到一些依赖库缺失的问题,可以通过 winetricks 来安装一些常用的 Windows 组件。

我都是把终端输出的错误信息复制到 AI,它让我安装什么我就安装什么。

最后我用两个最近在玩的游戏来测试了一下 Wine 的性能。

  1. 空洞骑士

Wine 玩空洞骑士这种级别的游戏是完全没问题的,性能和 Windows 上差不多。完全感觉不到有任何卡顿。

截图左上角可以看到我的显卡和显卡驱动信息。帧率也很高,基本上在 400 FPS 左右。

  1. 双影奇境

我的主机使用 Wine 玩双影奇境时,帧率波动较大,会出现卡顿现象。

我使用的是 4K 显示器 + 高画质设置,帧率大概在 120-140 FPS 之间。但在某些场景下FPS会骤降,造成明显的卡顿。

在 Windows11 上玩双影奇境时,我几乎也是这个画质设置,没有测过帧率,但从没有发生过卡顿。

Linux 深度学习训练性能

装了 Ubuntu 系统后,我又测试了一下原生 Linux 系统的深度学习训练性能。

我使用了和Windows 11 与 WSL2 的深度学习训练性能对比相同的测试脚本和数据集。

测试结果如下:

  • Total training time for 50 epochs: 893.31 seconds
  • Total training time for 1 epochs: 16.84 seconds

果然还是原生 Linux 系统的性能最好。

在上次的测试中,我观察到 GPU 的使用率在每个 epoch 结束时会下降,WSL2 的下降幅度和时间都比 Windows 11 短很多。

测试过程中我发现在 Windows 11 系统中,在每个 epoch 结束时,GPU 的使用率会下降到 0%,并且要等待较长一段时间(相比每个 batch 的时间)才会恢复到正常的使用率。
而在 WSL2 中,也有 GPU 使用率下降的情况,但下降的幅度和时间都比 Windows 11 短很多。

在这次测试中,我也留意了一下这个现象还有没有再发生,但是因为没有像 Windows 任务管理器那样直观的 GPU 使用率显示,所以我不太确定是否有类似的现象。

btop 的绘图来看,似乎 GPU 使用率也存在下降的情况,但这应该是因为每个 epoch 结束时,模型的训练过程中的一些额外计算或数据处理等造成的正常现象。