# Harbor Qwen GRPO 项目分层架构 > 更新时间:2026-08-30 > 状态:本文描述已经完成验证的历史运行拓扑。腾讯云CVM、云硬盘及相关计费资源已释放,k3s、BuildKit、PVC、sandbox和verifier当前不在线;恢复项目时需要重新创建资源和凭证,不能把本文地址或资源ID视为仍然有效。 ## 1. 六层抽象 ```mermaid flowchart TB L6["操作层
Makefile + scripts"] L5["定制层
patches + 项目控制代码 + 配置"] L4["应用层
Harbor + rLLM + verl + vLLM + mini-swe-agent"] L3["环境层
Mac + AutoDL Conda/Ray + k3s/BuildKit/Sandbox"] L2["网络层
EIP + KubeConfig/RBAC + Gateway + Registry + mTLS tunnel"] L1["资源层
Mac + A800 80GB + CVM 32C64G/100G+500G + Registry"] L6 --> L5 --> L4 --> L3 --> L2 --> L1 ``` | 层次 | 历史验证组件 | 职责 | |---|---|---| | 资源层 | Mac;AutoDL A800 80GB;腾讯CVM 32 vCPU/64GiB;100GiB系统盘;500GiB数据盘;TCR主仓/ACR迁移源 | 源码、GPU训练、CPU沙箱、持久存储和镜像仓库 | | 网络层 | CVM EIP;安全组;k3s 6443;最小权限KubeConfig;AutoDL公网Gateway;BuildKit mTLS tunnel | 连接三台执行主体,并限制管理和运行权限 | | 环境层 | Mac Docker;AutoDL Conda/Ray;k3s v1.36.3;containerd;local-path;rootful BuildKit | 提供构建、训练、调度和隔离运行环境 | | 应用层 | Harbor、rLLM、verl、vLLM、mini-swe-agent 2.3.0、mini-coder-4b、SWE-Smith | 生成轨迹、执行代码、验证reward并训练策略 | | 定制层 | ACK adapter兼容层、离线verifier、超时/重试、Gateway修复、镜像重写、skopeo搬运 | 将上游库接入k3s、OCI Registry和中国网络环境 | | 操作层 | Makefile、`scripts/`、`src/`、测试和文档 | 把跨机器操作收敛为可验证的阶段命令 | `ACK_*` 和 `environment_type=ack` 是上游兼容接口名称;历史运行时它们指向腾讯k3s,当前不表示存在在线集群。 ## 2. 部署关系 ```mermaid flowchart LR subgraph MAC["Mac:开发与管理员"] CODE["源码 / patches / 文档"] ADMIN["管理员 KubeConfig"] DM["Docker 镜像搬运回退"] end subgraph GPU["AutoDL:GPU训练"] TRAIN["rLLM + verl + Ray"] MODEL["vLLM + mini-coder-4b"] GW["rLLM Model Gateway"] IMPORT["冻结版本导入 / 注册"] end subgraph CVM["腾讯CVM:单节点k3s"] CURATE["Harbor CPU curation
plan/download/filter/Oracle/freeze"] API["k3s API / RBAC"] BK["BuildKit + 100Gi PVC"] POD["Sandbox Pods + verifier"] SKOPEO["可选 skopeo 镜像搬运"] end REGISTRY["OCI Registry
TCR当前主仓 / ACR迁移源"] HUB["Docker Hub / 可选代理"] CODE --> TRAIN ADMIN --> API CURATE -->|"最小权限 KubeConfig"| API CURATE -->|"本地port-forward + mTLS"| BK API --> BK API --> POD POD -->|"OpenAI兼容API"| GW GW --> MODEL POD -->|"Oracle日志 / reward"| CURATE BK --> REGISTRY REGISTRY --> POD HUB --> DM --> REGISTRY HUB --> SKOPEO --> REGISTRY CURATE -->|"可迁移冻结版本"| IMPORT --> TRAIN ``` ## 3. 三方职责 ### Mac - 固定上游commit并维护补丁。 - 生成AutoDL发布包和BuildKit证书。 - 使用管理员KubeConfig创建命名空间、RBAC、Secret和BuildKit。 - 使用腾讯云CLI初始化TCR个人版命名空间和80个任务分片仓库,并管理TCR凭证文件。 - 在CVM代理无法覆盖长尾镜像时承担Docker搬运回退。 ### AutoDL - 承载模型权重、vLLM、rLLM Gateway、Ray、verl和W&B客户端。 - 校验并导入CVM冻结版本,重新定位task路径并注册到训练环境。 - 只在Canary/GRPO期间使用最小权限ServiceAccount调度sandbox。 ### 腾讯CVM(历史职责,资源已释放) - 运行单节点k3s控制面、CoreDNS、local-path provisioner和containerd。 - `/dev/vdb` 挂载到 `/var/lib/rancher`,保存k3s状态、containerd和PVC。 - 运行BuildKit及每条Harbor trial的环境、agent和verifier。 - 运行不含GPU训练栈的Harbor CPU curation环境。 - 承担plan、download、filter、镜像搬运、NOP/Oracle、freeze和版本导出。 ## 4. 归档状态与恢复边界 2026-08-30完成腾讯云资源释放后,以下运行态均不可假设仍存在: - CVM实例、系统盘、数据盘及`/var/lib/rancher`中的k3s状态; - local-path BuildKit PVC、containerd缓存和历史sandbox Pod; - 原EIP、k3s API端点、KubeConfig/RBAC token及BuildKit端口转发; - AutoDL到sandbox的model gateway公网映射。 源码、补丁、冻结数据契约、checkpoint与评测报告是可迁移资产;集群状态不是。未来恢复至少需要:新建CPU节点和持久盘、安装并验收k3s、重建namespace/RBAC/Secret、部署BuildKit与PVC、验证Registry镜像覆盖、重新生成或下发KubeConfig和证书、建立GPU model gateway,并依次通过BuildKit smoke、sandbox network smoke和项目preflight。恢复前不得直接启动训练或评测。 ## 5. 核心链路 ### 5.1 构建与运行 ```text CVM Harbor Oracle → 本机k3s API创建trial → CVM buildctl经本地mTLS tunnel访问BuildKit → BuildKit推任务镜像到当前Registry → k3s启动sandbox并执行NOP/Oracle/verifier → 结果写回CVM curation版本 AutoDL rLLM训练 → k3s API创建trial → AutoDL buildctl经mTLS tunnel访问BuildKit → BuildKit拉基础镜像并推任务镜像到当前Registry → k3s从当前Registry启动sandbox Pod → Pod调用AutoDL Gateway/vLLM → verifier返回reward和日志 ``` BuildKit使用100Gi `local-path` PVC。CVM已扩至32核/64GiB、500GiB数据盘,并把kubelet root-dir迁移到 `/var/lib/rancher/kubelet`;每个sandbox默认请求2 CPU、4GiB内存和20GiB临时存储,当前按10任务并发验证。 ### 5.2 数据和镜像 ```mermaid flowchart LR HF["SWE-Smith Filtered"] --> PLAN["CVM plan / download"] PLAN --> STATIC["static filter"] STATIC --> IMAGES["base image plan"] IMAGES --> MIRROR["Mac Docker 或 CVM skopeo"] MIRROR --> COVERAGE["Registry coverage"] COVERAGE --> ORACLE["NOP + Oracle"] ORACLE --> FREEZE["repo-isolated freeze"] FREEZE --> EXPORT["portable export"] --> IMPORT2["AutoDL import/register"] IMPORT2 --> CANARY["Canary"] IMPORT2 --> GRPO["GRPO"] ``` 镜像队列由 pending、completed、skipped 和 rewrites四份JSON组成。CVM/Linux入口已把3个infra镜像和84个可用基础镜像从ACR迁移到TCR并验证,3个超限镜像保持skipped,pending为0。`registry-migrate-linux` 负责infra/基础镜像和队列状态;`registry-task-migrate` 单独负责已accepted的历史任务镜像。 TCR任务镜像使用80个仓库和 `base-sharded-tags`:每个基础镜像最多映射到5个子分片,先以 `basecache-*` 标签预热到对应任务仓库;精确计划为357个基础镜像-仓库组合,已全部通过digest校验。当前布局的单仓库最大投影标签数为93,低于TCR个人版100标签配额。 ### 5.3 GRPO训练 1. rLLM从冻结train split选择任务,为每个任务创建多条rollout。 2. k3s sandbox执行mini-swe-agent Bash轨迹,Gateway记录模型trace。 3. verifier reward与trace组成GRPO batch。 4. verl计算相对优势并执行loss/backward/update。 5. 新权重版本通过Gateway管理接口同步给推理端。 Oracle以180秒绝对上限筛除长尾verifier;GRPO通过 `TRAIN_VERIFIER_TIMEOUT_MULTIPLIER=0.06` 将SWE-Smith任务自带的3000秒上限等效限制为180秒,避免单条rollout长期占用sandbox。 这两个配置互相独立:`CURATION_ORACLE_VERIFIER_TIMEOUT_SEC` 仅影响数据治理的NOP/Oracle job;`TRAIN_VERIFIER_TIMEOUT_MULTIPLIER` 由 `scripts/50_train_grpo.sh` 通过Hydra传给rLLM/Harbor runtime,仅影响Canary之后的GRPO rollout。调整任何一个都不能假定另一个会同步变化。 Oracle选批按split和仓库确定性轮询,避免按任务名顺序导致仓库集中;停止条件是 `dataset-freeze-check` 返回 `freeze_ready=true`,同时满足350/75/75和至少70个冻结仓库,而不是仅判断accepted总数。 单卡smoke在BF16、关闭CPU offload和 `TRAIN_GPU_MEMORY_UTILIZATION=0.35` 下完成完整更新。随后原始双卡collective定位到当前AutoDL机器的NCCL Direct P2P/CUMEM死锁;设置 `NCCL_P2P_DISABLE=1` 后,两卡FSDP2与两卡传统FSDP1完整GRPO均通过。严格A/B确认rank 0动作正常、rank 32在 `dummy_dtensor` 首次adapter同步路径生成乱码;LoRA现改为以 `safetensors` 直接初始化rollout基础权重。 ## 6. 身份和安全边界(历史) | 身份/凭证 | 保存位置 | 权限 | |---|---|---| | k3s管理员KubeConfig | Mac项目外 | 集群初始化、RBAC、Secret、BuildKit管理 | | 最小权限ServiceAccount KubeConfig | CVM/AutoDL项目外各一份 | 仅runtime/builder命名空间所需资源;不能读取nodes/namespaces/kube-system;CVM server使用127.0.0.1 | | Registry凭证 | Mac/CVM auth文件和k3s pull secret | 推送或拉取ACR/TCR项目镜像 | | BuildKit mTLS证书 | Mac生成,CVM和AutoDL客户端按阶段持有,k3s保存server secret | 访问BuildKit TCP Service | | 模型API key | AutoDL `.env` | sandbox调用Gateway | 公网6443只允许Mac和AutoDL出口IP;CVM SSH只允许可信来源。凭证不进入Git和发布包。 ## 7. 配置映射 | 配置 | 下游对象 | |---|---| | `KUBECONFIG_PATH`、`KUBE_CONTEXT` | kubectl、Harbor adapter、BuildKit tunnel | | `ACK_NAMESPACE` | `harbor-qwen-grpo` runtime namespace | | `ACK_BUILDER_NAMESPACE` | `harbor-qwen-build` BuildKit namespace | | `ACK_SANDBOX_NODE_SELECTOR_JSON` | `harbor-role=sandbox` 节点选择 | | `ACK_BUILDKIT_STORAGE_CLASS` | k3s `local-path` | | `ACK_REGISTRY_PREFIX` | ACR或TCR任务镜像和基础镜像目标 | | `ACK_TASK_IMAGE_LAYOUT`、`ACK_TASK_IMAGE_SHARDS`、`ACK_TASK_IMAGE_BASE_SHARDS` | ACR每任务仓库兼容布局,或TCR个人版80仓库、每基础镜像5个子分片的tag布局 | | `ACK_BASE_IMAGE_REWRITES_FILE` | Docker Hub基础镜像到当前Registry的确定性映射 | | `RLLM_GATEWAY_PUBLIC_URL` | sandbox可达的Gateway origin;不能附加重复 `/v1` | | `MINI_SWE_AGENT_MAX_TOKENS=2048` | 单步输出预算,防止32K上下文溢出 | | `CURATION_RUNTIME=cpu` | CVM激活最小 `.venv-curation`,不加载GPU训练栈 | | `CURATION_ORACLE_BATCH_SIZE=40`、`CURATION_ORACLE_CONCURRENCY=10`、`CURATION_ORACLE_VERIFIER_TIMEOUT_SEC=180` | CVM批量Oracle的批大小、环境并发和绝对verifier上限 | | `CURATION_POC_TRAIN/VALIDATION/TEST`、`CURATION_POC_MIN_REPOSITORIES` | freeze-check/freeze的350/75/75和至少70仓库停止条件 | | `CURATION_*` | 候选规模、可迁移路径、静态筛选、Oracle、冻结和export/import | | `DATASET_IMAGE_*` | Mac/Linux镜像重试、大小上限、代理和authfile | | `TRAIN_VERIFIER_TIMEOUT_MULTIPLIER=0.06` | 训练rollout的Harbor verifier倍率;3000秒任务等效为180秒 | | `TRAIN_MODEL_DTYPE=bf16`、`TRAIN_GPU_MEMORY_UTILIZATION=0.35` | 已验证的单卡colocated显存组合 | | `make fsdp2-smoke` | 两卡最小NCCL/FSDP2/backward/optimizer验证;不连接Harbor或CVM | | `TRAIN_*` | verl/vLLM显存、上下文、LoRA、rollout和checkpoint | ## 8. 历史持久化与重启方式(当前不适用) 以下内容描述CVM仍被保留时的历史恢复方式。2026-08-30资源已经彻底释放,因此当前不能按“重新开机”恢复,也不能假设旧系统盘、数据盘、k3s数据库、PVC、EIP或KubeConfig仍存在。历史上仅关机且EIP保持不变时,再开机需要: 1. 确认 `/var/lib/rancher` 已挂载。 2. 确认 `k3s` active、节点Ready、BuildKit Pod可用。 3. 在当前执行端重新启动BuildKit tunnel:CVM做Oracle时在CVM启动,AutoDL做Canary/GRPO时在AutoDL启动。 4. 依次执行 `make buildkit-status`、`make buildkit-smoke` 和相应preflight,成功后才恢复Oracle/训练。 Oracle的权威持久状态是 `${CURATION_ROOT}/${CURATION_VERSION}/oracle/results.jsonl`,job目录只是可审计执行记录。如果基础设施事故导致一批任务被误ingest,必须先停止bulk,再将修复前备份、受影响batch/task ID和修复后计数记录到 `oracle/recovery//`。恢复必须按task ID精确进行,不能按异常类型批量删除。 当前属于资源重建场景,必须重新处理TLS SAN、KubeConfig、RBAC、PVC、Registry Secret和资源注册;不能沿用上述快速开机流程。 ## 9. 2026-08-11历史状态与下一门槛 | 模块 | 状态 | |---|---| | k3s、RBAC、PVC、BuildKit、TCR、Gateway | 已打通并验证;32C64GiB及500GiB数据盘迁移完成 | | 历史100任务POC | 101验证、100接受,冻结37/15/7;仅作早期闭环记录 | | Canary | 新validation 10/10无异常;平均reward 0.1,其中1条reward 1 | | GRPO rollout到backward | 已打通 | | GRPO optimizer step | 单卡与两卡FSDP1均已完成;该批reward与梯度为0,只作为链路验收 | | 多卡训练 | 禁用当前机器故障的Direct P2P后,两卡FSDP2与FSDP1完整链路均通过 | | 3000候选/500冻结任务扩容 | 3000已下载,2614静态通过;Oracle最终1440/981,已正式冻结350/75/75 | | CVM/Linux镜像搬运 | 84完成、3超限、0缺失、0错误 | | TCR迁移 | 3个infra、84个基础镜像、166个历史任务镜像及357个预热组合已迁移并验收;80分片最大投影标签93/100 | | freeze、导出与导入 | `freeze_ready=true`;正式500条覆盖77仓库,manifest内嵌语义摘要为 `8e29a24910b727e72b63fed539cb834fda47994b8d963c2e002ffa8deb23e654`,JSON文件SHA-256为 `0e23cbcf8c7a1d0eba498a867898514344f2a1e8826130cf0937691dc36077e5`;AutoDL已导入/注册350/75/75 | 数据导入、注册、新Canary、两卡通信、GRPO链路与LoRA rank 32 `safetensors`动作生成复测均已完成。本节的“下一步”已被后续PPO和统一64K P0取代。 ## 10. 2026-08-17历史增量:freeze与计划中的PPO 本节覆盖第8节中已经过时的“下一门槛”,不改写历史验收记录。当前训练数据是`swesmith-curated-grpo-267-v1`,split为187/42/38、覆盖89个仓库;267/267个任务镜像已验证。`Klear-AgentForge-8B-SFT`在该数据集validation抽样30题、64K上下文下得到12/30且无异常。 PPO不增加新的数据、镜像或sandbox层。共同链路到Harbor terminal reward为止;PPO特有部分包括critic/value forward、GAE、actor clipped update、critic value update以及actor LoRA/critic model-only checkpoint。现有GRPO入口和历史两卡结果不变;PPO已在4卡trainer加1卡单vLLM的分离拓扑完成两轮20步GPU验收。最终统一64K P0中SFT与parent step20在test38和Verified27均持平,因此项目停止扩卡和追加step,并在释放腾讯云运行面后归档。细节见[`PPO_TRAINING_RUNBOOK.md`](PPO_TRAINING_RUNBOOK.md)。