执行摘要
本PR修复了Qwen-Image、Qwen-Image-Edit和Z-Image等多个图像扩散模型的准确性偏差问题,通过对齐官方diffusers实现、修正序列并行(SP)处理逻辑,确保单GPU与多GPU输出一致。变更影响扩散管道配置和注意力层,提升了模型生成质量,是扩散模块的重要改进。
功能与动机
动机源于这些模型在特定场景下输出与官方diffusers库不一致,尤其是在使用负提示、CFG(Classifier-Free Guidance)和SP并行时。PR body中明确指出需要"align CFG with official diffusers"、"respect negative-image"和"fix accuracy",目标是消除偏差,提供更可靠的图像生成。具体问题包括Qwen-Image的CFG未匹配官方norm rescale、Qwen-Image-Edit的负提示处理不当、旋转频率精度漂移,以及Z-Image在SP下的tokenization和caption分片错误。
实现拆解
实现按模型和模块拆解,关键代码逻辑如下:
| 模型/模块 |
关键改动 |
代码示例(简要) |
| Qwen-Image |
引入true_cfg_scale,重写postprocess_cfg_noise进行norm匹配 |
noise_pred * (cond_norm / noise_norm) in qwen_image.py |
| Qwen-Image-Edit |
保持旋转频率为fp32,添加SP分片函数_shard_qwen_edit_img_cache_for_sp |
img_cache = shard_rotary_emb_for_sp(...) in qwen_image.py |
| Z-Image |
移除caption token分片,改为复制后缀,修复RoPE偏移 |
num_replicated_suffix参数在zimage.py和layer.py中 |
| 通用层 |
扩展USPAttention支持num_replicated_suffix,优化CFG逻辑 |
_forward_with_replicated_suffix in layer.py |
| 基类 |
添加钩子如get_latent_dtype和gather_noise_pred_for_sp |
在base.py中定义默认实现 |
评论区精华
Review讨论较少,仅有gemini-code-assist[bot]确认修改正确。Issue评论中用户Rockdu提供了关键测试结果:
Rockdu: "Thanks for fixing this SP precision issue, here are some quantized test results on our side for reference ... Worst-case min_cosine vs single_gpu_ref ... Z-Image-Turbo: model_output 0.5039 → 1.0000 ✅ Fixed (exact match)"
这显示修复显著提升了多GPU下的输出一致性,无争议点,团队认可修复效果。
风险与影响
风险分析:
- 回归风险:CFG修改在
qwen_image.py中可能影响其他继承基类的模型,需全面回归测试。
- SP并行风险:
zimage.py中的caption token处理变更在复杂SP场景下可能引入新偏差,需验证多GPU对齐。
- 性能影响:保持fp32旋转频率可能轻微增加内存使用,但确保了精度。
- 兼容性:USPAttention扩展需确保不破坏现有注意力后端。
影响评估:
- 用户影响:直接受益于更准确的图像生成,提升产品可靠性。
- 系统影响:需更新模型配置和测试套件,确保跨环境一致性。
- 团队影响:加强扩散模型维护流程,关注官方对齐和SP优化。
关联脉络
与近期PR的关联揭示扩散模块的持续演进:
- PR #20862(添加FireRed-Image-Edit模型):共享扩散模型配置框架,显示团队在扩展模型支持。
- PR #21122(清理扩散Triton内核):技术领域重叠,聚焦性能优化和代码现代化。
本PR作为准确性修复的关键一环,补全了扩散模型在SP并行下的短板,与这些PR共同推动生态系统成熟。
参与讨论