Prhub

#25021 [Tiny Fix] Disable BCG when inner layer_model unresolved

原始 PR 作者 Oasis-Git 合并时间 2026-05-12 14:51 文件变更 1 提交数 4 评论 2 代码增减 +13 / -6

执行摘要

修复 BCG 在 layer_model 未解析时错误启动

修复 BreakableCUDA Graph 在模型结构不符合预期时(如某些模型没有 language_model.model.layers 层级),错误地捕获外层 model.forward 导致隐式 bs=1 烘焙的问题。PR body 未明确引用 Issue,但 commit 消息和代码注释均指向该动机。

值得合入,修复了一个边缘情况下的隐式问题。建议阅读 breakable_cuda_graph_runner.py__init__can_run 的修改,了解 BCG 的解析逻辑。

讨论亮点

无 review 评论。仅有一个 approved review 来自 ispobock,无额外讨论。

实现拆解

  1. 禁用 BCG 而非 fallback:在 __init__ 中,当 hasattr(language_model, "model") and hasattr(language_model.model, "layers") 不成立时,将 self.layer_model 设为 None,打印 warning 日志后直接 return,跳过后续的 warmup 和 capture。
  2. 添加 early return 拦截:在 can_run 方法开头增加 if self.layer_model is None: return False,确保 BCG 对无法解析 layer_model 的模型始终返回不可运行。
  3. 清理逻辑:移除了旧代码中隐式 fallback 到 language_model 的赋值(else language_model),使行为更清晰。
文件 模块 状态 重要度
python/sglang/srt/model_executor/breakable_cuda_graph_runner.py 模型执行器 modified 6.49

关键源码片段

python/sglang/srt/model_executor/breakable_cuda_graph_runner.py data-contract

核心修改文件。在 __init__ 中为 layer_model 解析失败添加 graceful disable,并在 can_run 中增加 early return。

# 在 __init__ 中,替换原来的无条件赋值逻辑
language_model = getattr(
    model_runner.model, "language_model", model_runner.model
)
if hasattr(language_model, "model") and hasattr(language_model.model, "layers"):
    # 正常情况:找到内层 layer_model
    self.layer_model = language_model.model
else:
    # 无法解析 layer_model 时,禁用 BCG 并返回,避免隐式 bs=1 烘焙
    self.layer_model = None
    logger.warning(
        "[BCG] Could not resolve inner layer_model on %s. BCG is "
        "disabled for this model; prefill will fall back to eager.",
        type(language_model).__name__,
    )
    return

# 在 can_run 中,增加对 None 的检查
def can_run(self, forward_batch: "ForwardBatch"):
    if self.layer_model is None:
        return False # BCG 不可用,走 eager 路径
    if forward_batch.forward_mode.is_target_verify():
        return False
    # ... 其他条件保持不变 ...

评论区精华

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

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

风险与影响

低风险。改动仅作用于无法解析 layer_model 的边缘情况,且 fallback 行为从“捕获外层模型”变为“禁用 BCG”,回退到 eager 模式,不会引入正确性或性能退化。需注意 logger.warning 可能会在启动时产生额外日志输出。

影响范围极小。仅影响模型结构不符合 language_model.model.layers 层级约定的那些模型,这些模型在旧代码中也会因 bs=1 烘焙而表现异常,本 PR 反而修复了它们。

边缘情况修复 无测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论