Prhub

#2153 bugfix

原始 PR 作者 zhuzilin 合并时间 2026-06-30 18:29 文件变更 1 提交数 5 评论 0 代码增减 +4 / -3

执行摘要

将 with_entropy_grad 判断下移到 get_log_probs_and_entropy

修复 get_log_probs_and_entropy 在外部调用(如 policy_loss_function 内部调用时已显式传入 with_entropy_grad)与实际场景之间的不一致:之前 with_entropy_grad 仅在 policy_loss_function 的调用处硬编码传入,导致直接调用 get_log_probs_and_entropy 的其他路径(如测试或实验代码)无法利用此优化,可能额外计算 entropy 梯度。

该 PR 为简单的清理性 bugfix,不需重点精读,但体现了代码复用和职责分离的良好实践。

讨论亮点

该 PR 无 review 讨论或评论,变更简单明确,未出现争议。

实现拆解

  1. get_log_probs_and_entropy 函数内部新增 with_entropy_grad 局部变量,其值根据参数 with_entropy 和配置项 args.entropy_coef 动态计算(with_entropy and getattr(args, "entropy_coef", 0.0) != 0)。
  2. with_entropy_grad 传递给内部调用的 calculate_log_probs_and_entropy
  3. 移除 policy_loss_function 中先前硬编码的 with_entropy_grad=args.entropy_coef != 0 参数,因为该逻辑已下沉到 get_log_probs_and_entropy 中。
    该改动提升了代码复用性和调用安全性,确保所有对 get_log_probs_and_entropy 的调用都能自动获得正确的梯度控制。
文件 模块 状态 重要度
slime/backends/megatron_utils/loss.py 损失计算 modified 4.83

关键符号

get_log_probs_and_entropy policy_loss_function

关键源码片段

slime/backends/megatron_utils/loss.py core-logic

核心损失函数文件,集中了 logprob/entropy 计算和 PPO 损失逻辑;本 PR 在此文件移动了 with_entropy_grad 判定逻辑。

# slime/backends/megatron_utils/loss.pydef get_log_probs_and_entropy(logits, args, unconcat_tokens, total_lengths, response_lengths,
                              with_entropy=False, non_loss_data=True, top_p_token_ids=None,
                              top_p_token_offsets=None):
    ...
    tp_group = mpu.get_tensor_model_parallel_group()
    chunk_size = args.log_probs_chunk_size
​
    # 新增强制且统一的判定逻辑:只在 entropy_coef 非零时保留 entropy 梯度
    with_entropy_grad = with_entropy and getattr(args, "entropy_coef", 0.0) != 0
​
    full_tokens = _build_shifted_tokens(...)
    ...
    log_prob_full, entropy_full = calculate_log_probs_and_entropy(
        logits,
        full_tokens,
        tp_group,
        with_entropy=with_entropy,
        with_entropy_grad=with_entropy_grad, # 使用新计算的值
        chunk_size=chunk_size,
        log_prob_keep_mask=top_p_keep_mask,
    )
    ...def policy_loss_function(args, batch, logits, sum_of_sample_mean):
    ...
    _, log_probs_and_entropy = get_log_probs_and_entropy(
        logits,
        args=args,
        unconcat_tokens=batch["unconcat_tokens"],
        total_lengths=total_lengths,
        response_lengths=response_lengths,
        with_entropy=True,
        # 删除了之前的 with_entropy_grad 参数,现在由内部自动计算
    )
    ...

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险极低。改动仅在 get_log_probs_and_entropy 内部添加了一行变量赋值,并移除了调用处的重复参数,语义等价。但需注意:若外部代码之前依赖 with_entropy_grad 参数被传入,此变更后该参数不再在调用处显式出现,但效果相同。建议检查其他调用点是否受影响(本 PR 未发现其他调用点)。

影响范围小,仅限 PPO 训练中 entropy 梯度计算的优化逻辑,可小幅减少因冗余梯度计算导致的内存占用和计算开销。用户无感知,训练结果一致。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论