将 VSCode 连接到远程主机上的 WSL

一些生活小技巧(

0. 问题

我在上 AI 基础课时遇到了这样一个问题:

  • 我有两台设备,以下记为 A 和 B,均安装 Windows 操作系统。
  • A 是轻薄本,没有配备独立显卡,因此我不希望使用 A 训练模型。
  • B 配备了独立显卡,但是重量大于 A,续航小于 A,因此我不希望在白天上课的时候带着 B 跑来跑去。
  • 我需要训练模型,但是训练模型需要很长时间,并且我需要根据训练效果调整参数。

我在上这个课的时候采取的方案:

  • 强行使用 A 的 CPU 训练模型。但是这样不仅训练得慢,A 还会失去其续航优势。
  • 使用市面上的远程桌面软件,但也会大幅降低 A 的续航,并且操作着也很卡。
  • 白天上课带着 B。但是跑模型的话 B 的续航就更短了,可能一节课下来就没电了。并且我带着 B 跑来跑去也很累。
  • 只在晚上回宿舍时操作 B。但是这样(尤其在模型较小时)会有大量时间空机,可能在作业 ddl 之前也调不出足够好的参数。

显然这些方案都不够好。因此我(后来)研制了一个新的方案,可以使用 A 的 VSCode(也包括 Cursor、TRAE 等采用 VSCode 内核的 IDE)直连 B 的 WSL,并直接在 VSCode 内编辑 / 运行代码,也可以直接使用 Cursor 等 IDE 的 AI 功能。

这样就可以把算力更强的设备放在家 / 宿舍里面开着运行训练模型等算力密集的任务,并使用随身携带的设备随时远程进行各种操作(例如调参数并重新训练等等)以充分利用机时改良参数,改善 AI 基础课程的学习体验。

1. 保持设备唤醒

我们需要在无法直接操作 B 的情况下保持 B 唤醒,才能随时从 A 通过 SSH 连接到 B。

直接在设置里面改电源设置可能由于各种原因无法保持设备唤醒。这里推荐使用 Microsoft PowerToys Awake。设置为“无限期保持唤醒状态”即可保持唤醒。

当然还有一个要注意的点是:如果你的 B 设备放在家里,注意提醒家里人不要把你 B 设备的电源拔了……

2. 连接到同一局域网

如果 B 在家里,那么由于 B 连接的是家里的局域网而 A 连接的是学校的局域网,将无法直接从 A 到 B 建立 SSH 连接。

这里可以使用 ZeroTier 将 A 和 B 连接到同一个虚拟局域网。连接后,A 和 B 将获得同一个私有 IP 地址(默认似乎形如 10.144.x.x,不过可以改)。

连接完成后,托盘里面会出现一个 ZeroTier UI 的图标。右键 → 你创建的网络名 → Managed Addresses 查看分配的私有 IP。从 A 设备 ping 一下 B 设备的私有 IP 查看局域网是否配置正确。

3. 端口转发

此时 A 还无法看到 B 的 WSL。如果你觉得直接在 Windows 下面开发也没啥问题,那么可以跳过这一步,直接在 A 的 VSCode 里面通过 SSH 连接到 B,然后就完事了。

如果你希望使用 WSL,则首先在 WSL 内部安装并启动 ssh 服务,然后查询 WSL 自己的 IP 地址用于端口转发。对于 Ubuntu,可以使用 ip addr,形如 172.x.x.x 的地址就是我们需要的地址,以下记为 <WSL_IP>

接下来在 Windows 中执行端口转发。以管理员权限运行以下命令以建立端口转发规则:

1
2
3
netsh interface portproxy add v4tov4 ^
listenport=2222 listenaddress=0.0.0.0 ^
connectport=22 connectaddress=<WSL_IP>

其中 2222 可以换成任意你喜欢的端口。在设置前可以查看已有规则避免冲突。

建立后在防火墙中放行对应端口:

1
2
netsh advfirewall firewall add rule name="WSL2-SSH" ^
dir=in action=allow protocol=TCP localport=2222

这一步完成后,即可在 A 上通过命令 ssh <WSL_Username>@<B_ZT_IP> -p 2222 与 B 的 WSL 建立 SSH 连接,其中 <WSL_Username> 是 WSL 的用户名,<B_ZT_IP> 是 B 在 ZeroTier 网络中的虚拟地址。

4. VSCode 直连

直接安装 Remote-SSH 插件,或者在一些地方(例如开始界面)找到 连接远程主机 → SSH,并按照提示操作即可。操作很直白,不做赘述。如果需要输入 SSH 连接命令,命令就是 ssh <WSL_Username>@<B_ZT_IP> -p 2222

至此即大功告成!


但是考虑到自己买的设备再强大也是消费级设备,要做工业级实验必须得租算力 / 偷实验室的算力,而连服务器一般也不用自己配所有这些东西(服务器端一般都帮你配好了),所以这只是个面向应付课程 / 自己瞎玩的场景的解决方案。