# Harbor Qwen GRPO 项目工作周期

> 更新时间：2026-08-30。项目已完成统一64K P0并阶段性归档；腾讯云CVM、云硬盘和相关计费资源已释放。本文保留历史执行周期，不代表集群仍在线。

## 1. 总体时间线

```mermaid
flowchart LR
    A["方案调研"] --> B["项目骨架"]
    B --> C["ACK/ACR/BuildKit"]
    C --> D["Harness与模型"]
    D --> E["数据/镜像/Oracle"]
    E --> F["冻结与Canary"]
    F --> G["腾讯CVM+k3s迁移"]
    G --> H["GRPO链路修复"]
    H --> I["4/4 rollout + backward"]
    I --> J["TCR迁移与500任务冻结"]
    J --> K["新Canary与单卡GRPO smoke通过"]
    K --> L["两卡通信与FSDP1链路通过"]
    L --> M["Verified 27题Canary"]
    M --> N["强模型验证数据扩充"]
    N --> O["统一57题模型选择"]
    O --> P["PPO critic与训练诊断"]
    P --> Q["统一64K P0：SFT与step20持平"]
    Q --> R["当前：停止追加训练并释放云资源"]
```

### 最终阶段：统一64K P0与项目归档

- 固定`official-public-repro`、65536 context、temperature 1.0、retry 0和每题一次，比较原始SFT与parent step20。
- test38两者均为6/38；Verified27按全部attempt两者均为9/27。
- test38配对3胜32平3负，Verified27配对2胜23平2负；两个exact McNemar p均为1.0。
- parent消耗更多token、agent step和时间，但没有提升总体成功数；critic低VF loss与负explained variance也不能替代能力门禁。
- 决策为停止追加PPO训练。腾讯云CVM、CBS及相关计费资源随后释放，历史k3s运行面不再在线。

## 2. 已完成阶段

### 阶段1：方案调研和责任拆分

- 对比rLLM Harbor示例、Daytona、ACK、本地Docker、E2B、Firecracker和其他sandbox方案。
- 确定GPU训练与CPU沙箱分离：AutoDL负责模型和训练，Kubernetes负责任务环境。
- 建立Mac、AutoDL、CPU云、Registry四方边界。

### 阶段2：项目骨架和可重放补丁

- 创建 `scripts/`、`src/`、`tests/`、`configs/`、`patches/` 和固定commit的 `upstream/`。
- Makefile收敛Mac准备、集群初始化、数据、Canary、训练和停止入口。
- 发布包排除 `.env`、凭证、state和运行输出。

### 阶段3：早期ACK、ACR和BuildKit闭环

- 在阿里云建立ACK、ACR、VPC、RBAC和公网API。
- 部署rootful BuildKit、100Gi PVC和mTLS端口转发。
- 修复Registry域名、镜像重写、任务镜像构建、Pod命名和离线verifier。
- 该阶段完成了基础设施验证，但ACK因长期成本过高，后来被腾讯CVM+k3s替代。

### 阶段4：从Qwen Code切换mini-swe-agent

- Qwen Code Canary证明模型会输出工具调用文本而非所需结构化 `tool_calls`。
- 切换到mini-swe-agent 2.3.0和mini-coder-4b，以文本Bash动作执行任务。
- 统一动作提示、工作目录、步骤上限和verifier处理。

### 阶段5：POC数据、基础镜像和Oracle

- 从SWE-Smith Filtered下载320候选，静态接受287。
- 31个ACR基础镜像覆盖101个任务；67个超过1GiB的镜像被跳过。
- NOP baseline要求reward为0；Oracle要求reward为1。
- verifier统一480秒超时；异常最多额外重试2次；失败任务不阻断同批其余任务。
- 最终Oracle记录101条、接受100条。

### 阶段6：冻结数据和Canary稳定性

- 按仓库隔离和难度平衡冻结59条：train 37、validation 15、test 7，覆盖27个仓库。
- 修复mini-swe-agent达到步数上限后非交互stdin EOF。
- 将上下文上限退出作为正常截断并继续verifier。
- 将单步最大输出改为2048，减少32K上下文溢出。
- 最近一次新validation Canary：10/10完成、Exceptions=0、平均reward 0.1，其中1条reward为1。

结论：环境、agent、trajectory和verifier链路稳定；reward为0反映当前4B策略解题能力，不是基础设施异常。

### 阶段7：迁移到腾讯云按量CVM和单节点k3s

- 选择北京六区按量CVM，8 vCPU/32GiB、Ubuntu 24.04、x86_64。
- 50GiB系统盘保留操作系统；200GiB数据盘格式化ext4并挂载到 `/var/lib/rancher`。
- 安装k3s v1.36.3，使用Rancher中国镜像和airgap镜像包绕过Docker Hub连接问题。
- k3s配置EIP TLS SAN、节点标签、禁用Traefik/ServiceLB、secrets encryption和local-path目录。
- PVC冒烟测试验证数据实际写入200GiB数据盘，删除PVC后目录能正常回收。
- 管理员KubeConfig保存在Mac；为AutoDL创建最小权限ServiceAccount KubeConfig。
- AutoDL能创建runtime Pod、exec和builder port-forward，但不能读取nodes、namespaces或 `kube-system`。
- BuildKit Deployment、Service和100Gi `local-path` PVC恢复，smoke build通过。
- Pod到AutoDL模型Gateway的网络smoke和完整preflight通过。

### 阶段8：Canary和Gateway兼容修复

- 修复ContextWindowExceeded被误记为agent基础设施失败的问题。
- 规范 `RLLM_GATEWAY_PUBLIC_URL` 为公网origin，避免Gateway重复拼接 `/v1`。
- 训练时强制优先导入仓库内的 `rllm-model-gateway` 源码，解决site-packages旧版缺少 `set_weight_version`。
- Gateway将Harbor placeholder模型改写为真实 `actor_rollout_ref.model.path`。
- Harbor trial将agent异常且reward 0正确标为失败，不再误报env_done。

### 阶段9：早期GRPO smoke进入真实backward

- 停止独立Canary vLLM，释放6008端口后启动colocated训练。
- smoke固定1个训练任务、4条rollout、1个batch，关闭compact filtering并记录episode。
- 两个并行sandbox Pod能够立即调度并运行。
- 4/4 rollout约20分钟完成，Gateway健康检查和chat completion均返回200，session trace可以读取和删除。
- verl成功构造batch并进入Actor `loss.backward()`。
- backward发生CUDA OOM：A800总计约79.25GiB，actor约31.43GiB、vLLM约40.05GiB，剩余7.72GiB，而backward还需9.14GiB。

结论：该早期配置证明rollout → trace → reward/batch → loss → backward链路已经打通，但当时尚未完成optimizer step。

### 阶段10：CVM/Linux基础镜像搬运入口

- 新增 `make dataset-images-mirror-linux`。
- 使用skopeo直接执行Registry到Registry复制，无需Docker daemon和完整镜像解压。
- 只选择linux/amd64；支持逗号分隔的Docker Hub代理，候选失败后回退源站。
- 保持pending/completed/skipped/rewrites队列格式兼容。
- 超限镜像进入skipped；源目标digest一致后才归档completed；全部失败继续保留pending。
- Python、Shell语法和14项相关单元测试通过。

状态：真实完成84个ACR基础镜像，3个超限跳过，missing=0、errors=0。

### 阶段11：TCR个人版低成本任务镜像链路

- 保留ACR兼容路径，新增通用OCI Registry凭证变量。
- 任务镜像按环境名和基础镜像哈希写入80个 `task-NN` 仓库，以唯一tag替代“每任务一仓库”。
- `base-sharded-tags`布局使用每基础镜像5条lane；最大投影标签数93/100。
- `make tcr-prepare-personal` 使用腾讯云CLI幂等创建命名空间、基础仓库和任务分片仓库。
- `make registry-migrate-linux` 在CVM直接把ACR现有基础设施/基础镜像及队列状态复制到TCR，不经Mac下载镜像层。
- 北京CVM访问TCR个人版域名时以腾讯云内网链路为目标，避免CVM向跨云ACR推送产生EIP出流量费用。

状态：3个infra镜像、84个基础镜像、166个历史任务镜像和357个预热组合均已迁移并通过digest验收。

### 阶段12：500任务Oracle、正式冻结与导出

- 3000候选全部下载，2614条静态通过。
- Oracle以batch40、concurrency10运行，累计记录1440条、接受981条。
- `freeze-check`选出train/validation/test为350/75/75，split仓库数55/11/11，总覆盖77个仓库，返回 `freeze_ready=true`。
- 自动bulk输出 `BULK_ORACLE_FREEZE_READY` 后正常停止。
- 旧217条短缺冻结集已移动到版本目录外的可恢复归档。
- 正式500条冻结集已生成；manifest内嵌语义摘要为 `8e29a24910b727e72b63fed539cb834fda47994b8d963c2e002ffa8deb23e654`，JSON文件SHA-256为 `0e23cbcf8c7a1d0eba498a867898514344f2a1e8826130cf0937691dc36077e5`。
- CVM导出包 `swesmith-20260808-v2-poc-curated.tar.gz` 为29377680字节，SHA-256为 `8ce630ad5850c1b0456802cb26230257bb7a0b4ca76be50b643534c3248ced05`；AutoDL导入校验一致。
- AutoDL已完成import/register/status：3000/2614、1440/981、350/75/75，共500条。

### 阶段13：新Canary与单卡GRPO smoke验收

- 新validation Canary完成10/10 trial、Exceptions=0、平均reward=0.1，其中1条reward为1。
- 训练权重改为BF16直接加载，actor、optimizer与reference CPU offload默认关闭。
- 单卡首次完整smoke因rollout vLLM占约40.04GiB，在backward额外申请7.31GiB时OOM。
- 将 `TRAIN_GPU_MEMORY_UTILIZATION` 从0.5降至0.35后，4/4 rollout、episode logging、backward、optimizer step、权重同步和 `training/global_step=1` 全部完成。
- 训练侧峰值分配42.70GiB、预留43.76GiB；单步总耗时约1271秒。
- 该批4条rollout全部timeout且reward为0，因此advantage、loss和grad norm均为0；链路已通过，但本批没有有效参数变化。
- 原始双卡 `all_reduce` 同样死锁，确认根因是当前机器的NCCL Direct P2P/CUMEM路径，而不是FSDP本身。
- 设置 `NCCL_P2P_DISABLE=1` 后，两卡FSDP2隔离smoke通过；两卡传统FSDP1完整GRPO也完成4/4 rollout、backward、optimizer step、权重同步和global step 1，峰值分配/预留显存约38.29/39.91GiB。
- LoRA rank 0同条件smoke恢复合法Bash action并完成更新；rank 32两条rollout均生成2048-token乱码、相关性为负并超时，严格A/B已确认LoRA首次rollout加载路径异常。

当前决策：保留 `NCCL_P2P_DISABLE=1` 作为该机器专用规避项；LoRA rollout固定使用 `safetensors`。rank 32同条件复测已恢复合法动作，现扩大train任务内的group和step限制以获得非零奖励方差、advantage和grad norm。

### 阶段14：SWE-bench Verified 27题Canary与离线verifier闭环

- 从固定30题分层/仓库限额清单中派生27个镜像可用任务，3个超限镜像保持skipped。
- 64K vLLM的8K、40K和64.5K探针均通过；Verified Canary启动前再以真实40K请求阻止实际32K服务进入评测。
- offline-v2完整作业请求27题，25题正常评分、2题verifier异常，获得10个reward 1和15个reward 0，Harbor报告Mean 0.370。
- `pallets__flask-5014` 和 `sphinx-doc__sphinx-8621` 在offline-v3分别复测为 `Exceptions=0, reward=0`，校正口径为10/27 = 37.04%。
- offline-v3不再在parser中调用会访问GitHub的 `make_test_spec`，并以60秒硬超时防止单题无限占用trial。
- 37.04%与论文SFT checkpoint的38.2%数值接近，但当前只能声称固定27题能力诊断数值一致，不能声称Verified 500完整复现。

### 阶段15：SWE-Smith RL重叠集30题停止判断

- Klear公开66K数据是SFT消息轨迹集；固定revision共65,994行，只有`instance_id`和`messages`字段，未提供reward、resolved或verifier结果。
- 论文没有披露公开SWE轨迹的生成模型；单独提到的“强教师模型至少成功一次”属于RL任务筛选，不能反推66K SFT轨迹来源或逐轨迹成功性。
- 166题清单中的`klear_trajectory_count`是公开轨迹行数，不是成功轨迹数；提交标记、自测通过和shell return code均不能替代官方verifier。
- 从166题候选中固定筛选30个train任务；实际并发10偏离计划并发4。
- 27题正常评分，reward 1/0为2/25，scoreable-only `pass@1=2/27=7.41%`。
- 其余3题均为基础设施异常：2题agent容器OOMKilled（exit 137），1题自动label为66字节触发Kubernetes 422。
- 30/30后人工中断未正常结束的job收尾，job级`finished_at`为空；该批不能报告成无异常的`2/30`。
- 当前结果已足以作停止判断：不重跑Canary，不从这30题选择8题进入train smoke。
- ACK自动label已统一进行确定性63字符净化；普通Canary增加默认并发硬上限4，Verified专用目标显式允许10。该上限只防止意外放大节点负载；两个8GiB单Pod OOM未复测，停止本轮后不提高默认内存。

### 阶段16：强模型验证数据扩充与统一模型选择

- 固定官方SWE-Smith 59,136题、完整`swe-smith-filtered` 3,748题、官方Claude/GPT成功轨迹和SWE-Master教师池成功统计的revision。
- 阶段A保留125题`freeze-pro`并增加225个已有completed基础镜像的`filter-pro`任务，共350题。
- 阶段B从官方SWE-Smith与完整filtered集合的差集中固定350题；这350题全部具有两个公开数据源的成功证据。
- 主名单合计700题并准备487题候补；新增任务尚未完成Oracle、任务环境镜像和数据注册。
- `Klear-AgentForge-8B-SFT`在统一32K固定任务上得到SWE-Smith 5/30、Verified 8/27、合计13/57，异常为0。
- 最终`Klear-AgentForge-8B`得到完全相同的5/30、8/27和13/57，异常为0。
- `mini-coder-4b`在同一口径下得到SWE-Smith 1/30、Verified 7/27、合计8/57，异常为0。
- `GLM-4_7-swesmith-SFT`已完成固定57题：SWE-Smith Pro为3/30、Verified offline-v3为6/27，合计9/57（15.79%）；作业`2026-08-15__23-32-59`和`2026-08-16__00-29-43`分别耗时1h0m13s和48m38s，分别有7和8个`NonZeroAgentExitCodeError`。
- `a3-rl-swesmith`的Verified27作业`2026-08-16__01-21-05`为6/27，10个`NonZeroAgentExitCodeError`；SWE-Smith作业`2026-08-16__01-23-40`请求30题但只记录29个trial，reward 1为0，异常含13个`NonZeroAgentExitCodeError`和1个`PodReadyTimeoutError`。两作业并发8且几乎全程重叠，单ACK节点同期出现CPU/内存不足，因此当前只归档`6/27`和`0/29 recorded`，不进入无干扰57题正式排名。

当前判断：固定57题上未观察到Klear最终RL模型相对SFT模型的通过率增益；GLM的9/57略高于`mini-coder-4b`的8/57、低于两个Klear 8B模型的13/57，但GLM有15/57个agent非零退出，稳定性明显较差。`a3-rl-swesmith`没有显示出高于现有候选的证据，而且本次作业受资源竞争污染，不能用于精确能力排序。其他候选模型仍在评测，暂不选择GRPO基模。

### 阶段17：freeze-700首批Oracle验收

- 首批固定batch `b1bdff89b852`共40题，Stage A/B为26/14，train/test/validation为34/4/2。
- ACK独占重试中NOP得到38题reward 0和2题`VerifierTimeoutError`；Oracle对38个NOP通过任务得到35题reward 1、1题reward 0和2题`VerifierTimeoutError`。
- 首批正式接受35/40，其中Stage A/B接受23/12；正式Oracle由280条增至320条，raw accepted为212条。
- 结合静态、alignment、镜像和指纹门禁后，有效可冻结185题：Stage A 173、Stage B 12，距350/350分别缺177和338，`final_ready=false`。
- `oracle/results.jsonl` SHA-256为`5530c01e04030193ef33a34ab7416387c32e0739c9e33f5326e850a3386b650e`；`reports/oracle-summary.json`为`81cc0c417a26ed8fee945935a691b85755ec40a7065f0c280b4051d5e1811fbb`。
- Oracle结束后本地进程、ACK Running和Pending Pod均为0。下一批生成前先审计Stage A有效pending和理论最大可达数量。

## 3. 2026-08-17历史系统状态

| 领域          | 已完成                                                                                                                                         | 未完成/风险                                       |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- |
| 基础设施        | k3s、RBAC、EIP、PVC、BuildKit、TCR、Gateway均通过smoke；两卡collective/FSDP2/FSDP1均在禁用故障P2P路径后通过                                                        | 当前AutoDL机器必须禁用NCCL Direct P2P；正常机器不应盲目继承     |
| 数据          | 现有500题已导入注册；下一版GRPO已固定350+350主名单和487题候补；freeze-700生成、指纹、Oracle对账、镜像门禁与注册验收代码已就绪                                                             | 新增任务仍需在CVM实际执行Oracle和镜像验收，700题名单不能直接训练       |
| Canary      | Klear SFT与最终RL模型均为13/57；`GLM-4_7-swesmith-SFT`为9/57但有15个agent异常；`mini-coder-4b`为8/57；`a3-rl-swesmith`为Verified 6/27和SWE-Smith 0/29 recorded | `a3`两作业重叠造成ACK资源竞争，不能并入无干扰排名；其他候选仍在评测，当前不选基模 |
| GRPO        | 两卡FSDP1完成更新；rank 32 safetensors恢复合法动作、相关性0.999536                                                                                           | 当前批次两条轨迹均reward 0；等待非零学习信号与更新后adapter同步验证    |
| 镜像/Registry | TCR 80分片、84基础镜像、166历史任务镜像、357预热组合均完成                                                                                                        | 无当前缺口                                        |

## 4. 2026-08-17历史执行顺序

1. 按统一57题、32K、runtime v3口径完成其余候选模型评测，分别记录SWE-Smith30和Verified27；同一ACK节点一次只运行一项评测，且不得与Oracle重叠。
2. 全部候选完成前不选择GRPO基模；协议或基础设施异常不得计作模型失败。
3. 分阶段处理700题名单：先验收阶段A新增225题，再生成和验收阶段B任务；失败项按同阶段候补替换。
4. 数据正式冻结后，在候选train任务上验证同组rollout同时出现reward 0和1，再运行非零学习信号smoke。
5. 完整多卡GRPO产生至少一个非零advantage/grad norm batch后，才启动正式训练；训练完成后评估冻结test。

## 5. 历史CVM按需开关机周期（当前不适用）

以下流程只适用于保留CVM和云硬盘的历史场景。当前CVM、CBS及相关资源已经释放，不能通过重新开机恢复。历史上关机前需停止训练/Oracle并清理残留sandbox Pod；保留BuildKit和PVC后重新开机流程为：

```text
CVM：确认数据盘挂载 → k3s active → node Ready → BuildKit正常 → 重启本地tunnel → curation preflight
AutoDL：按需开机 → 验证P2P规避项 → rank32 safetensors → 非零学习信号smoke
```

过去仅在EIP、系统盘和数据盘保持不变时，才不需要重装k3s、重签TLS或重做KubeConfig。未来恢复属于全量重建，必须重新完成这些步骤。

## 6. 2026-08-17历史门槛

- 数据门槛：已通过；AutoDL import/register/status与350/75/75数量一致。
- Verified能力门槛：固定27题恢复口径10/27 = 37.04%，两个原verifier异常已在offline-v3复测为无异常失败；如需单一归档证据仍需完整27题重跑。
- SWE-Smith RL重叠集门槛：未通过；正常评分27题中仅2题reward为1，scoreable-only `pass@1=7.41%`，停止本轮8题选择和train smoke。
- 模型选择门槛：Klear SFT与最终RL模型均为13/57，`GLM-4_7-swesmith-SFT`为9/57，`mini-coder-4b`为8/57；Klear与mini-coder三组作业均无异常，GLM有15/57个agent非零退出。`a3-rl-swesmith`记录为Verified 6/27和SWE-Smith 0/29 recorded，但因两作业重叠引发ACK资源竞争而不进入正式排名。其余候选尚未完成，因此未选择基模。
- 下一版数据门槛：700题候选名单已固定，但新增任务尚未完成Oracle、镜像和注册，未达到训练就绪状态。
- 训练链路门槛：单卡与两卡FSDP1均已完成optimizer step、权重同步和global step 1。
- 多卡门槛：已通过；两卡FSDP2最小smoke和两卡FSDP1完整更新均完成。
- 正式训练门槛：至少一个batch具有非零advantage/grad norm；新数据Canary、k3s并发和W&B记录均已具备。

## 7. 2026-08-17历史周期

原700题扩充目标已按允许短缺规则收敛并冻结为`swesmith-curated-grpo-267-v1`：train/validation/test为187/42/38，覆盖89个仓库，267/267个任务镜像已验证。该结果取代第3、4、6节中“700题尚待作业”的当前状态，但保留那些段落作为历史执行记录。

新数据集上的64K Canary已完成：`Klear-AgentForge-8B-SFT`在validation确定性抽样30题中通过12题、失败18题、异常0。当前执行顺序调整为：

1. 保持GRPO入口和历史结果不变；
2. 完成PPO静态配置、critic/value兼容和GRPO回归测试；
3. 在4×80GB上先通过四卡collective/FSDP门禁，再执行关闭reference KL的PPO micro smoke；
4. 验证同一PPO入口的checkpoint恢复；有显存余量时再验证非零KL；
5. 根据4卡每rank峰值显存和吞吐选择正式PPO使用6卡或8卡。

PPO已完成从四卡colocated诊断到五卡分离拓扑验收：4×A800 80GB运行actor/critic FSDP，另1卡运行唯一TP=1 vLLM。Parent 20步及其后的40K、900秒、并发8 warm-start 20步均完成actor/critic更新、权重同步和紧凑checkpoint；effective step 40 checkpoint已生成。后续统一64K P0已经完成：SFT与parent step20在test38均为6/38，在Verified27均为9/27，配对检验无差异。最终决策为停止追加训练并释放腾讯云运行面，项目阶段性归档。
