移除权重同步 full GC 并修复 IPC ACK 竞态
值得精读,尤其是 `verl/workers/rollout/vllm_rollout/bucketed_weight_transfer.py`:它演示了如何用内存快照把“性能优化”还原成“跨进程竞态修复”,以及 CUDA IPC 的 `CudaIPCSentDataLimbo_` + `ipc_collect()` 组合在什么条件下无法回收 block。建议关注三个设计决策:最后一帧 ACK 推迟到 `_cleanup` 之后、`_ack_pending` 守卫如何维持 REP socket 的收发热度、`del weights, tensor` 前置如何顺带覆盖 `_direct_send_large_weight`。需要提醒读者的未闭环项:接收方 `_cleanup` 异常时的发送方永久阻塞(应尽快与 #7366 的 ACK 超时对齐或补 try/except 兜底 ACK),以及 `tests/utils/test_bucketed_weight_transfer.py` 缺失的 ACK 顺序断言——后者是未来重构最容易踩的坑。若团队正在维护 #7780 的 GC 开关,本 PR 之后应考虑废弃或标注为过渡方案。
SGLang rollout 补齐视频特征转发,修复视频 VLM 盲答
值得精读,尤其是维护 rollout/多模态链路的同学:本案是“静默降级类 bug”的教科书样本——TODO 注释无告警、特征算完即丢、两个后端行为不一致,三者叠加后表现为模型输出流畅但完全虚构。建议重点看三处设计决策:(1) 用 `format="processor_output"` 复用 verl 已算好的 processor 输出而不是让 SGLang 重新抽帧,避免 fps 采样不一致这一隐形 desync;(2) 把后端差异收敛到 `LLMServerClient.generate` 的一处分支,并用无条件传参 + `TypeError` 换取“漏改即失败”的可见性;(3) teacher/OPD 路径与 rollout 路径共用同一 payload,避免修复只覆盖一半。阅读时建议同时关注作者未解决的遗留:非 Qwen 视频家族的静默丢弃、多轮 ToolAgentLoop 重复传帧、以及缺失的单测(作者愿意贡献 CPU-only mRoPE 对齐测试,可作为后续 PR 的补位点)。
权重恢复前改用轻量 empty_cache,去掉关键路径 full GC
值得精读,但重点不在代码而在推理链:改动本身只有一行,真正的价值是 Issue #7848 + PR body 中“拆分 empty_cache / GC / retry 各自耗时与释放量”的实验方法,可直接迁移到其他显存清理、profiler、同步点的性能排查。
阅读时建议关注三个设计决策:一是为什么普通 `empty_cache()` 在这个边界上已经足够(进程间 allocator handoff 语义 vs 释放活跃张量);二是为什么 aggressive cleanup 在权重传输后、KV-cache resume 前的那处被保留(本 PR 的边界克制);三是无单测情况下的回归防线如何建立——建议后续为 `update_weights()` 的关键路径加一个轻量守卫(例如断言该边界不再调用 `aggressive_empty_cache`,或把 GPU A/B 数据纳入 nightly 基准),否则同类回退仍可能被静默引入。