Download docs/PROJECT_README.md from keryszhan/harbor-qwen-grpo-experiment: direct link, hf CLI and curl.
- Browser
- Download file 42.2 kB
-
https://huggingface.co/spaces/keryszhan/harbor-qwen-grpo-experiment/resolve/main/docs/PROJECT_README.md
- Command line
-
hf download hf://spaces/keryszhan/harbor-qwen-grpo-experiment/docs/PROJECT_README.md
-
curl -L -o PROJECT_README.md https://huggingface.co/spaces/keryszhan/harbor-qwen-grpo-experiment/resolve/main/docs/PROJECT_README.md
harbor-qwen-grpo-experiment
本项目曾在 AutoDL GPU 节点运行 rLLM + verl + vLLM,并以 GRPO 和原生 critic/GAE PPO 驱动工具调用训练。项目已于2026-08-30完成P0并进入阶段性归档:原始SFT与父checkpoint step20在统一64K协议下,test38均为6/38,Verified27按全部attempt均为9/27,两个面板都没有呈现总体增益;parent在Sphinx 8621发生一次8Gi sandbox Pod OOM,但不改变“不追加PPO训练”的结论。腾讯云CVM、云硬盘及相关计费资源已经释放,k3s、BuildKit、sandbox和verifier当前均不在线;下文部署结构与命令作为已验证的历史架构和未来重建手册保留。Qwen Code仅作历史回退。
当前状态(2026-08-30)
| 项目 | 状态 |
|---|---|
| 实验决策 | P0完成,停止追加PPO训练,项目阶段性归档 |
| 64K test38 | SFT 6/38;parent step20 6/38 |
| 64K Verified27 | SFT 9/27;parent step20 9/27(26个scoreable,1个基础设施异常) |
| 配对结论 | test38为3胜32平3负;Verified27为2胜23平2负;两者exact McNemar p均为1.0 |
| 效率结论 | parent消耗更多input tokens、agent steps和运行时间,但没有提高总体成功数 |
| 云端状态 | 腾讯云CVM、CBS及相关计费资源已释放;原k3s运行面不可直接恢复 |
| 恢复前提 | 重新创建CPU节点、k3s、BuildKit/PVC、KubeConfig/RBAC和GPU模型网络入口 |
已验证的历史架构与边界
Mac: 源码/补丁/证书
├── Registry: TCR个人版为当前主仓;ACR仅作迁移源/兼容回退
└── AutoDL: Harbor + rLLM + verl + vLLM + GRPO / PPO
│ kubeconfig / model gateway / BuildKit tunnel
▼
腾讯CVM/k3s(已释放): BuildKit + sandbox Pod + verifier + CPU数据治理
- Harbor 是 AutoDL 上的训练调度库,不需要部署成常驻 Web 服务。
- 历史k3s节点不承担模型训练;它负责构建任务镜像、隔离执行代码和返回verifier reward。该节点现已释放。
make canary只验证环境、harness、轨迹和 reward 闭环;make train才会更新模型。
2026-08-30 最终实验快照
- 当前正式训练数据为
swesmith-curated-grpo-267-v1:train/validation/test 为187/42/38,共267题、89个仓库;split manifest语义摘要为ae5df9a3f4a3fc8af44fac420b36529e283839e1bd3de9daba65d5bcda51447d。 - TCR已验证267/267个冻结任务镜像,基础镜像为103个available、2个skipped、0个pending;700题是候选扩充目标,不是当前训练集规模。
Klear-AgentForge-8B-SFT在该数据集validation中按seed20260817抽取30题完成64K Canary:12/30、Mean 0.400、Exceptions 0,作业为state/harbor-jobs/2026-08-17__16-14-11。该题集与此前统一32K固定57题不是同一口径,不能直接比较涨跌。- GRPO入口及64K Canary保持现状。PPO的5卡分离拓扑固定为4卡actor/critic FSDP加1卡单实例TP=1 vLLM;第二轮40K、900秒、并发8的20-step warm-start完整运行,160个episode无error、32个成功、12个timeout,末步导出177.5MiB actor PEFT adapter与14.11GiB critic BF16 model shards。训练成功率前10步为22.5%、后10步为17.5%;32次成功中16次来自同一Pygments任务,critic VF loss虽降至0.0078但explained variance仍为负,不能据此放行继续训练。三模型能力评测已经完成;历史SWE-Smith30包含train任务,不作为放行指标。PPO训练与test38评测使用40K Plus guard并保留256-token安全余量;Verified27由Agent侧限制为32K,不能因同一vLLM以40K启动而写成40K评测。
- 父checkpoint
20260820T154406Z/global_step_20已在seed20260822、并发8、retry 0下完成正式基线:test38为6/38(15.79%,0 exceptions,Wilson 95%为7.44%–30.42%);Verified27为6/26有效trial(23.08%,Wilson 95%为11.03%–42.05%),按全部27次attempt为6/27(22.22%),pylint-4661有1个RuntimeError。运行ID为20260822-parent-full-184437Z。后续current在test38降至4/38、Verified27按全部attempt仍为6/27,因此未形成随step单调提升。 - 原始
Klear-AgentForge-8B-SFT已以base模式、相同seed20260822、并发8、retry 0完成正式基线,运行ID为20260822-sft-full-204740Z。test38为4/38(10.53%,Wilson 95%为4.17%–24.13%),Verified27为4/27(14.81%,Wilson 95%为5.92%–32.48%);两面板均0 exceptions、0 timeouts。父checkpoint相对本次SFT在test38多2题(+5.26个百分点),在Verified27按全部attempt多2题(+7.41个百分点),但区间高度重叠且每题仅采样一次,当前只能记录点估计,不能判定能力提升。历史SFT曾在同一Verified27得到8/27,进一步说明单次小样本方差不可忽略。 - Effective step 40 checkpoint
20260821T114029Z/global_step_20以run20260822-current-full-214727Z完成同口径评测。test38为4/38(10.53%,Wilson 95%为4.17%–24.13%),与SFT同分、较parent少2题;Verified27为6/27(22.22%,Wilson 95%为10.61%–40.76%),较SFT多2题、与parent按全部attempt成功数和通过率相同。两面板均0 exceptions、0 timeouts。current与SFT在test38虽然总分相同,但4个成功任务完全不同;Verified27与SFT仅共享3个成功任务,且与parent也仅共享3个,说明单次结果存在显著任务级翻转,尚无稳定的整体提升证据。 - 同一固定Verified27的历史约64K SFT恢复口径为10/27(37.04%),当前正式32K SFT为4/27(14.81%),观察差为-6题、-22.22个百分点。两者可以作为运行口径的实际成绩比较,但历史10/27由offline-v2主批次与2个offline-v3异常恢复任务拼接,并非与当前相同的单作业受控A/B;并发生成也不保证逐token确定性。当前P0扩大为统一64K协议下的SFT与parent step20双面板比较,同时覆盖test38和既有Verified27,不把历史差值直接解释为上下文效应。
- P0的SFT侧以run
p0-klear64k-sft-20260828T145119Z完成统一64K公开协议:test38为6/38(15.79%,Wilson 95%为7.44%–30.42%),Verified27为9/27(33.33%,Wilson 95%为18.64%–52.18%);两个面板均0 exceptions、0 timeouts,真实64512-token探针和ACK Pod模型端点门禁通过。Verified27相对历史同任务32K SFT的4/27观察上升5题,但parent同协议最终也为9/27;单次temperature 1.0生成存在任务翻转,不能把该差异单独归因为context。 - P0的parent step20侧以run
p0-klear64k-parent-20260828T160138Z完成:test38为6/38(15.79%,0 exceptions);Verified27按全部attempt为9/27(33.33%),scoreable为9/26(34.62%),Sphinx 8621的agent Pod触及8Gi limit后以OOMKilled/exit 137终止并被Harbor记录为1个NonZeroAgentExitCodeError。相对SFT,test38配对为3胜32平3负,Verified27 benchmark为2胜23平2负,两个面板delta均为0、exact McNemar p均为1.0。parent的平均input tokens和agent steps在两个面板均明显更高,但没有换来总体成功率提升;该P0不支持继续追加PPO训练。 - 2026-08-30完成资源收尾:腾讯云CVM、CBS和相关计费资源已释放。历史
ACK_*变量和environment_type=ack仍是代码兼容接口名称,不代表当前存在可连接的ACK或k3s集群。
以下按日期保留历史里程碑;历史500题、700题候选和32K模型选择结果不覆盖上述当前快照。
2026-08-13最新里程碑:Oracle累计记录1440条、接受981条;正式冻结train/validation/test为350/75/75,共覆盖77个仓库并返回 freeze_ready=true。500条冻结集已在AutoDL导入并注册为 swesmith-curated-poc-500-v2。64K服务探针三档全部通过,边界档总token为64544/65536。runtime v3 + official-public-repro的空轨迹守卫、environment -> env兼容和working_dir运行时注入均已完成;最终1-task Canary通过基础设施闭环:Exceptions=0、Submitted、模型调用37次、assistant/Shell各37轮、输入/输出token为332761/4814、reward字段完整且vLLM无上下文400/OOM。下一阶段为A800 80GB单卡上的10-task并发Canary:vLLM先采用max-num-seqs=4、32K scheduler token batch、chunked prefill和0.90显存利用率,Canary采用tasks=10、concurrency=4、retry=0;若启动日志给出的64K最大并发低于4则降为2,不降低单请求65,536窗口。
2026-08-14追加里程碑:64K服务探针三档全部通过,边界档总token为64544/65536,Canary启动前的真实40K请求gate也已通过。固定SWE-bench Verified 27题Canary产生10个成功;原offline-v2批次为25个正常评分加2个verifier异常,两个异常任务随后在offline-v3分别复测为 Exceptions=0, reward=0,校正结果为10/27 = 37.04%。该点估计与论文SFT的38.2%数值接近,但它是固定27题诊断子集上的“原批次 + 异常恢复”口径,不是单一 27 Trials / 0 Exceptions 作业,也不等价于完整500题榜单复现。
2026-08-14 SWE-Smith RL重叠集诊断:从166题中固定筛选的30个train任务实际以并发10运行,27题正常评分,其中reward 1为2题、reward 0为25题,scoreable-only pass@1=2/27=7.41%;另有2题agent容器在8GiB Pod上限内OOMKilled(exit 137)和1题ACK自动label超过Kubernetes 63字节限制。该作业在30/30后被人工中断收尾,因此job级 finished_at 为空,不能报告为无异常的2/30。当前证据已足以判定该候选集的pass@1过低:不重跑本轮Canary,也不从这30题继续选择8题进入train smoke。ACK自动label现统一进行确定性63字符净化;普通Canary默认并发硬上限为4,Verified专用目标显式允许10。并发上限只防止再次意外放大节点负载,不代表两个单Pod OOM已被复测修复;本轮停止后不盲目提高Pod内存。
2026-08-14 Klear数据调研补充:公开的66K SWE-Smith数据是SFT消息轨迹集,固定revision共65,994行且schema仅含instance_id、messages。论文没有披露这些SWE轨迹由哪些模型生成;文中“强教师模型至少成功一次”描述的是另行的RL任务筛选,不能作为66K轨迹来自强模型或逐条成功的证据。提交标记、模型自测、shell返回码以及本项目的klear_trajectory_count均不等价于官方verifier的reward 1。
2026-08-14 强模型验证交集已固定:2,614题静态通过集与官方Claude/GPT成功轨迹、SWE-Master教师池成功统计取并集式成功交集后得到487题filter-pro;再与当前正式冻结500题及completed镜像取交集,得到125题freeze-pro,其中train/validation/test为90/18/17。freeze-pro中8题被两个独立数据源验证,7题有Claude 3.5成功证据;当前静态通过集没有GPT-4o成功任务交集。详细口径与证据边界见output/docs/SWESMITH_STRONG_MODEL_FILTER.md。
同日已从freeze-pro固定模型选择用SWE-Smith 30题(validation18 + priority/sha256排序的train12),并增加统一32K的Verified27 + SWE-Smith30测评入口。8B主候选、SERA-14B条件门槛、32B硬件门槛和仅供用户在AutoDL执行的命令见output/docs/SWE_AGENT_MODEL_SELECTION_PLAN.md。
2026-08-15数据扩充名单已固定:阶段A保留125题freeze-pro并从已有镜像的filter-pro增加225题,阶段B从官方59,136题与完整3,748题swe-smith-filtered的差集中选择350题,总计700题;另有阶段A 137题和阶段B 350题候补。阶段B主名单350题全部同时具有官方Claude/GPT成功轨迹与SWE-Master教师池成功证据。该名单尚未完成新增任务Oracle和镜像验收,不能直接注册为训练集。详见output/docs/SWESMITH_GRPO_700_EXPANSION.md。
freeze-700执行链已实现:阶段A从已验收数据包复用任务目录,阶段B从固定官方revision通过Harbor SWE-Smith adapter生成;每题记录任务树与verifier指纹。历史177个accepted和103个终止失败可对账复用,4个RuntimeError重新进入Oracle队列。最终解析强制Stage A/B各350、split 490/105/105、仓库隔离、单仓上限20和至少90个仓库。新基础镜像以baseanchor-*分散到现有80个TCR分片,不新增仓库;基础镜像copy前和每个Oracle批次云端作业前均以实tag做100 tag增量投影门禁。代码就绪不代表数据已freeze;仍须在CVM/AutoDL完成实际作业。
2026-08-15统一32K模型选择进展:Klear-AgentForge-8B-SFT与最终Klear-AgentForge-8B均在SWE-Smith30得到5/30、在SWE-bench Verified27得到8/27,合计均为13/57(22.81%),两组作业均无异常。当前固定57题上未观察到最终RL模型相对SFT模型的通过率增益;这不是完整Verified 500题或论文64K口径结论。其他候选模型仍在评测,当前不提前选择GRPO基模。
2026-08-15 mini-coder-4b完成同一统一32K、mini-swe-agent-plus、runtime v3的固定57题评测:SWE-Smith Pro 30题1/30(3.33%),SWE-bench Verified 27题7/27(25.93%),合计8/57(14.04%),两个作业均为Exceptions=0。对应Harbor作业为2026-08-15__23-02-43和2026-08-15__23-18-14;该固定小样本结果低于两个Klear 8B候选的13/57,不等价于完整Verified 500题结论。
GLM-4_7-swesmith-SFT已完成相同32K、mini-swe-agent-plus、runtime v3口径的固定57题评测:SWE-Smith Pro为3/30(10.00%),SWE-bench Verified offline-v3为6/27(22.22%),合计9/57(15.79%)。两个作业分别为2026-08-15__23-32-59和2026-08-16__00-29-43,耗时1h0m13s和48m38s,均使用并发8、retry=0;两部分分别有7和8个NonZeroAgentExitCodeError,合计15/57。当前摘要按全部trial原样计分,不因agent异常调整分母;该成绩略高于mini-coder-4b的8/57、低于两个Klear 8B候选的13/57,且有效运行率明显更低,因此不足以据此选择GRPO基模。
a3-rl-swesmith也完成了同一32K、mini-swe-agent-plus、runtime v3入口的两组请求,但两项作业几乎全程重叠并共同以并发8使用单个ACK节点,因此必须保留资源竞争边界。SWE-bench Verified offline-v3作业2026-08-16__01-21-05记录27/27,reward 1为6题、reward 0为21题,Mean为0.222,另有10个NonZeroAgentExitCodeError,耗时1h15m3s。SWE-Smith Pro作业2026-08-16__01-23-40请求30题但摘要只记录29个trial,29题reward均为0,Mean为0.000;异常为13个NonZeroAgentExitCodeError和1个PodReadyTimeoutError,耗时1h19m59s。同期ACK调度明确出现CPU/内存不足,freeze-700首批Oracle因此在正式写入前安全中断,Oracle结果仍保持历史280条不变。当前按原始作业记录保留6/27和0/29 recorded,不把缺失trial或PodReadyTimeoutError归因为模型能力,也不将两项直接合并成可与无资源竞争作业等价的57题排名;如需正式比较,应在ACK独占窗口复测受影响任务。
2026-08-16 freeze-700首批40题已在ACK独占窗口完成并通过验收。NOP为38题reward 0、2题VerifierTimeoutError;排除这2题后的Oracle为35题reward 1、1题reward 0和2题VerifierTimeoutError。正式结果由280条增加到320条,其中accepted为212条;首批接受35/40,Stage A/B分别接受23/12。按静态、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。下一批前必须先审计Stage A剩余候选的理论可达性,不能只按raw accepted数量判断。
配置与本地文件(重建环境时使用)
cd /absolute/path/harbor-qwen-grpo-experiment
cp .env.example .env
# 在 .env 中填写 KubeConfig、Registry、BuildKit 证书、model gateway 等真实值
make help
.env.example是完整模板;.env是本机配置,两者变量名应保持同步。.env可含凭证,已被 Git 和 AutoDL 打包流程排除。ACK_REGISTRY_PREFIX、Registry凭证和ACK_IMAGE_PULL_SECRET必须匹配。切换ACR/TCR后必须重新执行make ack-prepare。- 当前主仓为
ccr.ccs.tencentyun.com/harbor-qwen-grpo-tcr,使用ACK_TASK_IMAGE_LAYOUT=base-sharded-tags、80个task-XX分片仓库和ACK_TASK_IMAGE_BASE_SHARDS=5。该布局为2614个静态通过任务及basecache-*预热标签保留单仓库100个版本配额余量;旧sharded-tags和ACRrepository-per-task路径仅作兼容。 - 已有ACR镜像可在CVM使用
make registry-migrate-linux直接复制到TCR;迁移脚本同时处理3个基础设施镜像、已完成的基础镜像及completed/skipped状态,不经Mac下载镜像层。 - 有效管理员 KubeConfig 应保存在项目外,并由
KUBECONFIG_PATH指向。项目根目录的ack-admin-public.yaml是 0 字节空文件,未被任何代码引用,可手动删除。 docker/base-images-*.json和docker/base-image-rewrites.json是 Mac 侧便携镜像队列/快照。make dataset-images-mirror默认使用docker/base-images-manifest.json;可用IMAGE_MANIFEST=/absolute/path/...覆盖。AutoDL 运行时仍使用state/datasets/.../profiles/...下的 profile 文件。- CVM/Linux 可安装
skopeo后运行make dataset-images-mirror-linux;已导出CURATION_IMAGE_MANIFEST_FILE时自动读取当前 profile 清单。DATASET_IMAGE_DOCKERHUB_PROXY_PREFIXES是逗号分隔的显式代理前缀;代理失败会回退原始 Docker Hub。目标 manifest digest 与源 linux/amd64 digest 一致后才进入 completed,失败项保留 pending。2 GiB 搬运阈值只限制尚未复制的镜像,ACR 中已存在且 digest 一致的镜像直接复用。
阶段与 Make 入口(历史流程/重建手册)
以下命令不能在当前归档状态直接执行;必须先重新配置CPU云节点、k3s、Registry访问、BuildKit证书与PVC、KubeConfig/RBAC,以及AutoDL到sandbox和model gateway的网络链路。
1. Mac 准备
make mac-preflight
make prepare-sources
make buildkit-certs
make push-infra-images
make package-autodl
2. AutoDL 与 ACK 准备
make install-conda
make autodl-ack-network
# Mac 管理员身份
make ack-prepare
make buildkit-up
# AutoDL 运行身份;buildkit-tunnel 需常驻
make buildkit-tunnel
make buildkit-status
make buildkit-smoke
make network-smoke
make preflight
3. 数据筛选与镜像
make pull
make dataset-plan
make dataset-download
make dataset-filter
make dataset-images-plan
# 在 Mac 上同步镜像;默认读 docker/base-images-manifest.json
make dataset-images-mirror
# 或在 CVM/Linux 上使用 skopeo 直接复制;默认读取当前 profile 清单
make dataset-images-mirror-linux
# 回到 AutoDL/ACK 验收、oracle 验证、冻结 split
make dataset-images-check
make dataset-oracle
make dataset-freeze-check
make dataset-freeze
make dataset-register
make dataset-status
3.1 从ACR切换到TCR个人版
迁移必须在没有运行Oracle/Canary/GRPO任务时执行。Mac用腾讯云CLI准备命名空间和仓库;CVM的同一个skopeo auth文件同时登录ACR和TCR,然后复制已有镜像:
# Mac:TCR_PERSONAL_REGION固定为ap-guangzhou;个人版中国大陆主服务位于广州
make tcr-prepare-personal
# CVM:先把ACK_REGISTRY_PREFIX指向TCR,但暂不改CURATION_IMAGE_REGISTRY_PREFIX
skopeo login --authfile "$DATASET_IMAGE_REGISTRY_AUTH_FILE" "$ACR_PUBLIC_REGISTRY_HOST"
skopeo login --authfile "$DATASET_IMAGE_REGISTRY_AUTH_FILE" "$TCR_REGISTRY_HOST"
make registry-migrate-linux
# CVM:迁移成功后令基础镜像目标也指向TCR
# CURATION_IMAGE_REGISTRY_PREFIX=${ACK_REGISTRY_PREFIX}
make dataset-images-plan
迁移已有任务镜像或进行大批量Oracle前,在CVM按顺序执行 make registry-prewarm-plan、make registry-task-migrate、make registry-prewarm-linux 和 make registry-prewarm-check。该流程先校验每个任务仓库最多100个标签,再把基础层预热到对应 task-XX 仓库。随后由Mac管理员使用TCR凭证运行 make ack-prepare,更新两个namespace的pull secret;再执行 make buildkit-up、make dataset-images-check、make buildkit-smoke。CVM与AutoDL的 .env 均需使用同一TCR前缀和80分片布局。
2026-08-11验收快照:3个基础设施镜像的源/目标digest一致;84个可用基础镜像已迁移、3个超限项保持skipped、pending为0;166个历史任务镜像目标完成布局迁移;357个“基础镜像 × 任务仓库”组合已预热并通过digest校验,单仓库最大投影标签数为93/100。registry-migrate-linux 只处理infra、基础镜像和镜像队列状态;历史任务镜像由 registry-task-migrate 单独处理。
3.2 批量Oracle与冻结停止条件
CVM使用 CURATION_ORACLE_BATCH_SIZE=40、CURATION_ORACLE_CONCURRENCY=10 和 CURATION_ORACLE_VERIFIER_TIMEOUT_SEC=180。oracle-batch 按split缺口和仓库覆盖做确定性轮询,优先选未覆盖/低覆盖仓库,避免任务名排序导致仓库集中。2026-08-11批量循环已在 freeze_ready=true 时输出 BULK_ORACLE_FREEZE_READY 并停止;最终Oracle为1440条记录、981条接受,冻结选择为350/75/75和77个仓库。
buildkit-tunnel 和 dataset-oracle-bulk 必须是两个独立tmux会话。CVM重启后,BuildKit Pod/PVC会保留,但本机 127.0.0.1:1234 的port-forward不会自动恢复;必须先重启隧道并通过 make buildkit-status 和 make buildkit-smoke,再启动Oracle。若出现 dial tcp 127.0.0.1:1234: connect: connection refused,应立即停止bulk,严格按受影响batch的task ID恢复,不得笼统删除所有 RuntimeError。详细命令和恢复流程见 output/docs/DATASET_EXPANSION_500_RUNBOOK.md。
4. Canary、GRPO、PPO 与评估
已验证的两卡colocated配置为 TRAIN_N_GPUS_PER_NODE=2、TRAIN_TENSOR_PARALLEL_SIZE=1、TRAIN_MODEL_DTYPE=bf16、TRAIN_GPU_MEMORY_UTILIZATION=0.35,并关闭actor、optimizer与reference CPU offload。当前AutoDL机器必须设置 NCCL_P2P_DISABLE=1,否则原始 all_reduce 即会死锁;该规避项不是正常机器的通用默认值。独立Canary vLLM必须在GRPO前停止。
make canary
make fsdp2-smoke
make train-smoke
make train
make eval-curated
make ppo-eval-checkpoint
make ack-status
make ack-stop
PPO不由现有 make train 隐式启用。ppo-smoke固定1个update;ppo-soak只允许2–3个update,超过3步会在preflight前失败;make ppo是唯一正式入口,强制使用完整187题train split、TRAIN_TOTAL_BATCHES=-1和按epoch训练。正式batch默认为8,因此每个epoch有24个update:187题各出现一次,尾批确定性补5次暴露,不再静默丢掉3题。训练期validation固定为validation42中的确定性21题(约10%),在step 0/10/20/24执行;checkpoint保存step 10/20/24。完整42题只用于训练后复评。每个epoch输出TRAIN_EPOCH_COVERAGE;若末步不落在常规保存间隔上,会额外保存最终checkpoint并输出PPO_FINAL_CHECKPOINT_PASSED。完整边界见 output/docs/PPO_TRAINING_RUNBOOK.md。
scripts/ 与 Makefile 对照
| 阶段 | Make 指令 | 脚本 | 作用 |
|---|---|---|---|
| 通用 | — | scripts/lib.sh |
加载 .env、检查变量/工具、激活 Conda、组装 BuildKit 与镜像重写参数。 |
| Mac | make mac-preflight |
09_macos_preflight.sh |
检查 Intel Mac、Git、Docker daemon、Buildx 和基础命令。 |
| Mac | make prepare-sources |
10_prepare_sources_macos.sh |
拉取固定 commit 的 Harbor/rLLM,幂等应用 patches/。 |
| Mac | make package-autodl |
12_package_autodl_bundle.sh |
打包已打补丁源码,排除 .env、凭证、state 和运行输出。 |
| Mac | make tcr-prepare-personal |
14_prepare_tcr_personal.sh |
幂等创建TCR个人版命名空间、基础仓库和配置数量的任务分片仓库。 |
| CVM | make registry-prewarm-plan、make registry-task-migrate、make registry-prewarm-linux |
17_prewarm_task_repositories_linux.sh |
校验TCR标签配额、迁移旧分片任务镜像,并将基础层预热到当前任务仓库。 |
| Mac | make push-infra-images |
13_push_infra_images_macos.sh |
将 BuildKit、curl 和 uv 的 linux/amd64 镜像推入当前Registry。 |
| CVM | make registry-migrate-linux |
16_migrate_registry_images_linux.sh |
使用skopeo把现有基础设施与基础镜像从旧Registry复制到当前Registry,并迁移镜像队列状态。 |
| Mac | make buildkit-certs |
15_generate_buildkit_certs.sh |
在 .secrets/buildkit/ 生成 BuildKit mTLS CA/server/client 证书。 |
| AutoDL | make install-conda |
11_install_conda_autodl.sh |
在已激活 Conda 环境安装项目、Harbor、rLLM 和 verl,并验证 CUDA。 |
| AutoDL | make autodl-ack-network |
25_autodl_ack_network.sh |
验证 AutoDL 出口 IP、Registry、k3s API、KubeConfig、RBAC 和 Secret。 |
| ACK | make ack-prepare |
20_ack_prepare.sh |
创建 runtime/builder namespace、匹配 Registry 域名的 pull secret、ServiceAccount 和 BuildKit TLS Secret。 |
| ACK | make buildkit-up |
21_buildkit_up.sh |
渲染 k8s/buildkit 模板,部署 rootful BuildKit、Service 和持久缓存 PVC。 |
| ACK | make buildkit-tunnel |
24_buildkit_port_forward.sh |
在当前执行端(CVM做Oracle,AutoDL做Canary/GRPO)循环维持 127.0.0.1:1234 到 ACK BuildKit 的端口转发。 |
| ACK | make buildkit-status |
22_buildkit_status.sh |
查看 BuildKit Deployment/Pod/Service/PVC,并查询 buildctl worker。 |
| ACK | make buildkit-smoke |
26_buildkit_smoke.sh |
通过 mTLS tunnel 执行无残留的最小 OCI 构建。 |
| ACK | make network-smoke |
23_ack_network_smoke.sh |
从 ACK Pod 请求 GPU model gateway,验证反向网络。 |
| 验收 | make preflight |
00_preflight.sh |
只读检查 Python/库版本、Kubernetes权限、Registry、gateway和BuildKit。 |
| 数据 | make pull |
30_pull_dataset.sh |
使用 rLLM 拉取 Harbor SWE-Smith 入口数据。 |
| 数据 | make dataset-plan/download/filter/images-plan/freeze/register/status |
31_curate_dataset.sh |
调用 Python 筛选器,完成候选计划、下载、静态过滤、镜像计划、split 冻结/注册和状态统计。 |
| 数据 | make dataset-images-mirror |
33_mirror_dataset_images_macos.sh |
Mac 上逐项处理 pending 镜像:复用本地镜像或 pull,push 到 ACR,验证后删除对应本地 tag;超限镜像转 skipped。 |
| 数据 | make dataset-images-mirror-linux |
35_mirror_dataset_images_linux.sh |
CVM/Linux 使用 skopeo 按 linux/amd64 直接复制;支持单进程有界并发、命令超时、Docker Hub代理与源站回退,状态迁移串行提交,digest验证成功后才归档。 |
| 数据 | make dataset-images-check |
34_check_dataset_images.sh |
通过Registry API检查completed队列的镜像覆盖率。 |
| 数据 | make dataset-oracle |
32_oracle_validate.sh |
按 split 和仓库确定性轮询,在 ACK 分批跑 NOP baseline 和 oracle verifier;verifier 默认180秒超时,NOP失败任务直接拒绝,其余任务继续Oracle。 |
| 数据 | make dataset-freeze-check |
31_curate_dataset.sh freeze-check |
只读模拟冻结,检查三个split目标数和最少仓库覆盖;以 freeze_ready=true 作为停止Oracle的条件。 |
| 数据 | make swesmith-pro-derive |
56_derive_swesmith_pro.sh |
从固定Claude/GPT成功轨迹、SWE-Master教师池统计和正式数据包派生filter-pro/freeze-pro,不运行Canary。 |
| 实验 | make canary |
40_canary.sh |
从冻结并注册的 curated validation 确定性选题,用指定 harness 跑 Harbor canary。 |
| 实验 | make fsdp2-smoke |
51_fsdp2_smoke.sh |
两卡运行不依赖Harbor/CVM的最小NCCL、FSDP2、backward和optimizer step,先隔离多卡运行时。 |
| 实验 | make train-smoke |
50_train_grpo.sh |
默认运行1个train task、每组4条rollout、最多1个optimizer step;支持精确task、短rollout和LoRA rank A/B,每次自动使用独立run目录;不执行validation或checkpoint。 |
| 实验 | make train |
50_train_grpo.sh |
检查冻结数据和镜像覆盖后,启动 rLLM + verl + vLLM + GRPO。 |
| 实验 | make ppo-smoke、make ppo-soak、make ppo |
59_train_ppo.sh |
保持GRPO默认不变;smoke固定1步,soak只允许2–3步,formal完整遍历187题并以确定性尾批补齐batch。 |
| 实验 | make eval-curated |
55_eval_curated.sh |
只读取冻结 test split 执行独立评估,避免训练泄漏。 |
| 实验 | make ppo-eval-checkpoint |
61_eval_ppo_checkpoint.sh |
单卡启动原始SFT或指定actor LoRA;P0统一以官方64K协议评测冻结test38与既有Verified27,并按面板输出benchmark/scoreable Pass@1、Wilson区间及配对统计。 |
| 运维 | make ack-status |
60_ack_status.sh |
汇总 ACK builder 和 runtime sandbox 状态。 |
| 运维 | make ack-stop |
90_ack_stop.sh |
删除实验Pod/Job,保留BuildKit、PVC和Registry数据。 |
src/ 与 tests/
src/harbor_qwen_grpo_experiment/ 是项目自有 Python 控制层,不复制 Harbor/rLLM 上游实现:
check_registry_images.py:检查 Registry manifest,以原子写方式维护 pending/completed/skipped 队列。curate_swesmith.py:Hugging Face 分页下载、静态过滤、难度/仓库平衡、oracle 结果归一化、镜像计划和 split 冻结。select_canary.py:按 seed 选择/排除 canary,复制任务并保存 verifier 日志。train_harbor_ack.py:加载冻结 train/validation split,注入 ACK 环境参数,通过 rLLMAgentTrainer连接 verl。
tests/ 是离线单元测试:test_curate_swesmith.py 覆盖队列迁移、分页、过滤、平衡、允许短缺冻结和确定性 split;test_select_canary.py 覆盖排除、确定性选题和 verifier 日志补丁的幂等性。
patches/ 与 upstream/
upstream/harbor 和 upstream/rllm 是固定 commit 的上游工作树,由 make prepare-sources 创建,不应在其中另行积累未记录的手工修改。patches/ 是可审计、可重放的改造来源:
rllm-harbor-ack-env-kwargs.patch:rLLM 将environment_kwargs从配置透传到 Harbor runtime,供 ACK namespace、ServiceAccount、BuildKit、Registry 重写等参数使用。rllm-verl-native-ppo.patch:为unified Verl + Harbor remote runtime增加native critic/GAE、critic optimizer、actor/critic联合checkpoint及同步separated-rollout路径。rllm-context-budget-empty-trace.patch:拒绝输出预算耗尽的请求和失败/空token trace,并在PPO转换层过滤空prompt/response step,避免上下文边界错误污染训练batch。rllm-separated-rollout.yaml.patch:为固定rLLM配置增加与async_training互相独立的separated_rollout开关。harbor-ack-buildkit-mtls.patch:增加 Harbor ACK environment,支持 rootful BuildKit mTLS、基础镜像重写、ACR 认证、资源/超时调整和 uv 预置。harbor-ack-k8s-name-sanitization.patch:将 ACK Pod 名规范化为 RFC 1123,并用哈希后缀避免长 trial 名截断碰撞。harbor-ack-task-image-shards.patch:为受仓库配额约束的Registry增加确定性任务镜像分片仓库与唯一tag布局。harbor-job-verifier-timeout.patch:为 Harbor job CLI 增加绝对 verifier 超时覆盖,Oracle 将任务自带的3000秒上限统一收紧到180秒。harbor-swesmith-verifier-offline.patch:去掉 verifier 对apt/astral.sh的运行时依赖,使用镜像中的 uv 和可配置 Python 镜像源,并区分基础设施失败与 reward 0。harbor-qwen-skip-preinstalled.patch:ACK 中优先复用预装 Node/Qwen Code,避免依赖raw.githubusercontent.com;仅在APPLY_QWEN_PREINSTALL_PATCH=1时应用。
其他目录
| 路径 | 作用 |
|---|---|
.secrets/ |
Registry用户名/密码和BuildKit mTLS证书;被Git与打包排除。 |
configs/ |
harness 配置;当前为 mini-swe-agent 文本 Bash 动作 YAML。 |
docker/ |
回退用 Qwen Code overlay Dockerfile,以及 Mac 侧 SWE-Smith 基础镜像队列/重写快照。 |
k8s/ |
ACK BuildKit Deployment、Service、PVC 的参数化模板。 |
output/docs/ |
架构、ACK、AutoDL、harness/SFT 和阶段总结文档。 |
output/pdf/ |
已生成的架构和操作 PDF。 |
output/bundles/ |
make package-autodl 产生的可上传 AutoDL 源码包;不入 Git。 |
state/ |
AutoDL 运行时数据、筛选 profile、Harbor jobs、oracle 结果和冻结 split;按需生成,不入 Git。 |
logs/ |
本地运行日志;按需生成,不入 Git。 |
验收与停止条件
make preflight、make buildkit-smoke和make network-smoke必须通过。make canary必须在冻结并注册的 curated validation 上产生真实 Shell observation、可解析 trajectory 和 verifier reward;环境异常或 reward 缺失时不进入训练。- GRPO首轮保持
TRAIN_PARALLEL_TASKS=2,确认 AutoDL GPU/KV cache、ACK Pod 容量和 W&B 指标稳定后再递增并发。 - Oracle 使用
CURATION_ORACLE_VERIFIER_TIMEOUT_SEC=180筛除长尾任务;训练使用TRAIN_VERIFIER_TIMEOUT_MULTIPLIER=0.06,将 SWE-Smith 任务自带的3000秒 verifier 上限等效收紧为180秒。 - 历史500题profile已在350/75/75与77/70仓库覆盖后结束;当前grpo700 profile按显式短缺规则冻结为187/42/38、共267题和89个仓库。
- 当前267题正式冻结集已落盘、导出、导入并注册;后续GRPO/PPO不得向该freeze混入新Oracle任务或改变validation/test。
- 两卡FSDP1 GRPO smoke已在禁用故障P2P路径后完成optimizer step和权重同步。rank 32
safetensors同条件复测已恢复合法动作并证明首次基础权重加载修复有效;正式训练前还必须得到至少一个非零学习信号batch,并验证实际LoRA更新后的再次同步。 - PPO的40K、900秒model-only warm-start第二轮20步已通过工程门禁;能力门禁尚未通过。下一步仅执行P0:在统一64K公开协议下比较原始SFT与父checkpoint step20的test38和Verified27 Pass@1;不得仅依据训练reward继续追加step。