
SGLang 扩散模型 ComfyUI 集成管道测试指南DiffGenerator 与噪声预测验证实战【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang本篇文章聚焦于 SGLang 项目中 ComfyUI_SGLDiffusion 插件 的管道测试体系。它通过comfyui_modeTrue让 SGLang 的扩散模型运行时DiffGenerator直接接收 ComfyUI 风格的前处理输入latents、timesteps、embeddings并验证noise_pred能否从OutputBatch中正确取回。读完本文你将掌握该测试目录的完整运行方式、四个管道测试的输入构造细节、环境变量配置以及从SamplingParams到Req、再到调度器执行与输出校验的底层调用链。测试目录概览每个 ComfyUI 管道一个测试文件test/目录为 ComfyUI_SGLDiffusion 插件的每种管道集成各提供一个测试文件整体结构如下测试文件被测管道类适用模型 / 模式test_zimage_pipeline.pyComfyUIZImagePipelineZ-Image如Z-Image-Turbotest_flux_pipeline.pyComfyUIFluxPipelineFLUX如FLUX.1-devtest_qwen_image_pipeline.pyComfyUIQwenImagePipelineQwen-Image文生图test_qwen_image_edit_pipeline.pyComfyUIQwenImageEditPipelineQwen-Image-EditI2I / 编辑模式此外目录中还有 test_h3_request.py它不执行扩散推理而是针对 MiniMax-H3 视频生成节点的请求负载结构做契约测试详见后文。这些测试对应插件 README 中列出的受支持模型Z-Image高速图像生成、FLUX文生图、Qwen-Image多模态图像生成图像编辑当前为实验性支持、MiniMax-H3联合视频与音频生成仅服务器模式。管道类名与执行器之间的映射关系可以在 core/generator.py 的pipeline_class_dict与executor_class_dict中看到。运行测试从单文件到全量测试使用标准的pytest运行执行命令如下。运行全部测试pytest python/sglang/multimodal_gen/apps/ComfyUI_SGLDiffusion/test/ -v -s-v输出每个用例的详细结果-s允许打印测试中会用print输出noise_pred的形状、dtype 与设备信息。运行单个测试文件pytest python/sglang/multimodal_gen/apps/ComfyUI_SGLDiffusion/test/test_zimage_pipeline.py -v -s四个管道测试均以if __name__ __main__:结尾因此也可以直接以脚本方式执行单个文件例如python python/sglang/multimodal_gen/apps/ComfyUI_SGLDiffusion/test/test_zimage_pipeline.py。运行前置条件从测试代码看运行前需要满足以下条件已安装sglang[diffusion]否则 core/generator.py 与各 executor 中的try/except ImportError会打印缺少sglang.multimodal_gen的提示有可用的 CUDA GPU所有 dummy 张量都显式指定了devicecuda且断言noise_pred.device.type cuda可以联网下载 HuggingFace 模型或预先通过环境变量指向本地模型文件。环境变量模型路径的两种格式测试通过环境变量配置模型路径支持两种格式Safetensors 单文件指向一个.safetensors权重文件的路径例如/path/to/model.safetensors对应 ComfyUI 插件中“从 checkpoint 文件加载 UNET”的使用方式Diffusers 目录格式HuggingFace 模型 ID 或本地 diffusers 目录例如Tongyi-MAI/Z-Image-Turbo。四个环境变量及其默认值环境变量对应模型默认值SGLANG_TEST_ZIMAGE_MODEL_PATHZ-ImageTongyi-MAI/Z-Image-TurboSGLANG_TEST_FLUX_MODEL_PATHFLUXblack-forest-labs/FLUX.1-devSGLANG_TEST_QWEN_IMAGE_MODEL_PATHQwen-ImageQwen/Qwen-ImageSGLANG_TEST_QWEN_IMAGE_EDIT_MODEL_PATHQwen-Image-EditQwen/Qwen-Image-Edit-2511在测试代码中环境变量通过os.environ.get(SGLANG_TEST_XXX_MODEL_PATH, 默认值)读取例如 test_zimage_pipeline.py。使用示例# 使用 HuggingFace 模型 IDdiffusers 格式 export SGLANG_TEST_ZIMAGE_MODEL_PATHTongyi-MAI/Z-Image-Turbo pytest python/sglang/multimodal_gen/apps/ComfyUI_SGLDiffusion/test/test_zimage_pipeline.py -v -s # 使用 safetensors 单文件 export SGLANG_TEST_ZIMAGE_MODEL_PATH/path/to/z_image_turbo_bf16.safetensors pytest python/sglang/multimodal_gen/apps/ComfyUI_SGLDiffusion/test/test_zimage_pipeline.py -v -s测试结构六步走通「透传调度器」全链路README 中给出了每个测试文件共用的六步结构。结合源码可以逐一对号入座Setup初始化生成器调用DiffGenerator.from_pretrained()创建生成器传入pipeline_class_name如ComfyUIZImagePipeline、num_gpus、sp_degree等参数并显式打开comfyui_modeTrue。这是所有管道测试的关键开关用于启用 ComfyUI 特有的行为——输入不再是原始 prompt 文本而是由 ComfyUI 前端CLIP、VAE 等节点预处理好的一整套张量。Input Preparation构造输入用torch.ones创建 dummy 的 latents、timesteps 与 embeddings 张量全部使用bfloat16、放在 CUDA 上。不同管道输入形状差异明显详见下一节。Request Preparation构造请求用SamplingParams.from_user_sampling_params_args()构建采样参数prompt、guidance_scale、height/width、num_inference_steps、seed 等再经prepare_request()转换为调度器可执行的Req对象。ComfyUI Inputs注入 ComfyUI 输入直接把 ComfyUI 风格的输入写到Req上如req.latents、req.timesteps、req.prompt_embeds必须是List[Tensor]、req.negative_prompt_embeds、req.raw_latent_shape等随后根据guidance_scale 1.0且存在负向 embedding 的条件设置req.do_classifier_free_guidance并根据req.seed构造torch.Generator列表。Execution执行推理调用generator._send_to_scheduler_and_wait_for_response([req])将请求送入调度器并同步等待响应得到OutputBatch。Validation校验输出断言output_batch.noise_pred不为None、是torch.Tensor、位于 CUDA、dtype 为bfloat16并打印其 shape/dtype/device同时从output_batch.output回退到req.latents校验 latents 存在。这套流程本质上是把插件的 executor 内部逻辑「原样搬进测试」——对比 executors/zimage.py 的forward可以看到完全一致的模式构造SamplingParams→prepare_request→ 填充req.latents/timesteps/prompt_embeds/raw_latent_shape→ 送入调度器 → 取output_batch.noise_pred返回给 ComfyUI 的 KSampler 继续去噪循环。四个管道测试的输入差异形状即模型结构虽然四个测试骨架相同但每个管道的输入张量形状直接反映了其模型的 latent 布局与条件编码方式值得逐一拆解。Z-Image五维 latent 单一 context在 test_zimage_pipeline.py 中latents 形状为(1, 16, 1, 90, 160)batch_size1、num_channels16、num_frames1其中 720×1280 像素经 VAE 8 倍下采样得到 90×160 的 latent 尺寸height // 8、width // 8timesteps torch.tensor([1000])contextprompt embeddings形状为(19, 2560)序列长度 19、特征维 2560采样参数guidance_scale1.0无需 CFG对应do_classifier_free_guidanceFalse、num_inference_steps1、seed42、save_outputFalse。对比 executor 中的实现zimage.py 会将 ComfyUI 传入的x四维unsqueeze(2)扩展出帧维度并把context.squeeze(0)后包装成req.prompt_embeds列表timesteps还要乘以 1000 归一化。FLUX双流条件encoder_hidden_states pooled_projectionstest_flux_pipeline.py 使用num_gpus2对应插件 README 中 FLUX 工作流的 Sequence Parallelism 多卡场景输入包括hidden_states(1, 3600, 64)即 latent 展开后的序列1280×720 下采样后展平encoder_hidden_states(1, 512, 4096)T5 文本编码器输出pooled_projections(1, 768)CLIP-L pooled 输出req.prompt_embeds [pooled_projections, encoder_hidden_states]——注意 FLUX 的条件是两个张量的列表顺序为 pooled 在前req.pooled_embeds [pooled_projections]、req.neg_pooled_embeds []若启用 CFG负向条件为(1, 77, 768)的 dummy CLIP embedding 加(1, 512, 4096)的负向 encoder hidden states。FLUX 测试还设置了save_outputTrue与return_trajectory_latentsTrue用于保留输出与去噪轨迹。Qwen-Image单一 encoder_hidden_states 条件test_qwen_image_pipeline.py 使用num_gpus2且显式关闭dit_layerwise_offloadhidden_states(1, 6889, 64)1328×1328 像素的 latent 展平序列即 166×166encoder_hidden_states(1, 45, 3584)文本条件序列长度仅 45req.prompt_embeds [encoder_hidden_states]单元素列表guidance_scale3.0并直接复用同一个 encoder hidden states 张量作为negative_prompt_embeds来开启 CFG。Qwen-Image-Edit双 latent噪声图像 条件图像test_qwen_image_edit_pipeline.py 是 I2I/编辑模式输入最复杂noisy_image_latentsreq.latents(1, 3600, 64)待去噪的目标图像 latentcondition_image_latentsreq.image_latent(1, 6889, 64)作为编辑条件的参考图像 latent1328×1328 下采样后展平req.vae_image_sizes [(166, 166)]condition_width_latent与condition_height_latent1328 ÷ 8使用num_gpus1guidance_scale1.0关闭 CFG。测试设计要点为什么用 dummy 张量、为什么校验 noise_predREADME 的 Notes 部分点明了测试设计的四个关键决策结合源码可进一步理解其目的comfyui_modeTrue是分水岭它让 DiffGenerator 走 ComfyUI 专用路径输入不再是文本 prompt 而是完整的预处理张量。在插件的 core/generator.py 中init_generator也会强制设置kwargs[comfyui_mode] True测试与插件生产路径保持一致。输入是「预处理的」latents、timesteps、embeddings 本应由 ComfyUI 的 VAE、CLIP 等节点产生测试直接注入等价张量从而把关注点锁定在「SGLang 调度器对这批输入的响应是否正确」这一层。校验的核心是noise_prednoise_pred噪声预测是扩散模型单步去噪的核心输出ComfyUI 的 KSampler 拿到它才能完成一步采样。所有测试的最终断言都验证它存在、是 CUDA 上的bfloat16张量这正是「透传调度器」集成成功的标志。dummy/ones 张量的取舍测试使用全 1 张量保持简单可复现真实场景中这些位置是模型实际输出因此这类测试验证的是「管道与数据通路」而非「生成图像质量」。补充MiniMax-H3 请求契约测试除四个管道测试外test_h3_request.py 是另一种风格的测试它只 mock HTTP 层用types.ModuleType构造folder_paths、comfy_api、comfy等模块桩在不安装 ComfyUI、不需要 GPU 的前提下加载真实的nodes.py与core/server_api.py驱动SGLDiffusionGenerateH3节点捕获 POST 请求负载并验证t2va文生视频音频任务发送target{short_edge: 768, aspect_ratio: 16:9, duration_seconds: 5.0}、flow_shift12.0、audio_flow_shift3.0fl2va任务把首帧/尾帧 keyframe 映射为frame_index0 与 -1ref2va任务保持图片/视频/音频条件的模态顺序任务类型与条件必须自洽如fl2va缺少关键帧会抛ValueError最终负载还能通过VideoGenerationsRequest见 openai/protocol.py的 schema 校验确保字段名与类型和服务器端解析完全一致。该测试还验证了extra_fields机制——模型自定义字段优先于通用默认值印证了插件 README 中「请求 schema 接受未知键core/server_api.py无需按模型改动」的设计。结语ComfyUI_SGLDiffusion 的测试目录以「每个管道一个测试文件」的方式为 Z-Image、FLUX、Qwen-Image、Qwen-Image-Edit 四条扩散路径提供了统一的回归保障通过comfyui_modeTrue 预处理张量 noise_pred输出校验把「SGLang 调度器能否正确响应 ComfyUI 风格请求」这一核心契约固定下来MiniMax-H3 的契约测试则把验证范围扩展到 HTTP 负载与服务器 schema 的一致性。这套测试既可用于插件开发时的快速自检也是理解 SGLang 扩散运行时与外部前端如何协作的最佳入口。【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考