拓冰建站拓冰建站
首页 / 资讯中心 / 正文

将 Modular Diffusers 自定义 Block 接入 Mellon 可视化节点工作流:mellon_pipeline_config.json 生成与调优完整指南

将 Modular Diffusers 自定义 Block 接入 Mellon 可视化节点工作流mellon_pipeline_config.json 生成与调优完整指南【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers本文以 Diffusers 仓库中 Modular Diffusers 与 Mellon 的官方集成文档为主体系统讲解如何让自研的自定义 BlockCustom Block在 Mellon 这一节点化可视化工作流界面中开箱即用从为参数指定 Mellon 类型、自动生成mellon_pipeline_config.json、推送到 Hub到逐字段解读与手动调优配置的完整闭环。读完本文你将能够把自己开发的 Modular Diffusers Block 一键发布为 Mellon 中的可视化节点并理解mellon_node_utils底层实现与测试验证方式。背景Mellon 与 Modular Diffusers 的集成Mellon 是一个可视化工作流界面它与 Modular Diffusers 深度集成专门面向节点化node-based工作流设计。在 Mellon 中你可以通过拖拽、连线noodles的方式把文本编码、去噪、VAE 解码等模块拼装成一条完整的生成管线而无需编写胶水代码。[!WARNING] Mellon 仍处于早期开发阶段尚不适合用于生产环境。官方将当前集成定位为一窥集成方式的预览其 API 可能在未来版本中发生变化。从源码注释mellon_node_utils.py中也可以看到同样的提醒Mellon 集成仍处于积极开发中API 可能变更。好消息是自定义 Block 在 Mellon 中开箱即用——你只需要在自定义 Block 的仓库中添加一个mellon_pipeline_config.json配置文件。这个配置文件告诉 Mellon 如何把你的 Block 的参数渲染成对应的 UI 组件文本框、下拉菜单、滑块、图片接口等。官方以 Gemini Prompt Expander 这个 Block 作为演示样例仓库 IDdiffusers/gemini-prompt-expander-mellon。在 Mellon 中使用自定义 Block四步上手要在 Mellon 中加载并使用一个 Modular Diffusers 自定义 Block操作非常直观从ModularDiffusers分区拖拽一个Dynamic Block Node动态块节点到画布上在节点中填写repo_id例如diffusers/gemini-prompt-expander-mellon点击Load Custom Block加载自定义块节点会自动变形展示出你 Block 的输入inputs与输出outputs接口即可像普通节点一样连线使用。整个交互流程对应官方文档中的动图演示GIF 托管于 HuggingFace 文档资源库。需要说明的是只要你的仓库中存在mellon_pipeline_config.json这个动态加载过程就会正常工作——这也是本文后续要讲解的核心。为自定义 Block 创建 Mellon 配置总体三步要为自定义 Block 生成 Mellon 配置官方给出了一个清晰的流程为参数指定 Mellon 类型——每个InputParam/OutputParam都需要一个类型告诉 Mellon 该渲染成什么 UI 组件例如textbox、dropdown、image生成mellon_pipeline_config.json——使用官方提供的工具类生成配置模板并将其推送到你的 Hub 仓库可选手动调整配置——根据实际需求微调生成出来的配置。下面逐一展开。为参数指定 Mellon 类型Mellon 类型决定了每个参数在 UI 中的渲染方式。如果你没有为参数指定类型它会默认为custom在 UI 中渲染为一个简单的连接圆点connection dot——只能用于节点间的连线不能作为可编辑的表单控件。当然你随时可以在生成的配置中手动调整。内置的 Mellon 类型对照表官方文档给出的类型清单如下类型输入/输出说明image两者皆可图像PIL Imagevideo两者皆可视频text两者皆可文本展示textbox输入文本输入框dropdown输入下拉选择菜单slider输入数值滑块number输入数值输入checkbox输入布尔开关其中image、video、text同时支持输入与输出两种角色textbox、dropdown、slider、number、checkbox仅用于输入侧。为需要更多配置的参数使用 MellonParam对于需要更多配置的参数例如带选项的下拉菜单、带 min/max 的滑块不能只传字符串而要直接传入一个MellonParam实例。你可以使用下面表格中的类方法工厂也可以用MellonParam(name, label, type, ...)完全自定义一个参数定义。方法说明MellonParam.Input.image(name)图像输入MellonParam.Input.textbox(name, default)文本输入textareaMellonParam.Input.dropdown(name, options, default)下拉选择MellonParam.Input.slider(name, default, min, max, step)数值滑块MellonParam.Input.number(name, default, min, max, step)数值输入无滑块MellonParam.Input.seed(name, default)带随机化按钮的种子输入MellonParam.Input.checkbox(name, default)布尔复选框MellonParam.Input.model(name)Diffusers 组件的模型输入MellonParam.Output.image(name)图像输出MellonParam.Output.video(name)视频输出MellonParam.Output.text(name)文本输出MellonParam.Output.model(name)Diffusers 组件的模型输出下面介绍指定 Mellon 类型的三种方式。方式一在 Block 定义中使用metadata如果你是从零开始定义自定义 Block可以直接在InputParam和OutputParam的metadata中加入{mellon: type}。metadata是InputParam/OutputParam数据类自带的字段见 modular_pipeline_utils.py。官方文档以 Gemini Prompt Expander 为例class GeminiPromptExpander(ModularPipelineBlocks): property def inputs(self) - List[InputParam]: return [ InputParam( prompt, type_hintstr, requiredTrue, descriptionPrompt to use, metadata{mellon: textbox}, # Text input ) ] property def intermediate_outputs(self) - List[OutputParam]: return [ OutputParam( prompt, type_hintstr, descriptionExpanded prompt by the LLM, metadata{mellon: text}, # Text output ), OutputParam( old_prompt, type_hintstr, descriptionOld prompt provided by the user, # No metadata - we dont want to render this in UI ) ]注意上面示例中的两个细节prompt输入被标记为textbox渲染为文本输入框输出prompt被标记为text渲染为文本输出接口old_prompt没有添加 metadata因此会落到默认的custom类型在 UI 中只显示为一个普通圆点。这个输出不希望在 UI 中暴露后续在调整配置时会被删除见下文。如果你正在编辑 Hub 上已有的自定义 Block可以先参考 编辑自定义 Block 一节把 Block 下载到本地后再修改。方式二直接传入 MellonParam 实例完整 UI 控制如果你想对 UI 配置拥有完全的控制权可以传入MellonParam实例而不是字符串。官方文档给出的下拉菜单示例from diffusers.modular_pipelines.mellon_node_utils import MellonParam InputParam( mode, type_hintstr, defaultbalanced, metadata{mellon: MellonParam.Input.dropdown(mode, options[fast, balanced, quality])}, )方式三生成配置时用input_types/output_types指定如果你正在使用一个已有的 Pipeline或者希望保持 Block 定义干净整洁可以在生成配置时通过MellonPipelineConfig.from_custom_block的input_types/output_types参数指定类型from diffusers.modular_pipelines.mellon_node_utils import MellonPipelineConfig mellon_config MellonPipelineConfig.from_custom_block( blocks, input_types{prompt: textbox}, output_types{prompt: text} )[!NOTE] 当metadata与input_types/output_types同时指定时后者的参数值会覆盖前者metadata 中的类型定义失效。这一点在源码中也有体现from_custom_block在处理每个输入/输出参数时若其名字出现在input_types/output_types中会先拷贝一份参数并重写metadata为传入的类型见 mellon_node_utils.py。生成并推送 Mellon 配置为 Block 添加好 metadata 之后就可以生成默认的 Mellon 配置模板并推送到 Hub。官方文档给出的完整流程如下from diffusers import ModularPipelineBlocks from diffusers.modular_pipelines.mellon_node_utils import MellonPipelineConfig # load your custom blocks from your local dir blocks ModularPipelineBlocks.from_pretrained(/path/local/folder, trust_remote_codeTrue) # Generate the default config template mellon_config MellonPipelineConfig.from_custom_block(blocks) # push the default template to repo_id, you will need to pass the same local folder path so that it will save the config locally first mellon_config.save( local_dir/path/local/folder, repo_idrepo_id, push_to_hubTrue )执行完成后你的仓库中会多出一个mellon_pipeline_config.json文件。需要结合源码澄清一点在当前仓库的实现中MellonPipelineConfig.save的第一个位置参数是本地目录save_directorypush_to_hub控制是否上传 Hubrepo_id指定目标仓库。保存时会先把配置序列化为mellon_pipeline_config.json写入本地目录再通过huggingface_hub的create_repoexist_okTrue与upload_file完成创建/复用仓库与文件上传默认提交信息为Upload MellonPipelineConfig还支持通过private、create_pr、token、commit_message等关键字参数控制仓库可见性、PR 创建方式与提交说明。解读生成的配置结构与字段含义生成的模板只是一个起点——你很可能需要根据自己的需求进行调整。官方文档以 Gemini Prompt Expander 生成出的配置为例逐字段拆解其结构{ label: Gemini Prompt Expander, default_repo: , default_dtype: , node_params: { custom: { params: { prompt: { label: Prompt, type: string, display: textarea, default: }, out_prompt: { label: Prompt, type: string, display: output }, old_prompt: { label: Old Prompt, type: custom, display: output }, doc: { label: Doc, type: string, display: output } }, input_names: [prompt], model_input_names: [], output_names: [out_prompt, old_prompt, doc], block_name: custom, node_type: custom } } }配置与 ModularPipelineBlocks 的映射关系params字典定义了每个 UI 元素如何渲染而input_names、model_input_names、output_names三个列表则把这些 UI 元素映射到底层 [ModularPipelineBlocks] 的 I/O 接口上Mellon Config 字段ModularPipelineBlocks 对应input_namesinputs属性model_input_namesexpected_components属性output_namesintermediate_outputs属性在本例中prompt是唯一的输入没有任何模型组件model_input_names为空输出包含out_prompt、old_prompt与doc三个。params 字典逐项说明prompt一个输入参数display: textarea渲染为文本输入框、label: PromptUI 中显示的名称、default: 初始为空。其中type: string字段在 Mellon 中非常重要——它决定了哪些节点可以相互连接只有类型匹配的节点才能用noodles连线连接起来。out_promptLLM 展开后的提示词输出。注意这里自动加上了out_前缀——因为输入和输出恰好同名都是prompt加前缀是为了避免配置中的命名冲突。它有display: output渲染为输出接口socket。old_prompt因为我们在 Block 定义时没有为它指定 metadata所以类型为custom在 UI 中渲染为简单的圆点。由于我们并不想把它暴露在 UI 中可以把它移除。doc文档输出所有自定义 Block 都会自动附带。从源码看from_custom_block在收集完所有输出后总会追加一个MellonParam.doc()见 mellon_node_utils.py模板中doc: {label: Doc, type: string, display: output}见 MELLON_PARAM_TEMPLATES。手动调整配置既然old_prompt用不到就从params和output_names中同时移除它得到精简后的配置{ label: Gemini Prompt Expander, default_repo: , default_dtype: , node_params: { custom: { params: { prompt: { label: Prompt, type: string, display: textarea, default: }, out_prompt: { label: Prompt, type: string, display: output }, doc: { label: Doc, type: string, display: output } }, input_names: [prompt], model_input_names: [], output_names: [out_prompt, doc], block_name: custom, node_type: custom } } }调整完成后将最终配置与 Block 代码一起推送到你的 Hub 仓库即可官方参考仓库diffusers/gemini-prompt-expander-mellon。源码级原理mellon_node_utils 是如何工作的为了让你对这套配置机制有更深入的理解这里结合仓库源码补充几个关键实现细节。标准参数模板MELLON_PARAM_TEMPLATESMELLON_PARAM_TEMPLATES内置了 Diffusers 管线的标准参数模板覆盖图像/潜变量/文本/数值/模型/ControlNet/视频等常用参数。你可以通过MellonParam.模板名(**overrides)直接复用例如MellonParam.seed()、MellonParam.prompt(defaulta cat)、MellonParam.latents(displayoutput)。部分常用模板及其默认值如下模板名typedisplay默认值/范围说明prompt/negative_promptstringtextarea默认提示词输入guidance_scalefloatslider5.0min 1.0max 30.0step 0.1引导强度strengthfloat数值0.5min 0.0max 1.0step 0.01重绘强度height/widthint数值1024min 64step 8输出尺寸seedintrandom0max 4294967295带随机按钮的种子num_inference_stepsintslider25min 1max 100推理步数num_framesintslider81min 1max 480视频帧数output_typedropdown—默认np选项[np, pil, pt]输出格式image/images/control_imageimageinput/output—图像 I/Olatents/image_latents/first_frame_latentslatentsinput/output—潜变量 I/Ovae/unet/scheduler/controlnet/text_encodersdiffusers_auto_modelinput—模型组件输入其中required_block_params字段很关键它声明了该模板参数生效所依赖的 Block 输入/组件名from_blocks在匹配模板与实际 Block 时会据此过滤掉当前 Block 不支持的参数见 mellon_node_utils.py。MellonParam 的元类机制与工厂方法MellonParam是一个 frozen dataclassmellon_node_utils.py其字段包括name、label、type、display、default、min/max/step、options、value、fieldOptions、onChange、onSignal、required_block_params等。MellonParamMeta元类实现了MellonParam.模板名(**overrides)语法在MELLON_PARAM_TEMPLATES中找到同名模板后把 override 合并进模板并构造实例。MellonParam.Input/MellonParam.Output则提供面向自定义 Block 的通用工厂即文档中的方法表。所有未显式指定的None字段在to_dict()时会被剔除内部字段name与required_block_params不会写入最终 JSON。类型映射与命名冲突处理input_param_to_mellon_param/output_param_to_mellon_parammellon_node_utils.py负责把 Block 的InputParam/OutputParam转换为MellonParam若 metadata 中是MellonParam实例则直接返回是字符串则按类型映射到对应工厂未知或缺失一律落到custom。在node_spec_to_mellon_dict中mellon_node_utils.py所有输出参数会先与输入参数名比对若同名则自动加out_前缀——这就是上面out_prompt的由来。此外required_inputs中的参数会在label末尾追加 *标记mark_required函数提示用户该参数为必填。内置节点规格DEFAULT_NODE_SPECS对于内置管线DEFAULT_NODE_SPECS预定义了四类标准节点的 I/O 规格denoise必填输入embeddings必填模型输入unet、scheduler输出latents、latents_preview、doc并内置guider、controlnet_bundle等可选模型输入text_encoder必填输入prompt必填模型输入text_encoders输出embeddings、docvae_encoder输入image模型输入vae输出image_latents、docdecoder输入latents模型输入vae输出images、videos、doc。MellonPipelineConfig.from_blocks会拿这些模板规格与实际的sub_blocks逐一匹配只保留当前 Pipeline 真正支持的参数从而为任意模块化管线生成对应的 Mellon 配置。而from_custom_block则面向自定义 Block将inputs、intermediate_outputs与expected_components分别映射为input_names、output_names与model_input_names并自动附加doc输出。配置的保存与加载MellonPipelineConfig支持完整的本地与 Hub 往返save()写入本地目录并可选推送到 Hubload()支持本地文件、本地目录或 Hub 仓库三种来源通过hf_hub_download下载mellon_pipeline_config.json并会对各种错误场景仓库不存在、revision 不存在、文件缺失、JSON 解析失败等给出清晰的错误提示见 mellon_node_utils.py。测试验证仓库中的测试用例 test_custom_block_mellon_config_preserves_required_inputs 验证了这条核心链路对一个自定义 Block 调用MellonPipelineConfig.from_custom_block后node_params[custom][required_inputs]应正确保留必填输入prompt且对应参数的label以 *结尾。此外DummyCustomBlockSimple 展示了自定义 Block 的标准写法inputs/intermediate_outputs/__call__可以作为你编写自定义 Block 并接入 Mellon 的最小参考模板。相关文档与进一步阅读Building Custom Blocks自定义 Block 构建指南本文的前置知识介绍 Block 的项目结构block.pymodular_config.json、Florence-2 完整示例以及本地编辑与上传流程Modular Diffusers OverviewModular Diffusers 体系总览含 Mellon Integration 章节索引Quickstart快速上手模块化管线ModularPipelineBlocks 与 ModularPipeline理解 Block 与可执行 Pipeline 的关系核心实现源码mellon_node_utils.pyMellonParam、MellonPipelineConfig 等全部工具类InputParam/OutputParam数据类定义modular_pipeline_utils.py集成测试test_modular_pipelines_custom_blocks.py。[!NOTE] 再次提醒Mellon 集成仍处于早期开发阶段源码与文档均有明确标注以上 API 在后续版本中可能调整。本文描述以当前仓库的实现为准请在升级 Diffusers 版本后留意官方变更说明。【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门