Remote_All
-
- 为什么会有这个工具?
- 它目前能做什么?
-
- [1. 同步代码](#1. 同步代码)
- [2. 远端后台启动任务](#2. 远端后台启动任务)
- 目录结构
- 快速开始
-
- [Step 1:配置 SSH 免密登录](#Step 1:配置 SSH 免密登录)
- [Step 2:准备全局配置](#Step 2:准备全局配置)
- [Step 3:给项目补最小配置(推荐)](#Step 3:给项目补最小配置(推荐))
- [Step 4:把命令加入 PATH](#Step 4:把命令加入 PATH)
- [如何使用 `ra-sync`](#如何使用
ra-sync) - [如何使用 `ra-run`](#如何使用
ra-run) - 一个典型使用例子
- 当前边界
- 一句话总结
一个极简的远端运行工具层,用于把"本机开发 + 多机执行"这件事变得简单、透明、可控。
它适合这样的工作流:
- 代码主要在本机维护
- 实验主要在远端服务器执行
- 不想引入复杂调度系统
- 只想保留最核心的两个动作:
- 同步代码
- 远端启动任务
当前版本只提供两个命令:
ra-sync:同步代码到指定远端ra-run:先同步,再在远端后台启动任务
为什么会有这个工具?
很多研究 / 工程项目都会遇到同样的问题:
- 本机是主要开发机
- 真正跑实验的是远端 GPU 服务器
- 远端机器不止一台
- 但又不值得为了这件事专门部署完整调度系统
这时候最常见的问题不是"跑不起来",而是流程很乱:
- 同步代码靠手工
scp/rsync - 远端启动靠手拼
ssh ... - 每个项目都重复一套相似脚本
- 结果目录命名不统一
Remote_All 的目标很明确:
用最少的配置和最少的命令,把"同步代码 + 远端启动任务"变成一个稳定、可复用的日常流程。
它目前能做什么?
1. 同步代码
把本地项目代码同步到指定远端服务器的相同路径。
支持:
- 同步整个项目
- 同步单个子目录或文件
- 项目定义"默认同步子集"
- 自动排除结果目录和数据目录
2. 远端后台启动任务
在指定远端服务器上:
- 先自动执行一次同步
- 再在远端项目目录中后台启动命令
- 自动分配本次任务的结果目录
结果默认写到:
text
<REMOTE_PROJECT_ROOT>/Results/<job_id>
其中:
text
job_id = YYMMDD_HHMMSS_任务名
目录结构
text
Remote_All/
README.md
config.example.yml
.gitignore
bin/
ra-sync
ra-run
lib/
ra_sync_lib.py
ra_run_lib.py
examples/
ssh_config.example
remote-run.example.yml
快速开始
Step 1:配置 SSH 免密登录
先准备一把专门给远端运行使用的 SSH key:
bash
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_remote_all -C "remote_all"
把公钥部署到远端:
bash
ssh-copy-id -i ~/.ssh/id_ed25519_remote_all.pub <REMOTE_USER>@<REMOTE_HOST>
然后在 ~/.ssh/config 中配置远端别名。参考:
examples/ssh_config.example
完成后应该能直接:
bash
ssh <REMOTE_ALIAS>
Step 2:准备全局配置
从:
config.example.yml
复制到:
~/.remote_all/config.yml
然后填入你自己的远端信息。
最小配置长这样:
yaml
hosts:
server-a:
root: /home/<user>
tags: [gpu, fast-cpu]
server-b:
root: /home/<user>
tags: [gpu, large-memory]
local:
state: /home/<user>/.remote_all/state
run:
launcher: nohup
当前只要求你提供:
- 远端根目录
root - 一个本地状态目录
local.state - 默认后台启动方式
launcher
Step 3:给项目补最小配置(推荐)
在项目根目录下放一个:
.remote-run.yml
参考:
examples/remote-run.example.yml
当前支持两个字段:
yaml
runtime:
python: <PYTHON_PATH>
sync:
default_sources:
- src
- scripts
- tools
含义:
runtime.python- 项目绑定的 Python 环境
sync.default_sources- 项目默认同步子集
如果项目没有这份配置,工具也能工作,只是会默认同步整个项目。
Step 4:把命令加入 PATH
在 ~/.bashrc 或 ~/.zshrc 中加入:
bash
export PATH="$HOME/.remote_all/bin:$PATH"
之后:
bash
source ~/.bashrc
你就可以直接使用:
ra-syncra-run
如何使用 ra-sync
同步整个项目
bash
ra-sync --host <REMOTE_ALIAS> --project <PROJECT_ROOT>
只同步某个子目录或文件
bash
ra-sync --host <REMOTE_ALIAS> --project <PROJECT_ROOT> --source <SUBPATH>
预览同步计划
bash
ra-sync --host <REMOTE_ALIAS> --project <PROJECT_ROOT> --dry-run
默认排除项
当前默认排除:
.git/__pycache__/.pytest_cache/Results//results/Data//data/*.pyc*.pyo
也就是说:
- 代码会同步
- 数据与结果目录默认不会同步
如何使用 ra-run
ra-run 会自动先执行一次 ra-sync,然后在远端项目目录中后台启动任务。
基本用法
bash
ra-run \
--host <REMOTE_ALIAS> \
--project <PROJECT_ROOT> \
--name <TASK_NAME> \
--gpu <GPU_ID> \
-- <COMMAND>
例如:
bash
ra-run \
--host server-a \
--project /path/to/project \
--name train_exp1 \
--gpu 0 \
-- bash scripts/train.sh
dry-run
bash
ra-run \
--host <REMOTE_ALIAS> \
--project <PROJECT_ROOT> \
--name <TASK_NAME> \
--gpu <GPU_ID> \
--dry-run \
-- <COMMAND>
自动设置的环境变量
当前 ra-run 会自动在远端设置:
CUDA_VISIBLE_DEVICESJOB_IDOUTPUT_DIR
如果项目提供了 runtime.python,还会额外设置:
CONDA_PYREMOTE_PYTHON
因此,如果你的项目脚本支持这些环境变量,就可以很自然地接入这套流程。
一个典型使用例子
假设你在本机维护一个项目:
text
<PROJECT_ROOT>
你已经:
- 配好了 SSH
- 写好了
~/.remote_all/config.yml - 给项目加了
.remote-run.yml
那么典型日常流程就是:
先预览同步范围
bash
ra-sync --host server-a --project <PROJECT_ROOT> --dry-run
再真正同步
bash
ra-sync --host server-a --project <PROJECT_ROOT>
直接远端启动任务
bash
ra-run \
--host server-a \
--project <PROJECT_ROOT> \
--name exp1 \
--gpu 0 \
-- bash scripts/train.sh
结果会落在:
text
<PROJECT_ROOT>/Results/<job_id>
当前边界
在公开使用之前,你应该明确知道这套工具的边界:
- 它现在适合"本机开发 + 远端运行"的日常工作流
- 它不适合复杂的集群调度
- 它没有做任务状态管理
- 它也不会自动替你回收结果
一句话总结
Remote_All是一套极简的远端运行工具:ra-sync负责同步代码,ra-run负责同步后在远端后台启动任务,并把结果写入项目自己的Results/<job_id>目录。它不追求复杂调度,只追求把日常远端运行流程做得足够简单、稳定和透明。