LeRobot入门教程 05:远程开发工具
1. 远程使用 Jupyter
Jupyter Notebook 适合交互式实验:写一段代码,马上看结果。
远程服务器上的 Jupyter 通常有两种用法。
方法一:平台自带网页入口
Autodl平台会直接给一个 JupyterLab 链接。你只需要在本地浏览器打开即可。
方法二:SSH 端口转发
如果服务器上已经运行:
jupyter lab --no-browser --port=8888
你可以在本地新开一个终端,执行端口转发:
ssh -N -L 8888:localhost:8888 -p 端口号 用户名@服务器地址
然后在本地浏览器访问:
http://localhost:8888
这条命令的意思是:把服务器上的 8888 端口映射到本地电脑的 8888 端口。
Jupyter 实用快捷键
Shift + Enter:运行当前格子并进入下一格。Esc:进入命令模式。Enter:进入编辑模式。- 命令模式下按
A:在上方新建格子。 - 命令模式下按
B:在下方新建格子。 - 命令模式下按
DD:删除当前格子。 Ctrl + C:中断正在运行的 Python 格子。
2. 在 VS Code 中连接 SSH
VS Code 不只是一个写代码的编辑器。安装 Remote - SSH 扩展后,它可以登录远程服务器,并把远程目录当作本地项目来编辑。
它的体验大概是:
本地电脑运行 VS Code 界面
│
│ Remote - SSH
▼
服务器上运行 VS Code Server、Python、Jupyter 和训练代码
也就是说,代码在服务器上运行,但编辑器界面还在你的本地电脑上。
2.1 安装必要软件
在本地电脑上完成下面两件事:
- 安装 Visual Studio Code。
- 打开 VS Code,进入左侧 Extensions / 扩展,搜索并安装:
Remote - SSHPythonJupyter
安装 Remote - SSH 后,VS Code 左下角通常会出现一个类似 >< 的小图标。
2.2 方法一:直接连接
-
在本地 VS Code 中按:
- Windows / Linux:
Ctrl + Shift + P - macOS:
Cmd + Shift + P
- Windows / Linux:
-
输入并选择:
Remote-SSH: Connect to Host... -
如果列表里没有服务器,选择 Add New SSH Host。
-
输入完整 SSH 命令:
ssh -p 32655 root@connect.westb.seetacloud.com -
选择保存 SSH 配置的位置。Windows/macOS/Linux 通常可以选择用户目录下的
.ssh/config。 -
再次执行
Remote-SSH: Connect to Host...,选择刚才添加的主机。 -
如果询问服务器类型,通常选择 Linux。
-
输入服务器密码。首次连接时 VS Code 会在服务器上安装 VS Code Server,可能需要等待一会儿。
2.3 方法二:先写 SSH 配置文件
更推荐给服务器起一个短名字。打开本地配置文件:
- Windows:
C:\Users\你的用户名\.ssh\config - macOS / Linux:
~/.ssh/config
写入:
Host my-gpu-server
HostName connect.westb.seetacloud.com
Port 32655
User root
保存后,在 VS Code 中选择:
Remote-SSH: Connect to Host...
然后点击 my-gpu-server。
这以后也可以在本地终端直接使用:
ssh my-gpu-server
2.4 连接成功后做什么
连接成功后,VS Code 窗口左下角通常会显示类似:
SSH: my-gpu-server
接着可以:
-
选择 File → Open Folder;
-
输入服务器上的项目目录,例如:
/autodl-fs/data -
点击 OK / Trust;
-
打开任意分册 notebook(例如
01_服务器与SSH.ipynb)或其他代码文件。
VS Code 内置终端也运行在服务器上。可以用快捷键打开:
- Windows / Linux:
Ctrl + ` - macOS:
Cmd + `
在这个终端里执行 pwd,如果看到服务器路径,例如 /root/autodl-fs/data,说明终端确实在远程服务器上。
2.5 常见提示和问题
| 问题 | 处理方法 |
|---|---|
找不到 Remote-SSH: Connect to Host... | 确认本地 VS Code 已安装 Remote - SSH 扩展 |
| 一直要求输入密码 | 可以配置 SSH 密钥;也可以检查用户名、端口、密码是否正确 |
| 连接超时 | 检查服务器是否开机、地址和端口是否变化、本地网络是否可用 |
| Python 扩展不可用 | 在远程窗口中再次安装 Extensions 面板里标有 Install in SSH: ... 的扩展 |
| 打开的目录不是服务器目录 | 用 pwd 确认终端位置;重新使用 Open Folder 打开远程路径 |
| 服务器地址或端口变化 | 更新 ~/.ssh/config 里的 HostName 和 Port |
2.6 一个小提醒
- VS Code 的扩展分“本地安装”和“远程安装”。Python、Jupyter 这类用来运行远程代码的扩展,通常需要在远程服务器上也安装。
- 如果只是修改文本,Remote - SSH 已经足够;如果要运行 Notebook 和调试 Python,建议远程安装 Python 和 Jupyter 扩展。
- 密码仍然不要写进配置文件或代码里。
3. 长时间任务:tmux
SSH 连接断开时,直接在终端里运行的命令可能会跟着终止。长时间训练、下载大模型、跑评测时,推荐使用 tmux。
tmux 是什么?
tmux 是一个 terminal multiplexer,中文常叫“终端复用器”。它的作用是在服务器上创建一个可以脱离 SSH 连接继续存在的终端会话。
可以把它想象成:
SSH 连接 = 你和服务器之间的一根网线
tmux 会话 = 服务器上的一个工作台
断开 SSH = 把显示器拔掉,但工作台还在运行
重新连接 = 再把显示器接回去
所以,只要服务器没有关机或重启,你在 tmux 里启动的训练可以继续运行。
安装和确认
在服务器终端执行:
tmux -V
如果提示没有安装,可以按系统安装:
# Ubuntu / Debian
apt update
apt install -y tmux
# CentOS / RHEL,较新系统常用 dnf
dnf install -y tmux
# CentOS / RHEL,较旧系统可能是 yum
yum install -y tmux
最小使用流程
1. 新建一个命名会话
tmux new -s train
-s train 的意思是给这个 tmux 会话起名字 train。强烈建议给每个实验起不同名字,例如 exp001_baseline、exp002_lora。
2. 在 tmux 里运行任务
进入 tmux 后,窗口左下角通常会显示会话名和窗口编号。这时可以运行:
python train.py 2>&1 | tee train.log
2>&1 | tee train.log 表示把正常输出和错误输出同时显示到屏幕,并保存到 train.log。
3. 脱离会话
先按:
Ctrl + b
松开这两个键,再单独按:
d
这叫 detach / 脱离。你会回到普通终端,但 tmux 会话仍在服务器后台运行。
注意:先按 Ctrl + b 并松开,再按 d,不要一直同时按住所有键。
4. 查看现有 tmux 会话
tmux ls
输出可能类似:
train: 1 windows (created Mon Oct 28 21:00:00 2026)
exp001: 2 windows (created Mon Oct 28 20:00:00 2026)
5. 重新进入会话
tmux attach -t train
-t train 表示目标会话名。重新连接 SSH 后,再执行这条命令,就能回到原来的工作现场。
如果提示已经有另一个客户端连接在同一个会话里,可以使用:
tmux attach -t train -d
-d 会把之前的连接脱离,让你接管这个会话。
6. 结束任务或会话
如果只是停止训练,在 tmux 里按 Ctrl + C。
如果要退出当前 shell 并关闭 tmux 会话,可以在会话里输入:
exit
也可以在 tmux 外面按名字结束:
tmux kill-session -t train
注意:tmux kill-session 不会像普通删除文件那样进回收站。结束会话前,先确认里面没有重要任务在运行。
理解 tmux 前缀键
tmux 的很多快捷键都以 prefix key 开头,默认前缀是:
Ctrl + b
用法是:
- 按下
Ctrl + b; - 松开;
- 再按后面的命令键。
例如脱离会话是:
Ctrl + b,然后 d
窗口操作
一个 tmux 会话里可以有多个窗口。窗口类似浏览器标签页。
| 快捷键 / 命令 | 作用 |
|---|---|
Ctrl + b 然后 c | 新建窗口 |
Ctrl + b 然后 , | 重命名当前窗口 |
Ctrl + b 然后 n | 切换到下一个窗口 |
Ctrl + b 然后 p | 切换到上一个窗口 |
Ctrl + b 然后 0–9 | 切换到编号窗口 |
Ctrl + b 然后 w | 列出窗口并选择 |
Ctrl + b 然后 & | 关闭当前窗口 |
也可以直接用命令新建一个已命名窗口:
tmux new-window -t train -n monitor
这会在 train 会话里新建一个叫 monitor 的窗口,可以用来运行 nvidia-smi、watch df -h 或查看日志。
面板操作
一个窗口还可以拆分成多个面板。面板适合一边训练、一边看日志、一边看 GPU。
| 快捷键 | 作用 |
|---|---|
Ctrl + b 然后 % | 左右分屏 |
Ctrl + b 然后 " | 上下分屏 |
Ctrl + b 然后 方向键 | 在面板之间移动 |
Ctrl + b 然后 z | 放大 / 恢复当前面板 |
Ctrl + b 然后 q | 显示面板编号 |
Ctrl + b 然后 x | 关闭当前面板 |
一个常用布局是:
+----------------------+----------------------+
| | |
| python train.py | tail -f train.log |
| | |
+----------------------+----------------------+
| nvidia-smi / watch df -h |
+---------------------------------------------+
滚动查看历史输出
终端里的历史输出可能超出屏幕。在 tmux 中进入滚动模式:
Ctrl + b,然后 [
然后用方向键、Page Up、Page Down 查看历史输出。查看完按:
q
退出滚动模式。
开启鼠标模式
如果不想背太多快捷键,可以开启 tmux 鼠标模式:
tmux set -g mouse on
开启后可以:
- 用鼠标点击切换面板;
- 用鼠标拖动边界调整面板大小;
- 用滚轮查看历史输出;
- 用鼠标选择窗口。
想让设置长期生效,可以写入 ~/.tmux.conf:
set -g mouse on
修改配置后,可以重新加载:
tmux source-file ~/.tmux.conf
推荐后台启动方式
如果你已经确认命令可用,也可以直接创建一个后台 tmux 会话:
tmux new -d -s exp001 -c /root/autodl-tmp/project "python train.py 2>&1 | tee train.log"
参数含义:
-d:创建后不立即进入会话;-s exp001:会话名;-c /root/autodl-tmp/project:启动目录;- 引号里的是要运行的命令。
然后查看:
tmux ls
tmux attach -t exp001
tmux 常见问题
| 问题 | 可能原因 | 处理方法 |
|---|---|---|
tmux: command not found | tmux 未安装 | 用上面的命令安装 tmux |
no server running on ... | 当前没有任何 tmux 会话 | 先用 tmux new -s 名字 创建 |
can't find session | 会话名写错,或会话已结束 | 用 tmux ls 查看真实会话名 |
按 Ctrl + b 没反应 | 可能按法不对 | 按下 Ctrl + b 后松开,再按命令键 |
| 无法滚动 | 没进入 copy mode | 使用 Ctrl + b 然后 [,或开启 mouse 模式 |
| SSH 断开后任务没了 | 任务不在 tmux 里,或服务器关机/重启 | 重新连接后用 tmux ls 确认;重要任务要保存日志和检查点 |
更稳妥的习惯
- 把训练日志写入文件,例如
python train.py 2>&1 | tee train.log。 - 定期保存模型检查点。
- 使用小规模数据先试跑,再放大训练。
- 不要只依赖终端输出。
- tmux 只能防止 SSH 断开导致任务中断,不能防止服务器关机、实例释放或硬件故障。重要结果要定期保存到数据盘或文件存储。
4. 本地和服务器之间传文件
用 scp 上传文件
在本地电脑的终端里执行:
scp -P 端口号 本地文件 用户名@服务器地址:/目标目录/
例如:
scp -P 32655 ./train.py root@connect.westb.seetacloud.com:/root/autodl-tmp/project/
用 scp 下载文件
scp -P 端口号 用户名@服务器地址:/远程文件 本地目录/
例如:
scp -P 32655 root@connect.westb.seetacloud.com:/root/autodl-tmp/result.zip ./
注意:ssh 的端口参数是小写 -p,scp 的端口参数是大写 -P。
对于文件夹,可以加 -r:
scp -r -P 端口号 ./local_folder 用户名@服务器地址:/root/autodl-tmp/
很多平台也提供网页文件管理器、SFTP 工具或 VS Code Remote SSH,这些本质上都是帮你管理远程文件。
用 Jupyter 自带的文件界面可视化传输
Jupyter 本身就能上传和下载文件,适合初学者处理普通代码、图片、模型文件和中等大小的数据包。
上传到服务器
以 JupyterLab 为例:
-
打开左侧边栏的 File Browser / 文件浏览器;
-
进入想放文件的服务器目录,例如:
/root/autodl-tmp /autodl-fs/data -
点击工具栏里的 Upload Files / 上传文件 图标;
-
在本地电脑选择一个或多个文件;
-
等待上传完成,文件会出现在当前目录。
如果你使用的是经典 Notebook 界面,通常是进入 Files 页后点击 Upload。
从服务器下载
在 JupyterLab 中:
- 在 File Browser 中找到服务器上的文件;
- 勾选文件;
- 点击工具栏的 Download / 下载。
也可以右键文件,选择 Download。
使用建议
- 上传前先确认左侧 File Browser 显示的远程路径,避免传错目录。
- 大量小文件建议先打包成
.zip或.tar.gz,再通过 Jupyter 上传。 - 浏览器上传通常没有命令行那样可靠的断点续传;超大文件失败后可能要重新传。
- 如果文件特别大或网络不稳定,优先使用平台推荐的数据存储/上传方式,或命令行工具。
5. AutoDL 学术加速
在 AutoDL 服务器上,/etc/network_turbo 是平台提供的学术加速配置文件。它主要用来加速访问 GitHub、Hugging Face 这类学术资源。
可以把它理解成一段设置网络代理的环境变量脚本。执行后,当前终端里的一些网络请求会经过 AutoDL 提供的加速通道。
5.1 什么时候需要开启
下面情况可以尝试开启:
git cloneGitHub 仓库很慢或失败;- 从 Hugging Face 下载模型、数据集很慢;
- 某些脚本需要访问 Hugging Face 的 API。
但要注意:AutoDL 的提示里明确说明,它仅限学术用途,主要加速 GitHub 和 Hugging Face,不承诺稳定性。开启后访问其他资源,例如普通 pip 源,反而可能变慢。
5.2 在终端中开启
先确认文件存在:
cat /etc/network_turbo
如果存在,会看到类似下面的内容:
export no_proxy=localhost,127.0.0.1,...
export http_proxy=http://... && export https_proxy=http://...
export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
开启方法是:
source /etc/network_turbo
source 的意思是:在当前终端里执行这个文件中的 export 命令,让环境变量立刻生效。
不要写成:
sh /etc/network_turbo
这样会启动一个新的子进程执行脚本,环境变量通常不会保留在你当前终端里。
开启后可以检查:
env | grep -i proxy
5.3 在当前终端关闭
如果开启后发现某个下载反而变慢,可以关闭当前终端中的代理变量:
unset http_proxy https_proxy REQUESTS_CA_BUNDLE SSL_CERT_FILE no_proxy
注意:这只影响当前终端会话。新开一个终端后,需要重新 source /etc/network_turbo 才会再次开启。
5.4 在 Jupyter Notebook 中开启
Jupyter 里的每一行 !command 通常运行在独立子进程中,所以这样写:
!source /etc/network_turbo
一般不会影响下一个格子里的 Python 环境。
如果想让当前 Notebook 的 Python 进程使用 AutoDL 学术加速,可以在 Code 格子里直接解析 /etc/network_turbo,并把环境变量设置到当前 Python 进程中。
5.5 长训练任务的建议
- 如果训练脚本需要从 GitHub 或 Hugging Face 下载文件,先在同一个终端里
source /etc/network_turbo,再启动训练。 - 如果训练在 tmux 里运行,进入该后台会话后再执行
source /etc/network_turbo。 - 如果下载已经完成,长训练阶段通常可以关闭代理,避免不必要的网络绕路。
- 不要把加速通道当成稳定的永久代理,重要数据集最好提前下载到本地数据盘。
# 查看服务器上是否存在 AutoDL 学术加速配置文件
# 如果存在,下面会打印其中的说明和环境变量
!if [ -f /etc/network_turbo ]; then echo "找到 /etc/network_turbo"; else echo "未找到 /etc/network_turbo"; fi
!if [ -f /etc/network_turbo ]; then sed -n '1,20p' /etc/network_turbo; fi
# 在当前 Jupyter Python 进程中开启 AutoDL 学术加速
# 这个格子的作用等价于在终端里执行 source /etc/network_turbo
import os
import re
from pathlib import Path
proxy_file = Path("/etc/network_turbo")
if not proxy_file.exists():
raise FileNotFoundError("当前服务器没有 /etc/network_turbo,可能不是 AutoDL 实例或平台版本不同")
# /etc/network_turbo 中有些 export 写在同一行并用 && 连接,这里先拆开
text = proxy_file.read_text().replace("&&", "\n")
for line in text.splitlines():
match = re.match(r"\s*export\s+([A-Za-z_][A-Za-z0-9_]*)=(.*)", line)
if match:
name, value = match.groups()
value = value.strip().strip('"').strip("'")
os.environ[name] = value
print("当前 Python 进程中的代理相关变量:")
for name in ["http_proxy", "https_proxy", "REQUESTS_CA_BUNDLE", "SSL_CERT_FILE", "no_proxy"]:
print(f"{name} = {os.environ.get(name, '<未设置>')}")