Update deployment prerequisites and current guide
Browse files- DEPLOY.zh.md +224 -0
DEPLOY.zh.md
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# GPA policy 部署与启动(含冻结经验与运行环境)
|
| 2 |
+
|
| 3 |
+
更新:2026-09-18。本仓库根目录的 `DEPLOY.zh.md` 是最新部署说明;若压缩包内 `START.zh.md` 未包含系统 Python 的 `websockets` 安装检查,以本文为准。
|
| 4 |
+
|
| 5 |
+
官方 RoboDojo 环境已经就绪。本说明只启动 GPA 的代理、账号池、OpenWAM、policy WebSocket 和看板,不安装、不启动、不修改官方环境。
|
| 6 |
+
|
| 7 |
+
## 1. 解压与依赖
|
| 8 |
+
|
| 9 |
+
在 policy 服务器执行,替换所有 `/path/to`:
|
| 10 |
+
|
| 11 |
+
```bash
|
| 12 |
+
umask 077
|
| 13 |
+
export PACKAGES=/path/to/packages
|
| 14 |
+
export RUNTIME_PARENT=/path/to/gpa-runtime
|
| 15 |
+
export PRIVATE_PARENT=/path/to/gpa-secrets
|
| 16 |
+
mkdir -p "$RUNTIME_PARENT" "$PRIVATE_PARENT"
|
| 17 |
+
tar -xzf "$PACKAGES/GPA-XPolicyLab-runtime.tar.gz" -C "$RUNTIME_PARENT"
|
| 18 |
+
tar -xzf "$PACKAGES/GPA-private-config.tar.gz" -C "$PRIVATE_PARENT"
|
| 19 |
+
export GPA_ROOT="$RUNTIME_PARENT/XPolicyLab/policy/GPA"
|
| 20 |
+
export GPA_PRIVATE_ROOT="$PRIVATE_PARENT/private-runtime"
|
| 21 |
+
chmod -R go-rwx "$GPA_PRIVATE_ROOT"
|
| 22 |
+
```
|
| 23 |
+
|
| 24 |
+
运行时包包含 XPolicyLab checkout、GPA 代码、cursor step 58000 权重,以及 42 个任务的完整 A→B 对话链和冻结 task skill。私有包包含代理、账号凭据、邮件配置和看板密码,始终放在 XPolicyLab 外。不要用解压内容覆盖官方已有的 XPolicyLab。
|
| 25 |
+
|
| 26 |
+
policy 主机需要 Linux x86_64、兼容的 NVIDIA 驱动、ffmpeg、tmux、curl。不需要在 policy 主机安装仿真器。
|
| 27 |
+
|
| 28 |
+
**启动账号服务和 agent 前,先给系统 Python 安装 `websockets`。** agent 的 shell 可能直接调用 `python` / `python3`;仅在 policy 环境里安装不够。包名为 `websockets`,不要安装成 `websocket` 或 `websocket-client`。
|
| 29 |
+
|
| 30 |
+
```bash
|
| 31 |
+
python3 -m pip install 'websockets>=14'
|
| 32 |
+
python3 -c 'import sys; from websockets.asyncio.client import connect; print(sys.executable, "websockets OK")'
|
| 33 |
+
# 若 agent 使用 python,也检查该命令对应的解释器。
|
| 34 |
+
if command -v python >/dev/null 2>&1; then
|
| 35 |
+
python -c 'from websockets.asyncio.client import connect' || python -m pip install 'websockets>=14'
|
| 36 |
+
python -c 'import sys; from websockets.asyncio.client import connect; print(sys.executable, "websockets OK")'
|
| 37 |
+
fi
|
| 38 |
+
```
|
| 39 |
+
|
| 40 |
+
如果 pip 提示 `externally-managed-environment`,需由机器管理员按该系统的软件包管理规则安装;导入检查通过后再启动账号服务。需要 NumPy、SciPy、Pillow、OpenCV 的完整 harness 脚本仍使用下面配置的 `$POLICY_ENV/bin/python`;不要引用历史服务器上的 Python 路径。
|
| 41 |
+
|
| 42 |
+
公共仓库另附 `envs/gpa-policy-python.tar.gz` 与 `envs/node-codex.tar.gz`,下载到 `$PACKAGES` 后解压:
|
| 43 |
+
|
| 44 |
+
```bash
|
| 45 |
+
export GPA_ENV_ROOT=/path/to/gpa-envs
|
| 46 |
+
mkdir -p "$GPA_ENV_ROOT/policy" "$GPA_ENV_ROOT/node-codex"
|
| 47 |
+
tar -xzf "$PACKAGES/gpa-policy-python.tar.gz" -C "$GPA_ENV_ROOT/policy"
|
| 48 |
+
tar -xzf "$PACKAGES/node-codex.tar.gz" -C "$GPA_ENV_ROOT/node-codex"
|
| 49 |
+
export POLICY_ENV="$GPA_ENV_ROOT/policy"
|
| 50 |
+
export PATH="$GPA_ENV_ROOT/node-codex/node/bin:$PATH"
|
| 51 |
+
"$POLICY_ENV/bin/python" "$POLICY_ENV/bin/conda-unpack"
|
| 52 |
+
# 首次部署时创建;已有 node_modules 则先确认来源,不覆盖。
|
| 53 |
+
ln -s "$GPA_ENV_ROOT/node-codex/node_modules" "$GPA_ROOT/node_modules"
|
| 54 |
+
cd "$GPA_ROOT"
|
| 55 |
+
npm run build
|
| 56 |
+
"$POLICY_ENV/bin/python" -m pip install --no-index --no-deps --no-build-isolation -e third_party/OpenWAM
|
| 57 |
+
"$POLICY_ENV/bin/python" -c 'import torch; print(torch.__version__, torch.cuda.is_available())'
|
| 58 |
+
```
|
| 59 |
+
|
| 60 |
+
最后一行应显示 CUDA 可用。Python 包用 conda-pack 重定位;OpenWAM 的可编辑安装重新指向解压后的源码。Node/Codex 包包含 Node、npm 和已锁定的 node_modules。冻结经验随 policy 包位于 `experience/`,不需要旧机器上的目录。历史全量实验录像、GT 数据集和 RoboDojo 仿真环境不包含在内。
|
| 61 |
+
|
| 62 |
+
## 2. 保存 policy 配置
|
| 63 |
+
|
| 64 |
+
把以下内容保存为 `$GPA_PRIVATE_ROOT/env.local.sh`,每个终端先 source:
|
| 65 |
+
|
| 66 |
+
```bash
|
| 67 |
+
export GPA_ROOT=/path/to/gpa-runtime/XPolicyLab/policy/GPA
|
| 68 |
+
export GPA_ENV_ROOT=/path/to/gpa-envs
|
| 69 |
+
export POLICY_ENV="$GPA_ENV_ROOT/policy"
|
| 70 |
+
export GPA_PRIVATE_ROOT=/path/to/gpa-secrets/private-runtime
|
| 71 |
+
export GPA_ACCOUNTS_ROOT="$GPA_PRIVATE_ROOT/accounts"
|
| 72 |
+
export GPA_MAIL_CONFIG="$GPA_ACCOUNTS_ROOT/.notifications/mail.json"
|
| 73 |
+
export GPA_EXPERIENCE_ROOT="$GPA_ROOT/experience"
|
| 74 |
+
export GPA_DATA_ROOT=/path/to/large-disk/gpa-output
|
| 75 |
+
export GPA_RUN_ROOT="$GPA_DATA_ROOT/eval-001"
|
| 76 |
+
export GPA_DEPLOYMENT_CONFIG="$GPA_PRIVATE_ROOT/deployment.json"
|
| 77 |
+
export GPA_POLICY_URLS='http://127.0.0.1:19650'
|
| 78 |
+
export http_proxy=http://127.0.0.1:7890
|
| 79 |
+
export https_proxy="$http_proxy"
|
| 80 |
+
export NO_PROXY=localhost,127.0.0.1
|
| 81 |
+
export no_proxy="$NO_PROXY"
|
| 82 |
+
export PATH="$POLICY_ENV/bin:$GPA_ENV_ROOT/node-codex/node/bin:$GPA_ROOT/node_modules/.bin:$PATH"
|
| 83 |
+
export PYTHONPATH="$GPA_ROOT/python:$GPA_ROOT/third_party/OpenWAM:$GPA_ROOT/../..:${PYTHONPATH:-}"
|
| 84 |
+
```
|
| 85 |
+
|
| 86 |
+
```bash
|
| 87 |
+
source "$GPA_PRIVATE_ROOT/env.local.sh"
|
| 88 |
+
mkdir -p "$GPA_RUN_ROOT"
|
| 89 |
+
cd "$GPA_ROOT"
|
| 90 |
+
"$POLICY_ENV/bin/python" scripts/configure.py \
|
| 91 |
+
--out "$GPA_DEPLOYMENT_CONFIG" --data-root "$GPA_DATA_ROOT" \
|
| 92 |
+
--python "$POLICY_ENV/bin/python"
|
| 93 |
+
```
|
| 94 |
+
|
| 95 |
+
迁移后重新 configure,不直接沿用私有包 `cursor-runtime.json` 中旧机器的路径。每任务读取对应冻结 B context 和 task skill;评测期间 skill 不变,不做轮后总结。新实验使用新的 `GPA_RUN_ROOT`。
|
| 96 |
+
|
| 97 |
+
## 3. 代理与账号池
|
| 98 |
+
|
| 99 |
+
分别在独立 tmux 会话中执行;Ctrl-B、D 可脱离会话,保持服务运行。已有 7890 代理可直接复用。
|
| 100 |
+
|
| 101 |
+
```bash
|
| 102 |
+
tmux new -s gpa-proxy
|
| 103 |
+
source /path/to/gpa-secrets/private-runtime/env.local.sh
|
| 104 |
+
"$GPA_PRIVATE_ROOT/clash/mihomo" -d "$GPA_PRIVATE_ROOT/clash" \
|
| 105 |
+
-f "$GPA_PRIVATE_ROOT/clash/config.yaml"
|
| 106 |
+
```
|
| 107 |
+
|
| 108 |
+
另一个终端检查代理及一次真实模型调用:
|
| 109 |
+
|
| 110 |
+
```bash
|
| 111 |
+
source /path/to/gpa-secrets/private-runtime/env.local.sh
|
| 112 |
+
curl --proxy "$http_proxy" --connect-timeout 15 --max-time 30 -I https://auth.openai.com
|
| 113 |
+
# 将 pro-01 换成已登录槽位。
|
| 114 |
+
CODEX_HOME="$GPA_ACCOUNTS_ROOT/pro-01" codex -c 'cli_auth_credentials_store="file"' login status
|
| 115 |
+
CODEX_HOME="$GPA_ACCOUNTS_ROOT/pro-01" codex exec \
|
| 116 |
+
--ignore-user-config --ephemeral --sandbox read-only --skip-git-repo-check \
|
| 117 |
+
-m gpt-6-astra -c 'model_reasoning_effort="low"' \
|
| 118 |
+
-c 'service_tier="default"' -c 'features.fast_mode=false' \
|
| 119 |
+
'不要联网、读取文件或调用工具。只回复:你好。'
|
| 120 |
+
```
|
| 121 |
+
|
| 122 |
+
只启动一个共享账号监控器:
|
| 123 |
+
|
| 124 |
+
```bash
|
| 125 |
+
tmux new -s gpa-accounts
|
| 126 |
+
source /path/to/gpa-secrets/private-runtime/env.local.sh
|
| 127 |
+
cd "$GPA_ROOT"
|
| 128 |
+
"$POLICY_ENV/bin/python" python/account_pool.py monitor
|
| 129 |
+
```
|
| 130 |
+
|
| 131 |
+
最多 50 个账号,按周剩余额度加权分配;低于 3% 不接新任务,每号最多 16 workers。额度查询失败重试三次、间隔一分钟。账号服务使用本机 19901–19950。新 episode 和故障接管执行已有 Gemini 准入检查,当前要求回答 `3.1`;这是指定的启发式门槛,不是可靠的模型能力鉴定。不要同时运行使用同一批复制凭据的旧部署。
|
| 132 |
+
|
| 133 |
+
## 4. 启动共享 OpenWAM
|
| 134 |
+
|
| 135 |
+
```bash
|
| 136 |
+
tmux new -s gpa-model
|
| 137 |
+
source /path/to/gpa-secrets/private-runtime/env.local.sh
|
| 138 |
+
cd "$GPA_ROOT"
|
| 139 |
+
"$POLICY_ENV/bin/python" scripts/start-cursor-models.py \
|
| 140 |
+
--config "$GPA_DEPLOYMENT_CONFIG" --out "$GPA_RUN_ROOT/models" \
|
| 141 |
+
--gpus 0 --port 19650 --run
|
| 142 |
+
```
|
| 143 |
+
|
| 144 |
+
看到 `READY` 后,在另一终端检查:
|
| 145 |
+
|
| 146 |
+
```bash
|
| 147 |
+
curl --noproxy '*' -fsS http://127.0.0.1:19650/health
|
| 148 |
+
```
|
| 149 |
+
|
| 150 |
+
应为 `ready`、`cursor`、step 58000 checkpoint。每张模型卡独立排队,最大 batch 8。多副本用 `--gpus 0,1`,端口为 19650、19651,并将 `GPA_POLICY_URLS` 改成两个 URL、以空格分隔;全部副本是同一个 cursor 模型。
|
| 151 |
+
|
| 152 |
+
## 5. 启动 policy WebSocket
|
| 153 |
+
|
| 154 |
+
单端口启动:
|
| 155 |
+
|
| 156 |
+
```bash
|
| 157 |
+
tmux new -s gpa-policy-19660
|
| 158 |
+
source /path/to/gpa-secrets/private-runtime/env.local.sh
|
| 159 |
+
cd "$GPA_ROOT"
|
| 160 |
+
"$POLICY_ENV/bin/python" stage-c/multi_policy.py \
|
| 161 |
+
--port 19660 --out "$GPA_RUN_ROOT/port-19660" \
|
| 162 |
+
--config "$GPA_DEPLOYMENT_CONFIG" --experience-root "$GPA_EXPERIENCE_ROOT" \
|
| 163 |
+
--xpolicylab "$GPA_ROOT/../.." --policy-urls $GPA_POLICY_URLS
|
| 164 |
+
```
|
| 165 |
+
|
| 166 |
+
这只启动 policy,监听 `ws://127.0.0.1:19660`。每端口最多 10 个环境 ID,分别对应独立对话、动作队列、恢复状态和 debug 目录;任务由官方 instruction 自动识别。
|
| 167 |
+
|
| 168 |
+
若使用 8 个端口 × 每端口最多 10 环境,用下面命令替代单端口启动,避免重复占用端口:
|
| 169 |
+
|
| 170 |
+
```bash
|
| 171 |
+
source /path/to/gpa-secrets/private-runtime/env.local.sh
|
| 172 |
+
for port in $(seq 19660 19667); do
|
| 173 |
+
tmux new-session -d -s "gpa-policy-$port" \
|
| 174 |
+
"source '$GPA_PRIVATE_ROOT/env.local.sh'; cd '$GPA_ROOT'; exec '$POLICY_ENV/bin/python' stage-c/multi_policy.py --port $port --out '$GPA_RUN_ROOT/port-$port' --config '$GPA_DEPLOYMENT_CONFIG' --experience-root '$GPA_EXPERIENCE_ROOT' --xpolicylab '$GPA_ROOT/../..' --policy-urls $GPA_POLICY_URLS"
|
| 175 |
+
done
|
| 176 |
+
```
|
| 177 |
+
|
| 178 |
+
19660–19667 共享模型副本和账号监控器;不同端口的相同环境 ID 不冲突。80 环境协议隔离有合成测试,不代表已经完成 80 个真实环境的性能压测。
|
| 179 |
+
|
| 180 |
+
官方接入只需以下信息:
|
| 181 |
+
|
| 182 |
+
- policy 名称 `GPA`,使用官方 WS 协议、`arx_x5`、`ee` 动作格式。
|
| 183 |
+
- 将包内 `policy/GPA/deploy.py`、`deploy.yml`、`__init__.py` 放入官方现有 XPolicyLab 的 `policy/GPA/`,由其现有评测入口加载,并配置约定的 host/port。无需替换官方仓库。
|
| 184 |
+
- 使用 GPA `deploy.py` 的异步 batch 适配;每个环境独立连接和请求,不等待整批对话返回。
|
| 185 |
+
- policy 默认仅监听回环地址。跨机器时用约定的 SSH 隧道转发,例如在 policy 主机执行下面命令,把对端 6320 转发到本机 19660。占位值需先替换;其余端口同理。
|
| 186 |
+
|
| 187 |
+
```bash
|
| 188 |
+
ssh -N -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes \
|
| 189 |
+
-R 127.0.0.1:6320:127.0.0.1:19660 \
|
| 190 |
+
-p SSH_PORT -i /path/to/tunnel_key SSH_USER@SSH_HOST
|
| 191 |
+
```
|
| 192 |
+
|
| 193 |
+
公网看板与 policy WebSocket 是两个独立接口。
|
| 194 |
+
|
| 195 |
+
## 6. 看板与新增账号
|
| 196 |
+
|
| 197 |
+
```bash
|
| 198 |
+
tmux new -s gpa-dashboard
|
| 199 |
+
source /path/to/gpa-secrets/private-runtime/env.local.sh
|
| 200 |
+
cd "$GPA_ROOT"
|
| 201 |
+
bash scripts/public-dashboard.sh
|
| 202 |
+
```
|
| 203 |
+
|
| 204 |
+
启动 policy 不会自动开放公网;运行上面的脚本才开启公网看板。URL 在 `$GPA_RUN_ROOT/dashboard/tunnel.log`,用户名/密码在 `$GPA_PRIVATE_ROOT/dashboard-access.json`。回环入口是 18780,公网隧道接入带认证的 18781;不要直接公开 18780。Quick Tunnel 重启后 URL 可能变化。
|
| 205 |
+
|
| 206 |
+
看板每 15 秒刷新任务、截图、已执行录像和公开对话/工具日志,每 10 分钟读取额度快照。“新增账号”显示设备码、登录链接和登录结果;“刷新该次登录”结束旧的未完成登录,重新生成设备码,不覆盖已登录凭据。
|
| 207 |
+
|
| 208 |
+
凭据只写入私有账号目录。监控器约每分钟发现新账号并查询额度;下一轮选号经过 Gemini 检查后参与调度,不中断现有对话。公网登录写接口要求看板认证和同源请求。
|
| 209 |
+
|
| 210 |
+
## 7. 检查、日志与停止
|
| 211 |
+
|
| 212 |
+
```bash
|
| 213 |
+
source /path/to/gpa-secrets/private-runtime/env.local.sh
|
| 214 |
+
cd "$GPA_ROOT"
|
| 215 |
+
"$POLICY_ENV/bin/python" tests/check_async_xpolicylab.py
|
| 216 |
+
python3 tests/test_dashboard_login.py
|
| 217 |
+
"$POLICY_ENV/bin/python" python/account_pool.py status
|
| 218 |
+
curl --noproxy '*' -fsS http://127.0.0.1:18780/api/status
|
| 219 |
+
tmux ls
|
| 220 |
+
```
|
| 221 |
+
|
| 222 |
+
两项脚本检查不调用 Astra;合成测试不代表成功率。实际观测、动作、state、视频、对话和恢复记录按端口、环境、episode 写入 `$GPA_RUN_ROOT/port-*/env-*/`。没有明确官方结果时不把断开连接当作成功。
|
| 223 |
+
|
| 224 |
+
停止单个 policy:`tmux attach -t gpa-policy-19660` 后 Ctrl-C。全部停止时依次停止 policy、model、dashboard、accounts、proxy 会话,保留结果目录。
|