快速结论:在 Modular Pipeline 中使用 InputParam 时,如果某个输入既设置了 required=True,又通过模板或默认值携带了非 None 的 default,那么这个必填约束会被静默忽略:默认值会在检查必填之前先被填入。遇到本报错时,优先检查 InputParam.template(..., required=True) 是否意外继承了模板中的默认值。
适用环境:Issue 中已确认的环境是 huggingface/diffusers 的 main 分支代码,涉及 modular_pipelines 模块以及 modular_pipeline_utils 中的 InputParam。Issue 未提供 Python、CUDA、PyTorch、显卡型号或操作系统版本等环境信息,因此这里不作推断。
最快修复方案:可优先尝试在需要强制必填的调用处显式写出 default=None,即 InputParam.template("xxx", required=True, default=None)。Issue 中提到 hunyuan_video1_5/denoise.py 就是通过这种方式规避问题的。
注意事项:default=None 只能绕过模板自带的默认值,让 required=True 重新生效,属于调用侧的规避做法;它没有改变框架内部先应用默认值、后检查 required 的执行顺序。对于 API 层面的根本修复,Issue 讨论链中仅提到由贡献者提交 PR,但未在讨论摘要中给出已验证的合并结果,因此需以对应版本的实际行为为准。
问题场景
用户在使用 Diffusers 的 Modular Pipeline 构建或调用管道时触发该问题。典型场景是某个 block 通过 InputParam.template() 声明输入参数,并传入 required=True,希望该输入缺失时直接抛错;但由于模板本身带有非 None 的 default(例如 num_inference_steps 默认 50),调用时省略该参数并不会报错,而是静默使用默认值继续运行。
Issue 给出的最小复现:
from diffusers.modular_pipelines.modular_pipeline_utils import InputParam
param = InputParam.template("num_inference_steps", required=True)
print(param.required, param.default) # True 50
端到端表现为:传入 num_inference_steps=2 时得到 1 个 timestep,省略该输入时却按 50 运行,得到 49 个 timesteps,而不是抛出缺失必填输入的异常。
报错原文
Modular: `required=True` is silently ignored when an `InputParam` carries a default
Required input '{input_param.name}' is missing
注意:该问题是“静默忽略”,即预期抛出 Required input ... is missing 的场景并没有抛错,而是直接使用了默认值。
原因分析
最可能的原因是默认值在 required 检查之前被应用,具体有两处:
ModularPipeline.__call__在任何 block 执行前,会把所有未传入输入的 pipeline 级默认值写入 state;对于顺序管道,这通常来自第一个声明该输入的 block 的默认值,因此后续 sub-block 永远看不到缺失值。get_block_state先从 state 读取值,若为None则替换为该 block 自己声明的default,之后才检查required。代码逻辑如下:
value = state.get(input_param.name)
if value is None:
...
value = input_param.default
if input_param.required and value is None:
raise ValueError(f"Required input '{input_param.name}' is missing")
由于默认值已经填入,value is None 不再成立,required 检查因此失效。
另一个常见触发路径是 InputParam.template:模板会先提供 default,调用方的覆盖参数只替换显式指定的键。例如:
template_kwargs = INPUT_PARAM_TEMPLATES[template_name].copy() # {"type_hint": int, "default": 50, ...}
template_kwargs.update(overrides) # {"required": True}
return cls(name=name, **template_kwargs)
因此 InputParam.template("num_inference_steps", required=True) 表面上是在声明“必须提供”,实际却得到一个默认 50 的参数。Issue 统计出 main 分支上有 14 处调用点存在该问题,分布在 cosmos、krea2、ltx、qwenimage 四个管道中,涉及 num_inference_steps、batch_size、dtype 等参数。
环境排查
- 确认使用的 diffusers 版本或提交是否包含该问题;Issue 基于
main分支(提交784ae091a80d568f089842d766cac34637eef86e)定位。 - 确认是否通过
InputParam.template(...)声明参数,并检查该模板是否自带default。 - 检查调用处是否已显式传入
default=None;若没有,required=True可能不生效。 - 对比对应 block 文件是否在 Issue 列出的 14 处已知调用点中。
- Issue 未提供 Python、PyTorch、CUDA、显卡等版本要求,建议记录本地环境以便复现或向维护者反馈。
解决步骤
- 定位触发问题的
InputParam声明,例如InputParam.template("num_inference_steps", required=True)。 - 确认对应模板是否携带非
None的默认值;可通过打印param.required与param.default验证,如复现代码所示输出True 50即命中该问题。 - 可优先尝试在声明处补充
default=None:InputParam.template("num_inference_steps", required=True, default=None),使必填检查能够生效。 - 如果属于 Issue 中列出的 cosmos、krea2、ltx、qwenimage 等调用点,建议等待或跟进上游修复 PR,而不是逐处手工绕过,以免遗漏。
- 若自行修改框架代码,需要调整检查顺序:先判断
required且原始值缺失,再应用默认值;否则会破坏required的语义。该方向属于推断性的修复思路,Issue 讨论摘要未展示合并后的具体实现。
验证方法
使用最小复现脚本验证:若修复生效,InputParam.template("num_inference_steps", required=True) 不应再在未显式提供值的情况下静默使用 50;省略必填输入时应抛出 Required input ... is missing(或对应版本中约定的等价报错),而显式传入 num_inference_steps=2 时仍能正常执行。对端到端场景,可对比“传入 2 步”与“省略该输入”的行为差异是否已符合预期。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


