/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
目的:把「在一台全新云主机上把 feature/merge 平台 + Path B 真实运行时跑起来」的全过程
按「现象 → 根因 → 修复 → 验证」记下来,作为 11-新机从零部署指南.md 的实测补丁。
本篇只写11 里没写、写错、或看起来无害实际会炸的地方;流程本身仍以 11 为准。
0. 目标机与结果
| 主机 | 38.76.188.216(root,Ubuntu 24.04.1 LTS,kernel 6.8,x86_64,纯 CPU 无 GPU) |
| 代码 | /srv/deepracer-platform/repo(feature/merge,commit 074ff380a89f) |
| DRfC | /home/rambo/deepracer-for-cloud(DRfC 6.0.8,DR_SIMAPP_VERSION=6.0.8-cpu) |
| 平台端口 | 18080(nginx → backend:8000) |
| 结果 | 平台 health 200(version 1.2.0 / commit 074ff380a89f / db/redis/storage 全 true);DRfC host-check.sh PASS=11 FAIL=0;平台 probe 8/8 PASS;真实训练产出 model_0.pb(23 MB)落 DRfC MinIO;评测 SUCCEEDED(completion_rate 1.0、best_lap 112.394)并产出 MP4 7.36 MB |
1. 时间线(关键节点)
| 11:2x | Path A:bootstrap.sh → 8 个容器 Up,health 200,69 条赛道,Host local-01=FAKE |
| 11:4x | Path B 准备:swarm init + Sagemaker/Robomaker label + 带 compose 标签的 sagemaker-local overlay |
| 11:5x | prepare.sh(已打 docker.io 补丁)在 SSH 会话里跑 → apt -y upgrade 替换 openssh-server → 会话被杀,22 端口消失 |
| 12:2x | 后台 docker pull simapp:6.0.8-cpu 完成(日志 PULL_DONE rc=0,16.4 GB 落盘) |
| 13:4x | 控制台 Restart → 22 端口恢复(ssh.socket 激活) |
| 13:4x | systemd-run 托管重跑 prepare.sh → PREPARE_RC=0(.venv / aws-cli / docker 全部就位) |
| 13:5x | DRfC 侧手工初始化 → s3_minio 1/1,host-check.sh FAIL=0 |
| 13:54 | 平台 .env 五项 + 重建 backend/worker/worker-runtime → probe 8/8 PASS,Host=LOCAL/ONLINE |
| 13:57 | API 建训练作业 → TRAINING,deepracer-0_rl_coach 1/1、algo-1 容器起,model_0.pb 落桶 |
| 14:0x | POST /training-jobs/1/stop → STOPPING → CANCELLED,栈清理干净 |
| 14:08 | 登记 ModelVersion + 发起评测(1 trial + 录视频)→ RUNNING,robomaker 真实跑圈 |
| 14:22 | 评测 SUCCEEDED(task 831 s):completion_rate=1.0、best_lap_time=112.394、MP4 7.36 MB 落桶 |
2. 问题与修复清单
2.1 SSH / 远程执行(Windows → Linux)
| 1 | PowerShell 里远端命令的 ;、&&、引号被吃掉/截断 | PowerShell 先自己解析一遍,多引号嵌套必然走形 | 所有远端操作改成 本地写 .sh → 上传 → 远端 bash 执行,禁用内联长命令 |
| 2 | 远端输出到 Windows 控制台乱码 / UnicodeEncodeError | 控制台默认 GBK,远端输出 UTF-8 | paramiko 侧 sys.stdout.reconfigure(encoding="utf-8", errors="replace") |
| 3 | 连续执行两个脚本报 syntax error near unexpected token | 固定路径 /tmp/_rs.sh 被下一个脚本覆盖,bash 边读边执行读到半截新内容 | 用唯一路径 /tmp/_rs_<pid>_<ts>.sh |
2.2 prepare.sh 的两个坑(都会让你以为机器坏了)
| 4 | 跑完 prepare.sh 后 docker –version 从 29.9.2 变回发行版 docker.io,Swarm/插件全失效 | prepare.sh 第 119 行无条件 apt install –no-install-recommends docker.io docker-buildx docker-compose-v2,会用 docker.io 覆盖 docker-ce | 部署前把该行替换成 echo "[patch] skip docker.io install …"(保留 .orig-<ts> 备份);本机实测 patch 生效,dpkg -l 里只有 docker-ce* |
| 5 | prepare.sh 跑到 apt upgrade 时 SSH 断线,之后 22 端口永久不通(扫 30+ 端口只有 18080 开着) | apt -y upgrade 替换 openssh-server(9.6p1-3ubuntu13.20)→ 正在跑的 sshd 被杀;Ubuntu 24.04 走 ssh.socket 激活,包升级过程中 socket 单元被停,升级没收尾就再也没人拉起来 | ① 用 systemd-run –unit=… –collect –property=KillMode=process 托管执行,SIGHUP 不再杀进程;② 断了就走控制台 Restart(重启触发 socket 激活,实测重启后 22 立刻回来);③ 恢复后 dpkg –configure -a 会卡在 sshd_config 交互提问(本机 sshd_config 被改过),必须带 -o Dpkg::Options::=–force-confold 保留本地版本 |
事后核对:dpkg -l | awk '$1!="ii"' 只剩 rc(已删但留配置)和 hi grub-pc(prepare.sh 主动 hold 的),
apt-get -s upgrade 待升级数 0 —— 那次被打断的 upgrade 实际已被重启 + dpkg –configure -a 收尾。
2.3 DRfC 侧
| 6 | docker pull minio/minio:* 全部 404 | 上游 2025-10 下架 | 拉 Docker Hub 副本再 retag:docker pull rambogor/minio:RELEASE.2023-06-23T20-26-00Z && docker tag … minio/minio:RELEASE.2023-06-23T20-26-00Z |
| 7 | s3_minio 起得来,但 6.x 训练栈起不了 algo-1(/tmp/sagemaker/<id>/ 只有 failure) | sagemaker-local overlay 缺 com.docker.compose.network/project 标签 | docker network create -d overlay –attachable –scope swarm –label com.docker.compose.network=sagemaker-local –label com.docker.compose.project=sagemaker-local sagemaker-local |
| 8 | docker pull …simapp:6.0.8-cpu 长时间「无输出」,看着像卡死 | 4.06 G 下载 / 29 层 / 16.4 G 落盘,pull 阶段只在下层,进度条经常不动 | 后台跑 + 写日志,别中断;本机 12:25:30 打出 PULL_DONE rc=0 |
| 9 | bin/init.sh 一跑就 Swarm exists. Exiting.,且 system.env/run.env 被写回模板 | ① 第 120–121 行无条件 cp defaults/template-*.env;② 第 178–181 行检测到已有 Swarm 直接 exit 1 | 不跑 init.sh,改手工等价步骤(建 data/、/tmp/sagemaker、.aws 符号链接、minio profile、source activate.sh 起 s3 栈)——已回写进 11 §6.2 |
| 10 | source bin/activate.sh 返回 1;脚本里 source … && dr-start-training 永远不执行 | 末行 [[ $- == *i* ]] && dr-summary 在非交互 shell 返回 1;另 341 行用到 379 行才赋值的 DR_DOCKER_MAJOR_VERSION,必打 [: : integer expression expected | 平台侧 local_shell._drfc 用 . ./bin/activate.sh; <cmd>(分号)——自己写脚本也别用 &&;integer 报错无害 |
| 11 | 训练栈报「找不到 aws 凭据」/ dr-upload-custom-files 失败 | docker/volumes/.aws 是仓库里的 0 字节占位文件,不是符号链接 | rm -f docker/volumes/.aws && ln -sfn /root/.aws docker/volumes/.aws;aws configure –profile minio(profile 名固定 minio,AK/SK 任意) |
2.4 平台侧接真机
| 12 | 改完 .env 重建 backend 后 http://IP:18080 变 502,但容器 health 200 | nginx 启动时把 backend 解析成 IP 并缓存,backend 重建换了 IP | docker compose … restart nginx |
| 13 | POST /api/v1/training-jobs 返回 301,jq 解析全空 | DRF 路由带尾斜杠,curl 不跟随重定向拿到 HTML | 一律尾斜杠 + curl -L;/tracks/、/rewards/、/system/hosts/ 同理 |
| 14 | 评测报 model_version 不存在 | 训练被 stop 取消 → register_training() 没被调用 → 没有 ModelVersion 行 | 走与「训练成功」同一条代码路径补登记:registry.service.register_training(job)(s3_prefix=<prefix>/model),再 POST /evaluations/ |
| 15 | 平台 storage 一直 true,但读不到训练产物 | AWS_S3_* 仍指向平台自带的 minio(bucket drplat),产物在 DRfC 的 s3_minio(bucket bucket) | .env 五项指向 DRfC:AWS_S3_ENDPOINT_URL=http://drfc-minio:9000、AWS_S3_BUCKET=bucket、AK/SK 取 /root/.aws/credentials 的 [minio]、ALLOW_REAL_RUNTIME=1、DRFC_ROOT=/home/rambo/deepracer-for-cloud;compose.prod.yml 的 x-backend-common.extra_hosts 已自带 drfc-minio:host-gateway,无需改 compose |
副作用(要知道):切到 DRfC MinIO 后,平台自己的对象也进 bucket;Path A 假跑时存在 drplat 桶里的东西
不再可见。想两头都要就保留 bitnamilegacy/minio 容器,只把 AWS_S3_* 切回 http://minio:9000 + drplat。
3. 验收证据
# 平台
curl -s http://38.76.188.216:18080/api/v1/system/health
# {"status":"ok","db":true,"redis":true,"storage":true,"version":"1.2.0","commit":"074ff380a89f","env":"prod"}
# 宿主 8 条硬约束
backend/deploy/host-check.sh # ==> == 结果:PASS=11 FAIL=0 WARN=1 == (WARN 仅时区 Etc/UTC)
# 平台 probe(/system/hosts/1/probe 等价)
# PASS swarm / labels / network / minio_service(1/1) / minio_image / docker_sock / run_env / disk
# PROBE ok= True
# DRfC 真实栈
docker service ls
# deepracer-0_rl_coach 1/1 deepracer-0_robomaker 1/1 s3_minio 1/1
docker ps –filter name=algo-1- # vx5jmjdwjz-algo-1-h1fpq Up
# 产物(DRfC MinIO,bucket=bucket)
aws –endpoint-url http://127.0.0.1:9000 s3 ls –recursive s3://bucket
# pathb-smoke-1/model/model_0.pb 23377673
# pathb-smoke-1/model/0_Step-0.ckpt.meta 2112304
# pathb-smoke-1/model/deepracer_checkpoints.json
# pathb-smoke-1/reward_function.py
# pathb-smoke-1/training_params.yaml
# training_job/<uuid>/custom_files/{hyperparameters,model_metadata,reward_function}
# 评测产物
# evaluation/<eval-uuid>/mp4/0-video.mp4 7361268 ← 平台转码后的成品
# evaluation/<eval-uuid>/preview/0-video-{in,mid,finish}.jpg
# pathb-smoke-1/mp4/camera-pip/0-video.mp4 7361268 ← DRfC 录的原始三视角
# pathb-smoke-1/mp4/camera-45degree/0-video.mp4 7213415
# pathb-smoke-1/mp4/camera-topview/0-video.mp4 847710
# pathb-smoke-1/evaluation-20261102140848/evaluation-simtrace/0-iteration.csv
# pathb-smoke-1/metrics/evaluation/evaluation-20261102140848.json
评测结论(GET /api/v1/evaluations/1/):
{"id":1,"status":"SUCCEEDED","model_label":"pathb-smoke-1-00001","completion_rate":1.0,
"best_lap_time":112.394,"error_code":"",
"trials":[{"trial":1,"status":"SUCCEEDED","episodes":1,"avg_reset":18.0}]}
GET /api/v1/evaluations/1/video/ → 200 {artifact:4, video_pending:false, url:/api/v1/artifacts/4/download?token=…}
(video_pending:false + 桶里有 mp4 = ffmpeg 转码链路也通了)
4. 复现这套机器的最短路径
# 0) 前提:Docker CE 已装(29.x),未被 apt 换回 docker.io
# 1) 平台(路径 A)
git clone <repo> /srv/deepracer-platform/repo && cd /srv/deepracer-platform/repo
sudo backend/deploy/bootstrap.sh # build + up + migrate + 建管理员
# 2) Path B 准备(11 §3.4–3.6,手工,别用 init.sh)
docker swarm init && docker node update –label-add Sagemaker=true –label-add Robomaker=true self
docker network create -d overlay –attachable –scope swarm \\
–label com.docker.compose.network=sagemaker-local \\
–label com.docker.compose.project=sagemaker-local sagemaker-local
# 3) DRfC(11 §6.1–6.2,本次改写过)
# prepare.sh 用 systemd-run 托管跑;补 data/、/tmp/sagemaker、.aws 符号链接、minio profile
source bin/activate.sh # 起 s3 栈
bash /srv/deepracer-platform/repo/backend/deploy/host-check.sh # FAIL 必须是 0
# 4) 平台接真机(11 §7)
# .env 五项 → restart nginx + 重建 backend/worker/worker-runtime → Host=LOCAL → probe
# 5) 跑一轮
POST /api/v1/training-jobs/ → TRAINING → model_0.pb 落桶 → stop → CANCELLED
5. 遗留 / 已知限制
| 2 | 远端输出到 Windows 控制台乱码 / UnicodeEncodeError | 控制台默认 GBK,远端输出 UTF-8 | paramiko 侧 sys.stdout.reconfigure(encoding="utf-8", errors="replace") |
| 3 | 连续执行两个脚本报 syntax error near unexpected token | 固定路径 /tmp/_rs.sh 被下一个脚本覆盖,bash 边读边执行读到半截新内容 | 用唯一路径 /tmp/_rs_<pid>_<ts>.sh |
网硕互联帮助中心







评论前必须登录!
注册