LeRobot入门教程 05:远程开发工具

目录:00_LeRobot入门教程_目录.md

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 安装必要软件

在本地电脑上完成下面两件事:

  1. 安装 Visual Studio Code。
  2. 打开 VS Code,进入左侧 Extensions / 扩展,搜索并安装:
    • Remote - SSH
    • Python
    • Jupyter

安装 Remote - SSH 后,VS Code 左下角通常会出现一个类似 >< 的小图标。

2.2 方法一:直接连接

  1. 在本地 VS Code 中按:

    • Windows / Linux:Ctrl + Shift + P
    • macOS:Cmd + Shift + P
  2. 输入并选择:

    Remote-SSH: Connect to Host...
    
  3. 如果列表里没有服务器,选择 Add New SSH Host。

  4. 输入完整 SSH 命令:

    ssh -p 32655 root@connect.westb.seetacloud.com
    
  5. 选择保存 SSH 配置的位置。Windows/macOS/Linux 通常可以选择用户目录下的 .ssh/config。

  6. 再次执行 Remote-SSH: Connect to Host...,选择刚才添加的主机。

  7. 如果询问服务器类型,通常选择 Linux。

  8. 输入服务器密码。首次连接时 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

接着可以:

  1. 选择 File → Open Folder;

  2. 输入服务器上的项目目录,例如:

    /autodl-fs/data
    
  3. 点击 OK / Trust;

  4. 打开任意分册 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

用法是:

  1. 按下 Ctrl + b;
  2. 松开;
  3. 再按后面的命令键。

例如脱离会话是:

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 foundtmux 未安装用上面的命令安装 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 为例:

  1. 打开左侧边栏的 File Browser / 文件浏览器;

  2. 进入想放文件的服务器目录,例如:

    /root/autodl-tmp
    /autodl-fs/data
    
  3. 点击工具栏里的 Upload Files / 上传文件 图标;

  4. 在本地电脑选择一个或多个文件;

  5. 等待上传完成,文件会出现在当前目录。

如果你使用的是经典 Notebook 界面,通常是进入 Files 页后点击 Upload。

从服务器下载

在 JupyterLab 中:

  1. 在 File Browser 中找到服务器上的文件;
  2. 勾选文件;
  3. 点击工具栏的 Download / 下载。

也可以右键文件,选择 Download。

使用建议

  • 上传前先确认左侧 File Browser 显示的远程路径,避免传错目录。
  • 大量小文件建议先打包成 .zip 或 .tar.gz,再通过 Jupyter 上传。
  • 浏览器上传通常没有命令行那样可靠的断点续传;超大文件失败后可能要重新传。
  • 如果文件特别大或网络不稳定,优先使用平台推荐的数据存储/上传方式,或命令行工具。

5. AutoDL 学术加速

在 AutoDL 服务器上,/etc/network_turbo 是平台提供的学术加速配置文件。它主要用来加速访问 GitHub、Hugging Face 这类学术资源。

可以把它理解成一段设置网络代理的环境变量脚本。执行后,当前终端里的一些网络请求会经过 AutoDL 提供的加速通道。

5.1 什么时候需要开启

下面情况可以尝试开启:

  • git clone GitHub 仓库很慢或失败;
  • 从 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, '<未设置>')}")