Skip to content

[No.36][WIP] ReLax 复现 MemAgent 多轮记忆 GRPO:当前进展与待验证项 #236

Description

@TabsPhasers

概要

我正在推进 No.36:在 ReLax 中复现 MemAgent 的多轮记忆训练流程。目前本地已完成 GPU 验证前的实现、CPU 单测和 mock 集成验证。本 Issue 用于同步当前设计、实现过程中发现的框架接线问题、已有证据,以及仍待完成的 GPU 和效果验收。

关联的早期方案讨论:#196。本 Issue 以当前实际实现和已冻结的复现口径为准。

当前冻结的参考版本如下:

论文中的 Qwen2.5-7B/14B 指标仅作为 sanity reference。本任务的直接工程对照是固定版本的 VIME Qwen3-4B 配方,因为 VIME 没有公开该 example 的训练后 Qwen3-4B checkpoint 或完整指标表。

已实现的行为

当前 patch 主要新增 examples/mem_agent/,实现了以下完整链路:

  1. 将冻结版本的 HotpotQA 文件转换为包含 question/context/ground_truth 的 JSONL,并记录源文件和转换结果的 SHA-256;
  2. 按 token 将长文档连续切成 2048-token chunks;
  3. 每个 chunk 独立调用一次 SGLang,请求只包含 question + previous memory + current chunk
  4. 每轮用本轮输出覆盖 memory,并重新 tokenize、硬截断到 1024 tokens;
  5. 最后一轮只基于 question + final memory 生成答案;
  6. 从最终 \boxed{} 答案计算一次 HotpotQA normalized exact-match reward;
  7. 保存所有 memory-update turn 和 final-answer turn,并严格对齐 tokensresponse_lengthloss_maskrollout_log_probs
  8. 先在 trajectory/GRPO group 维度完成 reward normalization,再无损展开所有 turns,不裁掉尾部样本;
  9. 默认采用与固定 VIME 代码一致的 split credit,同时保留并测试论文语义对应的 share 选项;
  10. 用一条 pipeline 串联数据准备、训练、逐 step reward 汇总、final checkpoint 转换和评测。

冻结配方使用 2048-token chunk、1024-token memory、256-token final answer、最多 64 chunks、GRPO group size 8、LR 1e-6 和 KL coefficient 0.001

实现中发现的框架接线问题

现有 custom sample-converter 参数虽然会被 RolloutManager 加载,但 transfer 和 debug-replay 路径仍直接调用内置 converter。另外,一条 trajectory 会展开为数量不固定的 turn rows,而原 TransferQueue 容量、grouping 和 Actor 消费数量都按 trajectory 数量计算。

因此,除了 examples/mem_agent/,当前本地 patch 还包含以下受配置开关保护的小范围框架调整:

  • transfer 和 debug replay 实际调用配置的 custom converter;
  • 允许声明 TransferQueue storage capacity 使用的最大展开倍数;
  • 对已经完成 GRPO normalization 的展开 rows 使用 group size 1;
  • 由 producer 报告实际转换并写入的 row count;
  • rollout_id 协调 row count,并在生成/转换失败时唤醒等待方,避免 Actor hang;
  • Actor 精确消费本轮已写入 rows,并校验其可被 DP size 整除;
  • 未启用 expanded-batch 配置时,保留原有 converter、sampler、capacity 和 fixed-batch 行为。

这些调整涉及 Controller、TransferQueue 和 Actor 接线,但只在 MemAgent custom config 显式开启后生效;没有修改 SGLang core、Service lifecycle、Launcher、公开 Sample 字段或 checkpoint 格式。

评测与复现口径

评测脚本让冻结 base、VIME checkpoint 和 ReLax checkpoint 共用同一套 recurrent inference 代码。每次评测会保留逐样本 JSONL,并在 summary 中记录 data SHA-256、evaluator schema、tokenizer、采样参数、chunk/memory 上限、样本数和请求错误数。

当前建议的效果验收口径为:

  • VIME 固定配方与 ReLax 配方使用相同模型、数据、seed、采样配置和硬件,各独立训练一次;
  • 每个待比较 checkpoint 在预先选定的 RULER-HQA 长度上至少完成一次评测,默认长度为 50/200/800 documents;
  • RULER-HQA 主指标使用 sub_EM
  • 每个选定长度都满足 abs(sub_EM_ReLax - sub_EM_VIME) <= 3 个百分点;
  • ReLax 在每个选定 RULER-HQA 长度上都优于冻结 recurrent base,并在 HotpotQA boxed exact match 上优于 base;
  • 保留并报告全部逐样本结果;评测不完整或存在请求错误时,不允许用于宣称验收通过。

固定 VIME 官方入口的有效上限是 64 chunks:run-eval.sh 会 source _common.sh,从而覆盖 Python evaluator 单独运行时的 fallback。ReLax 显式固定 64。最终报告必须披露超过 64 chunks 的截断情况,不能把发生截断的 800-document 评测描述成读取了完整上下文。

已完成的验证

当前本地证据如下:

  • MemAgent/custom-converter/expanded-row 目标测试:45 passed
  • 相邻默认路径回归:14 passed, 4 skipped
  • Ray utility 子集:3 passed, 33 skipped,平台相关用例在当前 CPU 环境按既有条件跳过;
  • 所有 MemAgent shell 脚本通过 bash -n
  • git diff --check 通过;
  • 全仓 pre-commit run --all-files --show-diff-on-failure 通过;
  • 独立贡献 worktree clean,当前有 5 个本地 commit,尚未 push。

测试已覆盖 chunk 边界、memory 覆盖和硬上限、final prompt 隔离、多答案 boxed EM、每 turn 字段对齐、先归一化后展开、split/share credit、producer/consumer 精确 row-count 契约、异常唤醒、debug replay、冻结 prompt variant、评测控制变量校验和逐 step reward 完整汇总。

尚未完成的验收

CPU 和 mock 测试不能代替真实分布式 GPU 链路。以下项目尚未执行,也不声明已经通过:

  • 连续 2 个真实 Ray/SGLang/Megatron GRPO step 无 error、OOM 或 hang;
  • 在真实链路中核对 generated/transferred/Actor-consumed turn count 完全一致;
  • final checkpoint 保存及 Hugging Face 转换;
  • 通过真实推理 endpoint 完成 recurrent HotpotQA/RULER-HQA 评测;
  • 100-step reward 趋势有明显提升;
  • VIME/ReLax 成对训练与 3 个百分点 sub_EM 对比。

下一执行 gate 是 2-step GPU smoke。Qwen3-0.6B 单卡实验可以作为低成本控制流诊断,但不会替代冻结的 Qwen3-4B,也不能作为正式效果验收结果。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions