在 GPU 云服务器上跑训练或推理任务时,Jupyter Lab / Notebook 是最常用的交互式开发环境。但云端启动 Jupyter 和本地开发有几个关键差异:需要远程访问、要考虑安全性、SSH 断开后进程可能终止,以及按小时计费时关机和销毁对费用的影响不同。
这篇文章给出在租用的 GPU 实例上启动 Jupyter 并安全连接的标准做法,以及如何避免不必要的存储费用。
启动 Jupyter:三个必加参数
在云服务器上启动 Jupyter Lab 时,需要添加几个参数来适配远程无头环境:
jupyter lab --no-browser --ip=0.0.0.0 --port=8888--no-browser:云服务器没有图形界面,防止尝试打开本地浏览器--ip=0.0.0.0:允许非本地环回的网络请求(默认只监听 127.0.0.1)--port=8888:指定端口,默认也是 8888,显式写出便于后续端口转发
如果你是以 root 用户登录或在容器内运行,还需要加上:
jupyter lab --no-browser --ip=0.0.0.0 --port=8888 --allow-root启动后终端会输出带 Token 的访问链接,类似:
http://127.0.0.1:8888/lab?token=abc123def456...这个 Token 是首次登录的凭证,保存好。
如果还没环境
首次租 GPU 云服务器时,从零配置 Python、CUDA、PyTorch 容易踩坑(驱动版本不匹配、编译时间长)。可以直接选预装好依赖的镜像模板,Jupyter 和常用框架都配好了,开机即用。NexGPU 的镜像模板页面列出了 PyTorch、TensorFlow、ComfyUI 等场景的一键部署选项,按你要跑的任务选就行。
连接方式:SSH 隧道比公网直连安全
启动 Jupyter 后,有两种访问方式:
- 公网直接访问:云服务器安全组开放 8888 端口,浏览器输入
http://<服务器公网IP>:8888访问 - SSH 端口转发:Jupyter 只监听本地环回,通过 SSH 隧道把远程端口映射到本地
公网直连的问题是端口暴露在互联网上,即使有 Token 保护,也容易被端口扫描工具发现并尝试暴力破解。而且还需要额外配置云服务商的安全组规则,多一层操作。
推荐做法是 SSH 本地端口转发(Local Port Forwarding),既安全又省事。
具体步骤
1. 在云服务器上启动 Jupyter,监听本地环回
jupyter lab --no-browser --port=8888注意这里不需要 --ip=0.0.0.0,默认监听 127.0.0.1 就行,外部无法直接访问。
2. 在本地终端建立 SSH 隧道
打开新的本地终端窗口(不要关闭运行 Jupyter 的那个),执行:
ssh -N -L 8888:localhost:8888 user@server_ip-N:不执行远程命令,只做端口转发-L 8888:localhost:8888:把远程的 8888 端口映射到本地 8888 端口user@server_ip:替换成你的云服务器登录用户和公网 IP
如果云服务器 SSH 端口不是默认 22,加上 -p 参数:
ssh -N -L 8888:localhost:8888 -p 2222 user@server_ip隧道建立后这个终端会挂起(没有任何输出是正常的),不要关闭。
3. 本地浏览器访问
打开浏览器,访问 http://localhost:8888,粘贴启动 Jupyter 时输出的 Token,即可登录。
这种方式下,数据流完全走 SSH 加密通道,外部无法直接访问云服务器的 8888 端口,也不需要修改安全组规则。

如果本地 8888 端口已被占用,可以映射到其他端口,比如本地 8889:
ssh -N -L 8889:localhost:8888 user@server_ip然后访问 http://localhost:8889。
保持后台运行:断开 SSH 不中断任务
上面的启动方式有个问题:一旦关闭 SSH 终端(或网络抖动断连),Jupyter 进程会被终止,正在跑的训练或推理任务也会中断。
跑长时间任务时,需要用工具让 Jupyter 在后台持久运行。
方案一:tmux 会话管理
tmux 是终端复用工具,可以创建独立的会话,SSH 断开后会话仍在后台运行。
安装 tmux(大部分云镜像已预装):
# Ubuntu/Debian
sudo apt install tmux
# CentOS/RHEL
sudo yum install tmux使用流程:
- SSH 登录云服务器后,创建新会话:
tmux new -s jupyter- 在 tmux 会话中启动 Jupyter:
jupyter lab --no-browser --port=8888- 按
Ctrl+B然后按D键,离开(detach)会话但不终止,Jupyter 继续在后台运行 - 关闭 SSH 或重新登录后,用这个命令恢复会话:
tmux attach -t jupyter就能重新看到 Jupyter 的运行日志。查看所有会话:tmux ls。
方案二:nohup 后台启动
如果不想用 tmux,可以用 nohup 把 Jupyter 放到后台:
nohup jupyter lab --no-browser --port=8888 > jupyter.log 2>&1 &nohup:忽略挂断信号,SSH 断开后继续运行> jupyter.log 2>&1:把输出和错误重定向到日志文件&:放到后台执行
启动后会返回进程 ID,可以通过 tail -f jupyter.log 查看日志,找到 Token。
停止 Jupyter 时,先找到进程 ID:
ps aux | grep jupyter然后 kill 对应的 PID:
kill <PID>费用边界:关机和销毁的区别
在按小时计费的 GPU 云服务上,理解实例生命周期对控制成本很重要。
以 NexGPU 为例,计费项只有三项:算力、存储、流量。关键区别在于:
- 关机(Stop):停止算力计费,但存储费继续扣,因为你的系统盘、代码、模型权重文件都还保留着,下次开机可以直接继续用
- 销毁(Destroy):彻底删除实例和所有数据,停止全部扣费
实际使用中的策略:
短期中断:比如晚上不跑任务了,但明天还要继续,选关机。第二天开机后,Jupyter Notebook、虚拟环境、下载的数据集都还在,用 tmux attach 或重新启动 Jupyter 就能接着干。存储费按小时算,几十 GB 的系统盘一天也就几毛到一两块钱。
任务结束:模型训练完、权重文件已经下载到本地,短期内不会再用这个实例,就销毁。如果只是关机,存储费会一直扣,几天下来可能比算力费还多。
保存工作成果:销毁前记得备份:
- Jupyter Notebook 文件(.ipynb)
- 训练好的模型权重
- 自定义的配置文件
可以用 scp 或 rsync 从云端下载到本地,或者传到对象存储。下次租新实例时,上传回去或从对象存储拉取。
NexGPU 的账单可以在控制台实时查看,算力和存储分开列,能清楚看到关机后存储费在跑。如果不确定要租多久,可以先看价格页面的单价,按你的存储量估算成本。
常见问题
Q:SSH 隧道建立后浏览器无法访问 localhost:8888
检查:
- Jupyter 是否正常启动(没有报错退出)
- SSH 隧道命令中的端口号是否和 Jupyter 启动端口一致
- 本地 8888 端口是否被其他程序占用(换个端口试试)
- SSH 隧道是否断开(重新执行
ssh -N -L命令)
Q:Token 丢了怎么办
在运行 Jupyter 的终端或 tmux 会话里,按 Ctrl+C 停止 Jupyter,重新启动会生成新 Token。或者用这个命令列出当前所有 Token:
jupyter server listQ:能不能设置密码代替 Token
可以。首次启动后,在 Jupyter 界面的设置里可以配置密码。或者用命令行生成密码哈希:
jupyter lab password按提示输入密码,下次启动就可以用密码登录。不过 SSH 隧道本身已经很安全,Token 也够用。
Q:多个 Jupyter 实例能同时跑吗
可以,指定不同端口就行:
# 第一个实例
jupyter lab --no-browser --port=8888
# 第二个实例
jupyter lab --no-browser --port=8889本地建立两条隧道,分别映射到不同端口。
总结操作顺序:选镜像开实例 → SSH 登录 → tmux 新建会话 → 启动 Jupyter → 本地建 SSH 隧道 → 浏览器访问 localhost 粘贴 Token → 任务跑完下载结果 → 销毁实例停止全部扣费。SSH 端口转发省去安全组配置,tmux 保证断线不影响任务,关机和销毁分清楚就能控制成本。
NexGPU-算力租赁,GPU服务器,GPU云算力,AI服务器租用-新闻博客
评论(0)