前言
故事是这样的。
我在做 AIGC 相关的开发,主力环境是一台没有公网 IP 的 GPU 实例以及一台阿里云灵构服务器,主要用来跑 ComfyUI、训练模型。
但使用过程中有几个让人难受的问题:
- 阿里云官方自带的远程桌面控制延迟巨大,体验感太差
- 文件传输太过麻烦,阿里云灵构需要借助网盘中转,而魔搭 WebIDE 有文件大小限制
我第一时间想到的解决办法就是内网穿透,不过第三方的穿透工具不太稳定,要么限速要么频繁掉线。刚好手上有一台 99 元的阿里云服务器,我寻思着不用也是浪费,干脆直接拿它来当做跳板机
不过我并没有考虑自建 frp 的方式来实现穿透,因为安装软件比较麻烦,每台目标机器都要安装 frpc 客户端的话太消耗时间,
本来薅来的免费 GPU 算力时长就有限,所以省事高效是第一原则。
于是我选择了 SSH 反向隧道的方式来穿透
我想要的效果是:
- 本地 VS Code 直接打开远程 GPU 的终端,并实现文件实时编辑和传输
- 本地浏览器直接访问
127.0.0.1:8188操作 ComfyUI - 服务器和本地电脑重启后自动打通隧道
实现原理
穿透的本质就是借道,借有公网IP服务器的道
网络拓扑如下:
1 | ┌──────────┐ SSH 隧道 ┌──────────┐ 反向隧道 ┌──────────┐ |
关键点只有三个:
- GPU 主动连阿里云(因为 GPU 能出网,阿里云有公网)
- 建立反向隧道(-R):把 GPU 的端口“伸”到阿里云本机
- 本地再连阿里云(-L):把本地端口“引”到阿里云
最终效果:
localhost:8188→ 阿里云 → GPU 的 ComfyUI- VS Code
ssh gpu→ 阿里云 → GPU 的终端
具体实现
准备工作:阿里云侧
确保阿里云允许端口转发:
1 | # 在阿里云上执行 |
这里需要明白的是,由于我们走的是 SSH 22 端口通道,所以无需去阿里云安全组开放 2222 和 8188 等端口,有公网 ip 即可,22 端口默认都是开放的
第一步:GPU 实例配置
执行以下指令,让GPU 实例主动将端口暴露给阿里云服务器(记得将IP替换成你的):
1 | # 1. 创建 GPU 专用密钥 |
当然了,如果你不想每次手动挨个复制命令,我还准备了一键安装脚本,以下是在 GPU 上跑的脚本,核心逻辑是:密钥复用 + 反向隧道 +前台运行:
1 |
|
将脚本上传到 GPU 实例中并执行,启动反向隧道(记得将阿里云IP替换成你的服务器)
如果你不想每次启动服务器都运行一遍脚本, 那我们可以开启 systemd后台运行, 以下是补充开机自启动功能的版本:
1 |
|
两个版本, 根据自身需求任选其一即可
第二步:本地电脑的配置
在本地电脑终端执行以下命令
1 | # 1. 创建 SSH 密钥 |
此时我们在浏览器上直接输入http://127.0.0.1:8188即可访问 GPU 实例中的 ComfyUI了
但是我还要实现终端访问,所以我们需要另起一个终端,并输入以下指令:
1 | ssh -J root@阿里云公网 IP:22 -p 2222 ubuntu@127.0.0.1 |
或者
在用户目录下的 config文件中添加如下配置:
1 | # ===== 阿里云跳板机 ===== |
然后在终端中运行 ssh gpu,一样的效果,不过为了方便 VS Code连接,建议采用配置的形式
这里需要注意的是, GPU 部分的 User字段该填 root还是 ubuntu ,取决于你的 GPU 服务器的设置,可以运行以下指令查看是否为root:
1 |
|
同样的,本地电脑也有一键配置脚本,全自动化的同时不破坏原有的 SSH配置,如下:
1 |
|
该脚本兼容 Mac 和 Linux 平台
直接拷贝到本地电脑运行即可,(记得将阿里云IP替换成你的服务器IP)
第三步:将本地电脑公钥拷贝至GPU服务器
隧道打通之后, 阿里云服务器作为跳板机只负责数据传输, 不负责身份的验证
要想实现本地和GPU服务器ssh访问, 必须将本地的comfy_key公钥拷贝至GPU服务器的./ssh/authorized_keys文件中
在 GPU 终端里执行以下命令:
1 | # 1. 创建目录(没有就建,有了也不报错) |
或者直接从阿里云中复制公钥:
1 | # 1. 创建目录和文件(没有就建) |
第四步:开始访问
到这里,我想大家应该都知道怎么用了,这里之所以推荐大家使用VS Code的Remote-SSH插件 来连接,因为它既可以访问终端,又能访问文件,省去了手敲命令,一举两得,而且用起来也比较方便:
在VS Code里:
F1→Remote-SSH: Connect to Host- 选择
gpu
会直接进到 GPU 的终端
它和阿里云是独立的互不影响,你想访问阿里云终端,还是按照原来的 ssh -p 22 root@阿里云公网 IP就行
多 GPU 怎么扩展?
假设我有 3 台 GPU,做法是:
| GPU | SSH 端口 | ComfyUI 端口 |
|---|---|---|
| gpu-01 | 2222 | 8188 |
| gpu-02 | 2223 | 8189 |
| gpu-03 | 2224 | 8190 |
本地 ~/.ssh/config:
1 | Host gpu-01 |
VS Code 可以同时连多台 GPU,互不干扰。
问题汇总
ssh gpu登录GPU提示需要输入root@127.0.0.1 password问题出在公钥上, 检查本地
comfy_key.pub公钥和GPU中authorized_keys中存储的公钥是否一致另外有一点需要注意的是, 不要使用老版
ssh-rsa格式密钥, 目前很多新系统, 推荐使用新的ssh-ed25519格式密钥关于密钥问题
本地连接阿里云和连接
GPU服务器可以使用不同的密钥, 比如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# Managed by local_tunnel.sh
# 连接阿里云使用aliyun密钥对, 连接gpu使用comfy_key密钥对
Host aliyun
HostName 阿里云服务器IP
User root
Port 22
IdentityFile /Users/xxx/.ssh/aliyun
StrictHostKeyChecking accept-new
Host gpu
HostName 127.0.0.1
Port 2222
User root
ProxyJump aliyun
IdentityFile /Users/xxx/.ssh/comfy_key
IdentitiesOnly yes隧道建立是先连接阿里云服务器, 成功后再连接GPU服务器, 阿里云只负责数据中转, 而不会拿着
comfy_key密钥去替我们连接GPU, 这点需要明白,所以, 他们不一定非得使用相同密钥对, 之前我们为了方便管理和使用, 共用了相同的
comfy_key密钥
本文为作者原创 转载时请注明出处 谢谢
