一些生活小技巧(
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 | netsh interface portproxy add v4tov4 ^ |
其中 2222 可以换成任意你喜欢的端口。在设置前可以查看已有规则避免冲突。
建立后在防火墙中放行对应端口:
1 | netsh advfirewall firewall add rule name="WSL2-SSH" ^ |
这一步完成后,即可在 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。
至此即大功告成!
但是考虑到自己买的设备再强大也是消费级设备,要做工业级实验必须得租算力 / 偷实验室的算力,而连服务器一般也不用自己配所有这些东西(服务器端一般都帮你配好了),所以这只是个面向应付课程 / 自己瞎玩的场景的解决方案。