Download docs/pcd_oracle_exploration_notes.md from Jack04810/agentic-rl-main: direct link, hf CLI and curl.
- Browser
- Download file 29.8 kB
-
https://huggingface.co/Jack04810/agentic-rl-main/resolve/main/docs/pcd_oracle_exploration_notes.md
- Command line
-
hf download hf://Jack04810/agentic-rl-main/docs/pcd_oracle_exploration_notes.md
-
curl -L -o pcd_oracle_exploration_notes.md https://huggingface.co/Jack04810/agentic-rl-main/resolve/main/docs/pcd_oracle_exploration_notes.md
PCD Oracle Exploration Notes
更新时间:2026-07-09
Diagnostic Direction: student_hint_short
deplot_no_vs_opd_pcd_oracle_hint_teacher_sft_repair_student_hint_short 单独作为主线不够强,但它仍是有用的 teacher-SFT repair target style。
证据:
- final checkpoint ChartQA test accuracy:
0.5800 - 输出统计:
other=1629、answer_flag=821、full_cot=50 - 相比 constrained repair
0.5656有提升,但没有超过 oracle official0.5872,也没有达到0.60目标。 - 训练健康指标改善但没有转化成足够 eval 增益:
- last50
group_all_wrong_rate=0.545 - last50
routing/grpo_route_rate=0.2325 - last50
signal/grpo_zero_loss_rate=0.75 - teacher-correct rate
0.9248,parse-fail0
- last50
- 失败形态:full-CoT 大幅下降,但 eval log 出现大量短模板污染,例如
Reasoning style和异常Answer:空行格式。
结论:
student_hint_short 证明“缩短 teacher-SFT repair target”有一定价值:它显著降低 full-CoT 污染,但没有单独解决后期 GRPO 有效信号不足。后续不再把它作为唯一改动冲 0.60+;而是把它作为低污染 repair target,与 OPD decay/cap 或动态采样组合。
保留的对照:
deplot_no_vs_opd_pcd_oracle_hint:当前 oracle official,上界/基准,final0.5872deplot_no_vs_opd_pcd_oracle_hint_teacher_sft_repair:teacher-SFT repair 主机制对照deplot_no_vs_opd_pcd_oracle_hint_teacher_sft_repair_student_style:teacher reasoning short target 对照deplot_no_vs_opd_pcd_oracle_hint_teacher_sft_repair_answer_only:只答案诊断对照deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay:student_hint_short+ 后期 OPD decay/cap 主实验
New Main Direction: OPD Decay / Cap After Repair
Motivation
现有 evidence 指向机制瓶颈,而不是 teacher prompt:
- oracle official final
0.5872,但 last50all_wrong=0.775、grpo_route=0.040、zero=0.87。 student_hint_shortfinal0.5800,full-CoT 降到2%,但 last50 仍zero=0.75、opd_route=0.6319。- teacher parse-fail 基本为
0,oracle teacher-correct 很高;问题是 teacher-correct 大量转成 OPD,而不是让后期 GRPO 接管。
因此下一版主实验不再继续调 prompt,而是让 OPD 从冷启动辅助逐步退场。
Implemented Variant
deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay
配置:
- 保留 oracle providers:
format_only,visual_facts_deplot,oracle_hint - 保留 all-wrong PCD:
DYME_TEACHER_PROBE_ALL_WRONG_AFTER_STEP=0 - 保留 teacher-SFT repair:
DYME_TEACHER_CORRECT_REPAIR_MODE=traj_sft - repair target:
DYME_TEACHER_SFT_TARGET_STYLE=student_hint_short - teacher trajectory FKL decay:
- start
147 - end
294 - final weight
0.0
- start
- OPD loss weight decay:
- start
294 - end
441 - final weight
0.5
- start
- OPD route cap:
- after step
294 - max OPD completions per prompt
2 - overflow route
SFT
- after step
Expected effect:
- last50
opd_route_rate明显低于0.63 - last50
grpo_route_rate高于0.23 - last50
grpo_zero_loss_rate低于0.75 - eval 保持
student_hint_short的低 full-CoT 污染,同时超过 oracle official0.5872
Smoke:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
DYME_PCD_RUN_ID=pcd_oracle_student_hint_opd_decay_smoke10 \
DYME_PCD_MAX_STEPS=10 \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay
4epoch:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
DYME_PCD_RUN_ID=pcd_oracle_student_hint_opd_decay_4epoch \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay
Checkpoint sweep after training:
DYME_EVAL_OUT_ROOT=outputs/test-fast/pcd-no-visual/pcd_oracle_student_hint_opd_decay_4epoch \
bash scripts/test/eval_deplot_ablation_checkpoints.sh --force
Bigger Distribution-Level Variant: Effective Sampling
Motivation
OPD decay/cap 只改变一个 batch 内的 loss/routing 比例,但如果后期 sampler 仍不断抽到 all-wrong 或 all-correct prompt,GRPO 仍然会有大量 zero-signal。DAPO/ReST/STaR 类方法的共同启发是:训练应主动提高有效样本/正轨迹的占比,而不是平均消耗所有 prompt。
Implemented Variant
deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_effective_sampling
它继承 student_hint_short_opd_decay 的所有设置,并新增 dynamic effective sampler:
- 每个训练 prompt 保留最近一次 group 状态:
mixed: 至少一个 correct、至少一个 wrongall_wrongall_correctunknown
- step
<294仍按普通随机 sampler。 - step
>=294开始按状态加权采样:- mixed weight
4.0 - all-wrong weight
1.0 - all-correct weight
0.7 - unknown weight
1.0 - reward std bonus
2.0
- mixed weight
- sampler 仍然对每个选中 prompt 重复
num_generations次,保持 GRPO group 结构不变。
Expected effect:
- 后期 batch 中 mixed prompt 占比提高;
- last50
signal/grpo_zero_loss_rate明显低于0.75; - last50
routing/grpo_route_rate高于0.23; - 不显著增加 full-CoT / answer-flag 污染。
Smoke:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
DYME_PCD_RUN_ID=pcd_oracle_student_hint_opd_decay_sampling_smoke10 \
DYME_PCD_MAX_STEPS=10 \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_effective_sampling
4epoch:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
DYME_PCD_RUN_ID=pcd_oracle_student_hint_opd_decay_sampling_4epoch \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_effective_sampling
Primary comparison:
student_hint_short_4epoch: final0.5800student_hint_short_opd_decay_4epoch: tests whether OPD退火/cap helps without changing samplerstudent_hint_short_opd_decay_sampling_4epoch: tests whether changing prompt distribution reduces zero-signal
If effective sampling improves train health but hurts eval, next knob should not be prompt engineering; first lower mixed weight from 4.0 to 2.0 or delay after_step from 294 to 441.
Bigger Data-Level Direction: Positive Replay Buffer
Motivation
在线 PCD/oracle 训练里,teacher-correct 数量非常高,但模型没有把这些正确轨迹充分转化成后期 GRPO 信号:
student_hint_shortrun 的 candidate logs 全量统计:- candidate rows:
125451 - teacher-correct candidates:
116016 - parse-fail:
0 - dataset match missing:
0 - 去重后 unique positive prompts:
4378 - all-wrong positive prompts:
3107 - mixed-wrong positive prompts:
1271
- candidate rows:
- 这说明 teacher 知道大量正确样本,但在线训练把它们重复地放进 OPD/repair slot,并没有稳定变成学生自己的 correct completions。
因此下一步更大的方向不是继续改 prompt,而是把 teacher-correct 样本沉淀成去重后的 positive replay buffer,做离线 SFT warmup 或在线 replay mixing。
Implemented Export Tool
新增脚本:
python scripts/analysis/export_positive_replay_buffer.py \
--candidate-glob 'outputs/test-fast/pcd-no-visual/pcd_oracle_teacher_sft_repair_student_hint_short_4epoch/deplot_no_vs_opd_pcd_oracle_hint_teacher_sft_repair_student_hint_short/teacher_probe_candidates/rank*.jsonl' \
--dataset data/chartqa/train_medium_vf_full.json \
--out-dir outputs/test-fast/positive-replay-buffer/student_hint_short_full \
--target-style student_hint_short
设计原则:
- candidate log 只作为 verifier/filter signal;
- 不使用 raw
teacher_output作为 replay target,因为 log 里常见截断和 privileged context; - 回连 dataset 后,用 verified
hint/visual_fact_hint+ reference answer 生成 target:Reasoning: <verified hint reasoning>Answer: <reference answer>
- 按 dataset row + answer 去重,避免同一个 prompt 的 8 个 completion 变成重复 SFT;
- 输出
replay.jsonl、replay_train.json、summary.csv、by_scope.csv、preview.jsonl。 replay_train.json专门兼容现有prepare_chart_sft_data:hint只包含无Answer:的 reasoning 前缀;answer保持短 reference answer;target保留完整Reasoning + Answer作为审计字段,训练 data collector 不使用它。
当前 full export 结果:
replay.jsonl:4378rowsstudent_short_rate=1.0000exact_reference_answer_line_rate=1.0000privileged_tag_rate=0.0000- scope:
all_wrong:3107mixed_wrong:1271
Next Training Integration
推荐先做两个不互相混合的实验:
Replay-SFT warmup:
- 先用
replay_train.json做 0.25-0.5 epoch 轻量 SFT; - 再接原 oracle official 或
student_hint_short_opd_decay_effective_sampling; - 目标是降低初期 all-wrong,让 GRPO 更早进入 mixed 状态。
已新增 warmup runner:
# dry-run CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \ DYME_REPLAY_SFT_RUN_ID=positive_replay_warmup_0p5epoch \ DYME_REPLAY_SFT_EPOCHS=0.5 \ bash scripts/test/run_positive_replay_sft_warmup.sh --dry-run # run CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \ DYME_REPLAY_SFT_RUN_ID=positive_replay_warmup_0p5epoch \ DYME_REPLAY_SFT_EPOCHS=0.5 \ bash scripts/test/run_positive_replay_sft_warmup.shWarmup 输出:
outputs/test-fast/positive-replay-sft/positive_replay_warmup_0p5epoch/final_checkpoint接 DyME:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \ DYME_STUDENT_MODEL=outputs/test-fast/positive-replay-sft/positive_replay_warmup_0p5epoch/final_checkpoint \ DYME_PCD_RUN_ID=pcd_oracle_replay_warmup_student_hint_opd_decay_sampling_4epoch \ bash scripts/test/run_pcd_no_visual_4epoch.sh \ --variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_effective_sampling更安全的一键两阶段 runner 已新增。它会先跑 replay SFT warmup,再把 warmup
final_checkpoint明确作为第二阶段DYME_STUDENT_MODEL传给 DyME,避免只设置无效 env 导致 RL 仍从原始llava-0.5b-ov起步。# dry-run:检查 warmup checkpoint handoff 和第二阶段 env CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \ DYME_CHAIN_RUN_ID=pcd_replay_warmup_rl_transition_4epoch \ bash scripts/test/run_replay_warmup_then_pcd_4epoch.sh \ --dry-run # run:stage 1 warmup + stage 2 DyME 4epoch CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \ DYME_CHAIN_RUN_ID=pcd_replay_warmup_rl_transition_4epoch \ DYME_REPLAY_SFT_EPOCHS=0.5 \ bash scripts/test/run_replay_warmup_then_pcd_4epoch.sh如果 warmup 已经跑完,只想重跑第二阶段:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \ DYME_CHAIN_RUN_ID=pcd_replay_warmup_rl_transition_4epoch \ DYME_CHAIN_SKIP_WARMUP=1 \ bash scripts/test/run_replay_warmup_then_pcd_4epoch.sh- 先用
Online positive replay mixing:
- 每 N step 从 replay buffer 注入少量 positive SFT batch;
- 注入比例从
10%-20%起; - epoch 2 后降低或关闭 replay mixing,避免覆盖 GRPO 主信号。
已新增在线 replay variant:
deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_sampling_replay_mix它继承:
- oracle hint teacher probe
student_hint_shortall-wrong teacher-SFT repair- teacher trajectory decay
- OPD weight decay/cap
- effective sampling
并新增:
DYME_POSITIVE_REPLAY=1DYME_POSITIVE_REPLAY_DATASET=outputs/test-fast/positive-replay-buffer/student_hint_short_full/replay_train.jsonDYME_POSITIVE_REPLAY_WEIGHT=0.1DYME_POSITIVE_REPLAY_BATCH_SIZE=1DYME_POSITIVE_REPLAY_AFTER_STEP=0
实现口径:
- replay 不参与 GRPO reward / advantage / routing;
- replay 作为额外 CE loss 加到 batch loss;
- target 使用 replay row 的
target字段,避免双Answer:; - 记录
loss/positive_replay、loss/positive_replay_weight、replay/positive_batch_size、replay/positive_skipped_rate。
Smoke:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \ DYME_PCD_RUN_ID=pcd_oracle_replay_mix_smoke10 \ DYME_PCD_MAX_STEPS=10 \ bash scripts/test/run_pcd_no_visual_4epoch.sh \ --variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_sampling_replay_mix4epoch:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \ DYME_PCD_RUN_ID=pcd_oracle_replay_mix_4epoch \ bash scripts/test/run_pcd_no_visual_4epoch.sh \ --variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_sampling_replay_mixRollout-level prioritized replay:
- static positive replay 学 teacher/dataset target;
- rollout replay 学学生自己生成过、被 verifier 判对且 advantage 为正的 fresh rollout;
- 用 PPO/GRPO-style clipped PG loss,而不是 CE;
- 用 max-age 控制 off-policy staleness;
- 目标是复用稀有正确 student trajectory,让后期 GRPO 信号密度更高。
已新增 variant:
deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_sampling_rollout_replay它继承 replay_mix 全部设置,并新增:
DYME_ROLLOUT_REPLAY=1DYME_ROLLOUT_REPLAY_WEIGHT=0.05DYME_ROLLOUT_REPLAY_CAPACITY=256DYME_ROLLOUT_REPLAY_BATCH_SIZE=2DYME_ROLLOUT_REPLAY_AFTER_STEP=50DYME_ROLLOUT_REPLAY_MAX_AGE_STEPS=64DYME_ROLLOUT_REPLAY_MIN_ABS_ADVANTAGE=0.05DYME_ROLLOUT_REPLAY_POSITIVE_ONLY=1
实现口径:
- 每个 rank 维护本地 rollout buffer;
- 只存
advantage > 0且acc_reward > 0.5的 student rollout; - replay loss 使用保存时 old logp 和当前 logp 的 clipped policy-gradient ratio;
- sample 优先级按
abs(advantage) ** priority_alpha; - 当前 batch 先 replay 历史,再把当前正 rollout 入库,避免同 step 自 replay。
Smoke:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \ DYME_PCD_RUN_ID=pcd_oracle_rollout_replay_smoke10 \ DYME_PCD_MAX_STEPS=10 \ bash scripts/test/run_pcd_no_visual_4epoch.sh \ --variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_sampling_rollout_replay4epoch:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \ DYME_PCD_RUN_ID=pcd_oracle_rollout_replay_4epoch \ bash scripts/test/run_pcd_no_visual_4epoch.sh \ --variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_sampling_rollout_replay
成功标准:
- early first50
group_all_wrong_rate明显低于 student_hint_short; - last50
routing/grpo_route_rate高于0.2325; - last50
signal/grpo_zero_loss_rate低于0.75; - final 或 best checkpoint 超过 oracle official
0.5872; - eval 输出不重新出现 full-CoT / privileged tag 污染。
Next Directions Toward 0.60+
Progress-Scheduled Condition-Aware OPD Overflow
Variant:
deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_effective_sampling_grpo_overflow
This run replaces the fixed 147/294/441 phase boundaries with normalized
optimizer progress. It keeps structured ChartQA reasoning and
student_hint_short repair, while changing late OPD overflow routing:
- teacher trajectory weight decays over progress
0.25 -> 0.50; - effective sampling and the OPD route cap activate at progress
0.50; - OPD weight decays over progress
0.50 -> 0.75; - mixed-group OPD overflow returns to GRPO;
- all-wrong OPD overflow is zero-gradient skip rather than full-hint SFT;
- additive eval-format reward and replay are disabled.
The run also logs diagnostic-only dynamic trigger metrics. sampling_needed
tracks high zero-loss plus low mixed rate; rl_ready tracks low zero-loss plus
high mixed rate. These shadow conditions do not control the current run.
Smoke:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
DYME_PCD_RUN_ID=pcd_oracle_progress_grpo_overflow_smoke10 \
DYME_PCD_MAX_STEPS=10 \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_effective_sampling_grpo_overflow
4epoch:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
DYME_PCD_RUN_ID=pcd_oracle_progress_grpo_overflow_4epoch \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_effective_sampling_grpo_overflow
Primary health checks:
phase/training_progressand phase-active flags follow normalized progress;routing/opd_route_cap_grpo_ratebecomes nonzero for mixed overflow;routing/opd_route_cap_skip_ratebecomes nonzero for all-wrong overflow;routing/sft_route_ratefalls without reducing genuine short repair;- both
phase/dynamic_sampling_*andphase/dynamic_rl_*metrics are present.
1. Eval-Aligned Output Reward
当前 format reward 后期仍高,但 eval log 里有大量 Reasoning style、空 Answer:、Goal/Observation 残留,说明训练 format reward 与 eval parser 目标不完全一致。
建议新 variant:
deplot_no_vs_opd_pcd_oracle_hint_eval_format_reward
只改奖励,不改 teacher/routing:
- 加一个小权重 output-clean reward,要求:
- 最后一条非空行能解析出答案;
- 至多一个
Answer:; - 不包含
[Oracle]、[Final Hard Rule]、[Verified Hint]、[DePlot]、Reasoning style; - 不以
Goal:/Observation:/Conclusion:结尾。
- 先用
0.1权重做 10-step 和 1epoch smoke,再做 4epoch。
预期解决:短模板污染和 answer-line 污染。
实现状态:
- runner variant 已注册;
- config env 已注册:
DYME_EVAL_FORMAT_REWARD、DYME_EVAL_FORMAT_REWARD_WEIGHT; - trainer 会记录
reward/eval_format_mean、reward/eval_format_weight; - 默认关闭,只有新 variant 打开。
推荐命令:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
DYME_PCD_RUN_ID=pcd_oracle_eval_format_reward_smoke10 \
DYME_PCD_MAX_STEPS=10 \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_eval_format_reward
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
DYME_PCD_RUN_ID=pcd_oracle_eval_format_reward_4epoch \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_eval_format_reward
10-step gate:
- training exits OK;
- logs include
reward/eval_format_mean; DYME_EVAL_FORMAT_REWARD=1appears in dry-run;- no
teacher_sft_repairmetrics are required for this variant because it is anchored on oracle official, not teacher-SFT repair.
Smoke 检查:
python scripts/analysis/check_pcd_variant_smoke.py \
--variant deplot_no_vs_opd_pcd_oracle_hint_eval_format_reward \
--log-dir outputs/test-fast/logs/pcd_no_visual_pcd_oracle_eval_format_reward_smoke10/deplot_no_vs_opd_pcd_oracle_hint_eval_format_reward
2. Late-Phase OPD / Teacher-Trajectory Decay
student_hint_short 后期 OPD 仍约 0.632,GRPO route 约 0.233,zero-loss 仍 0.75。这说明 teacher repair 已经改善冷启动,但后期 teacher/OPD 仍压着 GRPO 主信号。
建议新 variant:
deplot_no_vs_opd_pcd_oracle_hint_late_traj_decay
第一版只加 teacher trajectory FKL weight schedule,不改 OPD routing:
- step
<294:teacher trajectory FKL weight 保持0.5; - step
294-441:线性降到0.0; - step
>=441:teacher trajectory FKL weight 保持0.0; - mixed group 仍保持 DyME 核心:correct -> GRPO,wrong teacher-correct -> OPD。
预期解决:OPD 后期过强、GRPO route 不足、zero-loss 过高。
实现状态:
- runner variant 已注册;
- config env 已注册:
DYME_TEACHER_TRAJ_WEIGHT_DECAYDYME_TEACHER_TRAJ_DECAY_START_STEPDYME_TEACHER_TRAJ_DECAY_END_STEPDYME_TEACHER_TRAJ_FINAL_WEIGHT
- trainer 记录
loss/teacher_traj_effective_weight; - 默认关闭,只有新 variant 打开。
推荐命令:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
DYME_PCD_RUN_ID=pcd_oracle_late_traj_decay_smoke10 \
DYME_PCD_MAX_STEPS=10 \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_late_traj_decay
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
DYME_PCD_RUN_ID=pcd_oracle_late_traj_decay_4epoch \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_late_traj_decay
4epoch gate:
loss/teacher_traj_effective_weight从0.5降到0.0;- eval full-CoT 和 oracle/contract 残留不高于 oracle official;
- last50
routing/grpo_route_rate高于 oracle official; - final 或 best checkpoint 逼近/超过
0.60。
Smoke 检查:
python scripts/analysis/check_pcd_variant_smoke.py \
--variant deplot_no_vs_opd_pcd_oracle_hint_late_traj_decay \
--log-dir outputs/test-fast/logs/pcd_no_visual_pcd_oracle_late_traj_decay_smoke10/deplot_no_vs_opd_pcd_oracle_hint_late_traj_decay
如果这个方向有明显训练健康收益但 eval 不够,再进入第二版:all-wrong OPD cap;不要和第一版一次合并。
3. Mixed-Prompt Dynamic Resampling
训练日志里 all-wrong 后期仍超过一半。若每步大量 prompt 不能产生 mixed/correct group,GRPO 有效样本效率不够。
建议新 variant:
deplot_no_vs_opd_pcd_oracle_hint_dynamic_mixed_sampling
先不改变 loss,只改变 batch 选择:
- 每个 training step 过采样候选 prompt;
- 优先保留 reward std 非零或 group_mixed 的 prompt;
- 保留少量 all-wrong prompt 给 SFT/OPD repair,避免完全丢掉冷启动样本;
- 记录
sampling/mixed_accept_rate、sampling/all_wrong_kept_rate、sampling/resample_attempts_mean。
预期解决:单位训练步里的 GRPO 有效信号太少。
Recommended Order
- 先做 positive replay buffer 的训练接入,因为它是数据/训练分布层面的改动,直接针对“teacher-correct 很多但学生转化不足”的主瓶颈。当前导出数据已经生成:
outputs/test-fast/positive-replay-buffer/student_hint_short_full/replay_train.json
推荐第一个训练分支:
replay_sft_warmup -> oracle officialreplay_sft_warmup -> student_hint_short_opd_decay_effective_samplingreplay_sft_warmup -> student_hint_short_opd_decay_sampling_rollout_replay_effective_filter
不要和新的 prompt/reward 小补丁同时合并,先看 replay 是否能降低 early all-wrong 和后期 zero-signal。
一键 dry-run / smoke:
# 默认只打印三条 smoke 命令和检查命令
bash scripts/test/run_pcd_oracle_new_directions_smoke.sh \
--dry-run \
--run-id pcd_oracle_new_directions_smoke10
# GPU 空闲后顺序跑三条 10-step smoke,并自动检查关键 metric
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
bash scripts/test/run_pcd_oracle_new_directions_smoke.sh \
--run \
--run-id pcd_oracle_new_directions_smoke10
- 若 replay 接入前需要一个低风险训练 baseline,跑
student_hint_short_opd_decay_effective_sampling,它是当前已经实现的最大在线训练改动。 eval_format_reward和late_traj_decay降级为辅助方向:只有 replay / effective sampling 的训练健康改善但 eval 仍被格式污染时再跑。- 若辅助方向 smoke 都健康,再跑组合 variant:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
DYME_PCD_RUN_ID=pcd_oracle_eval_format_late_traj_decay_smoke10 \
DYME_PCD_MAX_STEPS=10 \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_eval_format_late_traj_decay
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
DYME_PCD_RUN_ID=pcd_oracle_eval_format_late_traj_decay_4epoch \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_eval_format_late_traj_decay
Smoke 检查:
python scripts/analysis/check_pcd_variant_smoke.py \
--variant deplot_no_vs_opd_pcd_oracle_hint_eval_format_late_traj_decay \
--log-dir outputs/test-fast/logs/pcd_no_visual_pcd_oracle_eval_format_late_traj_decay_smoke10/deplot_no_vs_opd_pcd_oracle_hint_eval_format_late_traj_decay
- 旧
dynamic_mixed_sampling设想已由student_hint_short_opd_decay_effective_sampling替代;后续优先比较 effective sampling 与 positive replay 的组合,而不是再做一个独立 sampler。
Effective Group Filter: Training-Step 内过滤零信号 group
deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_sampling_rollout_replay_effective_filter
这个 variant 不是再改变 prompt 采样分布,而是在每个已经生成出来的训练 batch 内直接过滤后期零信号 rows:
- 继承
student_hint_shortteacher-SFT repair target; - 继承 OPD/teacher trajectory 后期 decay 与 OPD per-prompt cap;
- 继承 effective sampling、positive replay、rollout replay;
- 从
global_step >= 294开始启用DYME_EFFECTIVE_GROUP_FILTER=1; - all-wrong group 每个 prompt 只保留
1个 repair row,其余 row 的 mask/advantage/OPD/SFT route 清零; - all-correct group 默认过滤,因为组内 advantage 近似零;
- mixed group 完整保留,让 correct completion 的 GRPO 信号和 mixed wrong 的 DyME/OPD 继续存在。
它要验证的问题更大:不是“teacher 能不能给正确轨迹”,而是“后期训练步是否仍被 all-wrong/zero-signal rows 消耗”。如果这个方向有效,预期现象不是 teacher-correct 继续升,而是:
filter/effective_group_filtered_rate在 step 294 后变成非零;filter/effective_group_all_wrong_filtered_rate明显非零;routing/grpo_route_rate不再被 all-wrong rows 稀释;signal/grpo_zero_loss_rate相比student_hint_short后期下降;- final 或 best checkpoint 至少超过
student_hint_short的0.5800,理想上超过 oracle official0.5872。
Dry-run:
DYME_PCD_RUN_ID=pcd_oracle_effective_filter_dryrun \
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--dry-run \
--variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_sampling_rollout_replay_effective_filter
10-step smoke:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \
DYME_PCD_RUN_ID=pcd_oracle_effective_filter_smoke10 \
DYME_PCD_MAX_STEPS=10 \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_sampling_rollout_replay_effective_filter
4epoch:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \
DYME_PCD_RUN_ID=pcd_oracle_effective_filter_4epoch \
bash scripts/test/run_pcd_no_visual_4epoch.sh \
--variant deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_sampling_rollout_replay_effective_filter
RL Transition: Warmup 后切掉 teacher/OPD 依赖
deplot_no_vs_opd_pcd_oracle_hint_student_hint_short_opd_decay_sampling_rollout_replay_effective_filter_rl_transition
这是比 effective_filter 更激进的主实验。它假设 replay warmup 和前期 teacher repair 已经完成冷启动,后半程不再让 all-wrong repair/OPD 继续吞训练预算:
DYME_POSITIVE_REPLAY=0:DyME 阶段默认关闭 online positive replay;静态 replay 只在 Stage 1 warmup 做,避免第二阶段继续引入 CE 前向显存成本和静态 SFT 信号;DYME_EFFECTIVE_GROUP_FILTER_AFTER_STEP=294;DYME_EFFECTIVE_GROUP_FILTER_ALL_WRONG_KEEP=0:step 294 后 all-wrong group 不再保留 repair row;DYME_OPSD_FINAL_WEIGHT=0.0:OPD 在 decay window 后退到 0;- mixed group 仍完整保留,正确 completion 继续走 GRPO,mixed wrong 在 decay window 内仍可走 DyME/OPD。
这条线要验证的是:student_hint_short 已经把 early all-wrong 从 ~0.77 拉到 ~0.55,但后期 GRPO 仍不够主导;如果 replay warmup 能进一步提高 early mixed 比例,那么后期应果断切掉 teacher/SFT 修复,让训练预算集中到 GRPO/mixed rows。
推荐直接用两阶段 runner:
# dry-run
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \
DYME_CHAIN_RUN_ID=pcd_replay_warmup_rl_transition_4epoch \
bash scripts/test/run_replay_warmup_then_pcd_4epoch.sh --dry-run
# 4epoch
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6 \
DYME_CHAIN_RUN_ID=pcd_replay_warmup_rl_transition_4epoch \
DYME_REPLAY_SFT_EPOCHS=0.5 \
bash scripts/test/run_replay_warmup_then_pcd_4epoch.sh
判断标准:
- Stage 1 warmup:positive replay SFT 能正常产出 warmup checkpoint,并作为
DYME_STUDENT_MODEL传入 DyME; - DyME step 294 前:teacher repair 能继续冷启动,但
replay/positive_*应为 0 或 unavailable; - step 294 后:
filter/effective_group_all_wrong_filtered_rate升高,filter/effective_group_kept_all_wrong_rate接近 0; - step 441 后:
loss/opsd_effective_weight接近 0; - last50
routing/grpo_route_rate明显高于student_hint_short的~0.23; - final 或 best checkpoint 高于
0.5800,理想上超过 oracle official0.5872。
不要把三个方向一次性合并。每个方向先跑 10-step、1epoch,再跑 4epoch final + checkpoint sweep。
4epoch 后统一 eval:
# 默认只打印每个 checkpoint 的 eval 命令
bash scripts/test/eval_pcd_oracle_new_directions.sh \
--dry-run \
--run-id pcd_oracle_new_directions_4epoch
# GPU 空闲后评估三条新方向的 checkpoint-147/294/441/588/final_checkpoint
CUDA_VISIBLE_DEVICES=0 \
DYME_EVAL_BATCH_SIZE=1 \
bash scripts/test/eval_pcd_oracle_new_directions.sh \
--run \
--run-id pcd_oracle_new_directions_4epoch
每个 variant 会写入:
eval_chartqa/eval_<checkpoint>_<timestamp>.logeval_chartqa/summary.csv