Prhub

#6935 [fsdp] fix: FSDP logits temperature scaling for view tensors

原始 PR 作者 zjchenn 合并时间 2026-07-06 17:51 文件变更 1 提交数 1 评论 2 代码增减 +8 / -2

执行摘要

修复 FSDP logits 温度缩放 in-place 操作崩溃

PR body 指出,output.logits.squeeze(0) 返回的可能是一个视图(view),对于通过自定义 autograd 函数产生 logits 的模型,div_() 操作会因干扰反向传播而被 PyTorch 拒绝。

值得跟随阅读,了解 FSDP 引擎中温度缩放的实现细节以及 in-place 操作对视图张量的潜在问题。PR 提交者可以关注是否为类似场景添加测试覆盖。

讨论亮点

Reviewer wuxibin89 指出还需要修改 BSHD 分支,作者 zjchenn 确认后增加对应修改。

实现拆解

  1. rmpad 分支(移除填充路径):在 verl/workers/engine/fsdp/transformer_impl.py 约第 1138-1142 行,将 logits_rmpad.div_(...) 替换为 logits_rmpad = logits_rmpad / ...,并在除法前检查 logits_rmpad 是否为 DTensor,若是则调用 full_tensor() 收集完整张量。
  2. BSHD 分支(批处理序列路径):在约第 1249-1252 行,对 logits 张量也执行相同的 DTensor 检查和 out-of-place 除法。
  3. 两处修改均参考了 torchtitan 和 automodel 的实现模式,确保与 TP(张量并行)场景兼容。
文件 模块 状态 重要度
verl/workers/engine/fsdp/transformer_impl.py 引擎 modified 6.12

关键符号

prepare_model_outputs

关键源码片段

verl/workers/engine/fsdp/transformer_impl.py core-logic

核心变更文件,修改了 prepare_model_outputs 方法中两处温度缩放逻辑

# verl/workers/engine/fsdp/transformer_impl.py ( 关键变更片段 )# 在 rmpad 分支中(约第 1138-1142 行):
else:
    logits_rmpad = output.logits.squeeze(0) # (total_nnz, vocab_size)
    # With TP, logits are DTensors sharded on vocab dim; gather for log_softmax.
    if isinstance(logits_rmpad, DTensor):
        logits_rmpad = logits_rmpad.full_tensor() # 收集完整 logits
    logits_rmpad = logits_rmpad / temperature_rmpad.clamp(min=1e-8).unsqueeze(-1).to(logits_rmpad.dtype) # out-of-place# 在 BSHD 分支中(约第 1249-1252 行):
logits = output.logits # (bsz, response_length, vocab_size)
temperature = output_args["temperature"] # (bsz,)
temperature = temperature.unsqueeze(-1).unsqueeze(-1)
# With TP, logits are DTensors sharded on vocab dim; gather for log_softmax.
if isinstance(logits, DTensor):
    logits = logits.full_tensor() # 收集完整 logits
logits = logits / temperature.clamp(min=1e-8).to(logits.dtype) # out-of-place

评论区精华

BSHD 分支也需要同步修改 正确性

wuxibin89 指出 BSHD 分支(第 1249 行)也需要进行相同的 DTensor 检查和 out-of-place 修改。

结论:作者 zjchenn 接受建议并补充了 BSHD 分支的修改。 · 已解决

风险与影响

低风险。改动仅在 FSDP 引擎的 eager logits 温度缩放路径中,将 in-place 操作改为 out-of-place,语义等价。新增的 DTensor 处理仅在启用 TP 时触发。未修改测试,但改动量小,逻辑清晰。

影响范围局限于 FSDP 引擎中启用了 remove padding 且不使用 fused kernel 的场景,仅对使用 TP 且具有自定义 autograd 的模型有实质性影响。

核心路径变更 缺少测试覆盖

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论