Buckets:
| import"../chunks/DsnmJJEf.js";import{i as I,h as B,C as Q,H as s,a as e,E as k,s as f}from"../chunks/DdZvggmf.js";import{p as E,o as S,s as l,f as Y,a as j,b as Z,d as a,c as R,r as t,n as O}from"../chunks/BbekZcyp.js";const G='{"title":"ModularPipelineBlocks","local":"modularpipelineblocks","sections":[{"title":"输入和输出","local":"输入和输出","sections":[],"depth":2},{"title":"计算逻辑","local":"计算逻辑","sections":[{"title":"组件和配置","local":"组件和配置","sections":[],"depth":3}],"depth":2}],"depth":1}';var X=R('<meta name="hf:doc:metadata"/>'),N=R('<p></p> <!> <!> <p><code>ModularPipelineBlocks</code> 是构建 <code>ModularPipeline</code> 的基本块。它定义了管道中特定步骤应执行的组件、输入/输出和计算。一个 <code>ModularPipelineBlocks</code> 与其他块连接,使用 <a href="./modular_diffusers_states">状态</a>,以实现工作流的模块化构建。</p> <p>单独的 <code>ModularPipelineBlocks</code> 无法执行。它是管道中步骤应执行的操作的蓝图。要实际运行和执行管道,需要将 <code>ModularPipelineBlocks</code> 转换为 <code>ModularPipeline</code>。</p> <p>本指南将向您展示如何创建 <code>ModularPipelineBlocks</code>。</p> <!> <blockquote class="tip"><p>如果您不熟悉Modular Diffusers中状态的工作原理,请参考 <a href="./modular_diffusers_states">States</a> 指南。</p></blockquote> <p>一个 <code>ModularPipelineBlocks</code> 需要 <code>inputs</code> 和 <code>intermediate_outputs</code>。</p> <ul><li><p><code>inputs</code> 是由用户提供并从 <code>PipelineState</code> 中检索的值。这很有用,因为某些工作流会调整图像大小,但仍需要原始图像。 <code>PipelineState</code> 维护原始图像。</p> <p>使用 <code>InputParam</code> 定义 <code>inputs</code>。</p> <!></li> <li><p><code>intermediate_inputs</code> 通常由前一个块创建的值,但如果前面的块没有生成它们,也可以直接提供。与 <code>inputs</code> 不同,<code>intermediate_inputs</code> 可以被修改。</p> <p>使用 <code>InputParam</code> 定义 <code>intermediate_inputs</code>。</p> <!></li> <li><p><code>intermediate_outputs</code> 是由块创建并添加到 <code>PipelineState</code> 的新值。<code>intermediate_outputs</code> 可作为后续块的 <code>intermediate_inputs</code> 使用,或作为运行管道的最终输出使用。</p> <p>使用 <code>OutputParam</code> 定义 <code>intermediate_outputs</code>。</p> <!></li></ul> <p>中间输入和输出共享数据以连接块。它们可以在任何时候访问,允许你跟踪工作流的进度。</p> <!> <p>一个块执行的计算在<code>__call__</code>方法中定义,它遵循特定的结构。</p> <ol><li>检索<code>BlockState</code>以获取<code>inputs</code>和<code>intermediate_inputs</code>的局部视图。</li> <li>在<code>inputs</code>和<code>intermediate_inputs</code>上实现计算逻辑。</li> <li>更新<code>PipelineState</code>以将局部<code>BlockState</code>的更改推送回全局<code>PipelineState</code>。</li> <li>返回对下一个块可用的组件和状态。</li></ol> <!> <!> <p>块需要的组件和管道级别的配置在<code>ComponentSpec</code>和<code>ConfigSpec</code>中指定。</p> <ul><li><code>ComponentSpec</code>包含块使用的预期组件。你需要组件的<code>name</code>和理想情况下指定组件确切是什么的<code>type_hint</code>。</li> <li><code>ConfigSpec</code>包含控制所有块行为的管道级别设置。</li></ul> <!> <p>当块被转换为管道时,组件作为<code>__call__</code>中的第一个参数对块可用。</p> <!> <!> <p></p>',1);function z(V,w){E(w,!1),S(()=>{new URLSearchParams(window.location.search).get("fw")}),I();var p=N();B("3y0lfi",m=>{var h=X();f(h,"content",G),j(m,h)});var d=l(Y(p),2);Q(d,{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"});var i=l(d,2);s(i,{title:"ModularPipelineBlocks",local:"modularpipelineblocks",headingTag:"h1"});var U=l(i,8);s(U,{title:"输入和输出",local:"输入和输出",headingTag:"h2"});var o=l(U,6),c=a(o),g=l(a(c),4);e(g,{code:"ZnJvbSUyMGRpZmZ1c2Vycy5tb2R1bGFyX3BpcGVsaW5lcyUyMGltcG9ydCUyMElucHV0UGFyYW0lMEElMEF1c2VyX2lucHV0cyUyMCUzRCUyMCU1QiUwQSUyMCUyMCUyMCUyMElucHV0UGFyYW0obmFtZSUzRCUyMmltYWdlJTIyJTJDJTIwdHlwZV9oaW50JTNEJTIyUElMLkltYWdlJTIyJTJDJTIwZGVzY3JpcHRpb24lM0QlMjIlRTglQTYlODElRTUlQTQlODQlRTclOTAlODYlRTclOUElODQlRTUlOEUlOUYlRTUlQTclOEIlRTglQkUlOTMlRTUlODUlQTUlRTUlOUIlQkUlRTUlODMlOEYlMjIpJTBBJTVE",highlighted:`<span class="hljs-keyword">from</span> diffusers.modular_pipelines <span class="hljs-keyword">import</span> InputParam | |
| user_inputs = [ | |
| InputParam(name=<span class="hljs-string">"image"</span>, type_hint=<span class="hljs-string">"PIL.Image"</span>, description=<span class="hljs-string">"要处理的原始输入图像"</span>) | |
| ]`,lang:"py",wrap:!1}),t(c);var n=l(c,2),C=l(a(n),4);e(C,{code:"dXNlcl9pbnRlcm1lZGlhdGVfaW5wdXRzJTIwJTNEJTIwJTVCJTBBJTIwJTIwJTIwJTIwSW5wdXRQYXJhbShuYW1lJTNEJTIycHJvY2Vzc2VkX2ltYWdlJTIyJTJDJTIwdHlwZV9oaW50JTNEJTIydG9yY2guVGVuc29yJTIyJTJDJTIwZGVzY3JpcHRpb24lM0QlMjJpbWFnZSUyMHRoYXQlMjBoYXMlMjBiZWVuJTIwcHJlcHJvY2Vzc2VkJTIwYW5kJTIwbm9ybWFsaXplZCUyMiklMkMlMEElNUQ=",highlighted:`user_intermediate_inputs = [ | |
| InputParam(name=<span class="hljs-string">"processed_image"</span>, type_hint=<span class="hljs-string">"torch.Tensor"</span>, description=<span class="hljs-string">"image that has been preprocessed and normalized"</span>), | |
| ]`,lang:"py",wrap:!1}),t(n);var M=l(n,2),_=l(a(M),4);e(_,{code:"ZnJvbSUyMGRpZmZ1c2Vycy5tb2R1bGFyX3BpcGVsaW5lcyUyMGltcG9ydCUyME91dHB1dFBhcmFtJTBBJTBBJTIwJTIwJTIwJTIwdXNlcl9pbnRlcm1lZGlhdGVfb3V0cHV0cyUyMCUzRCUyMCU1QiUwQSUyMCUyMCUyMCUyME91dHB1dFBhcmFtKG5hbWUlM0QlMjJpbWFnZV9sYXRlbnRzJTIyJTJDJTIwZGVzY3JpcHRpb24lM0QlMjJsYXRlbnRzJTIwcmVwcmVzZW50aW5nJTIwdGhlJTIwaW1hZ2UlMjIpJTBBJTVE",highlighted:`<span class="hljs-keyword">from</span> diffusers.modular_pipelines <span class="hljs-keyword">import</span> OutputParam | |
| user_intermediate_outputs = [ | |
| OutputParam(name=<span class="hljs-string">"image_latents"</span>, description=<span class="hljs-string">"latents representing the image"</span>) | |
| ]`,lang:"py",wrap:!1}),t(M),t(o);var T=l(o,4);s(T,{title:"计算逻辑",local:"计算逻辑",headingTag:"h2"});var r=l(T,6);e(r,{code:"ZGVmJTIwX19jYWxsX18oc2VsZiUyQyUyMGNvbXBvbmVudHMlMkMlMjBzdGF0ZSklM0ElMEElMjAlMjAlMjAlMjAlMjMlMjAlRTglOEUlQjclRTUlOEYlOTYlRTglQUYlQTUlRTUlOUQlOTclRTklOUMlODAlRTglQTYlODElRTclOUElODQlRTclOEElQjYlRTYlODAlODElRTUlOEYlOTglRTklODclOEYlRTclOUElODQlRTUlQjElODAlRTklODMlQTglRTglQTclODYlRTUlOUIlQkUlMEElMjAlMjAlMjAlMjBibG9ja19zdGF0ZSUyMCUzRCUyMHNlbGYuZ2V0X2Jsb2NrX3N0YXRlKHN0YXRlKSUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMCVFNCVCRCVBMCVFNyU5QSU4NCVFOCVBRSVBMSVFNyVBRSU5NyVFOSU4MCVCQiVFOCVCRSU5MSVFNSU5QyVBOCVFOCVCRiU5OSVFOSU4NyU4QyUwQSUyMCUyMCUyMCUyMCUyMyUyMGJsb2NrX3N0YXRlJUU1JThDJTg1JUU1JTkwJUFCJUU0JUJEJUEwJUU2JTg5JTgwJUU2JTlDJTg5JUU3JTlBJTg0aW5wdXRzJUU1JTkyJThDaW50ZXJtZWRpYXRlX2lucHV0cyUwQSUyMCUyMCUyMCUyMCUyMyUyMCVFNSU4MyU4RiVFOCVCRiU5OSVFNiVBMCVCNyVFOCVBRSVCRiVFOSU5NyVBRSVFNSVBRSU4MyVFNCVCQiVBQyUzQSUyMGJsb2NrX3N0YXRlLmltYWdlJTJDJTIwYmxvY2tfc3RhdGUucHJvY2Vzc2VkX2ltYWdlJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUU3JTk0JUE4JUU0JUJEJUEwJUU2JTlCJUI0JUU2JTk2JUIwJUU3JTlBJTg0YmxvY2tfc3RhdGVzJUU2JTlCJUI0JUU2JTk2JUIwJUU3JUFFJUExJUU5JTgxJTkzJUU3JThBJUI2JUU2JTgwJTgxJTBBJTIwJTIwJTIwJTIwc2VsZi5zZXRfYmxvY2tfc3RhdGUoc3RhdGUlMkMlMjBibG9ja19zdGF0ZSklMEElMjAlMjAlMjAlMjByZXR1cm4lMjBjb21wb25lbnRzJTJDJTIwc3RhdGU=",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">__call__</span>(<span class="hljs-params">self, components, state</span>): | |
| <span class="hljs-comment"># 获取该块需要的状态变量的局部视图</span> | |
| block_state = <span class="hljs-variable language_">self</span>.get_block_state(state) | |
| <span class="hljs-comment"># 你的计算逻辑在这里</span> | |
| <span class="hljs-comment"># block_state包含你所有的inputs和intermediate_inputs</span> | |
| <span class="hljs-comment"># 像这样访问它们: block_state.image, block_state.processed_image</span> | |
| <span class="hljs-comment"># 用你更新的block_states更新管道状态</span> | |
| <span class="hljs-variable language_">self</span>.set_block_state(state, block_state) | |
| <span class="hljs-keyword">return</span> components, state`,lang:"py",wrap:!1});var J=l(r,2);s(J,{title:"组件和配置",local:"组件和配置",headingTag:"h3"});var y=l(J,6);e(y,{code:"ZnJvbSUyMGRpZmZ1c2VycyUyMGltcG9ydCUyMENvbXBvbmVudFNwZWMlMkMlMjBDb25maWdTcGVjJTBBJTBBZXhwZWN0ZWRfY29tcG9uZW50cyUyMCUzRCUyMCU1QiUwQSUyMCUyMCUyMCUyMENvbXBvbmVudFNwZWMobmFtZSUzRCUyMnVuZXQlMjIlMkMlMjB0eXBlX2hpbnQlM0RVTmV0MkRDb25kaXRpb25Nb2RlbCklMkMlMEElMjAlMjAlMjAlMjBDb21wb25lbnRTcGVjKG5hbWUlM0QlMjJzY2hlZHVsZXIlMjIlMkMlMjB0eXBlX2hpbnQlM0RFdWxlckRpc2NyZXRlU2NoZWR1bGVyKSUwQSU1RCUwQSUwQWV4cGVjdGVkX2NvbmZpZyUyMCUzRCUyMCU1QiUwQSUyMCUyMCUyMCUyMENvbmZpZ1NwZWMoJTIyZm9yY2VfemVyb3NfZm9yX2VtcHR5X3Byb21wdCUyMiUyQyUyMFRydWUpJTBBJTVE",highlighted:`<span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> ComponentSpec, ConfigSpec | |
| expected_components = [ | |
| ComponentSpec(name=<span class="hljs-string">"unet"</span>, type_hint=UNet2DConditionModel), | |
| ComponentSpec(name=<span class="hljs-string">"scheduler"</span>, type_hint=EulerDiscreteScheduler) | |
| ] | |
| expected_config = [ | |
| ConfigSpec(<span class="hljs-string">"force_zeros_for_empty_prompt"</span>, <span class="hljs-literal">True</span>) | |
| ]`,lang:"py",wrap:!1});var u=l(y,4);e(u,{code:"ZGVmJTIwX19jYWxsX18oc2VsZiUyQyUyMGNvbXBvbmVudHMlMkMlMjBzdGF0ZSklM0ElMEElMjAlMjAlMjAlMjAlMjMlMjAlRTQlQkQlQkYlRTclOTQlQTglRTclODIlQjklRTclQUMlQTYlRTUlOEYlQjclRTglQUUlQkYlRTklOTclQUUlRTclQkIlODQlRTQlQkIlQjYlMEElMjAlMjAlMjAlMjB1bmV0JTIwJTNEJTIwY29tcG9uZW50cy51bmV0JTBBJTIwJTIwJTIwJTIwdmFlJTIwJTNEJTIwY29tcG9uZW50cy52YWUlMEElMjAlMjAlMjAlMjBzY2hlZHVsZXIlMjAlM0QlMjBjb21wb25lbnRzLnNjaGVkdWxlcg==",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">__call__</span>(<span class="hljs-params">self, components, state</span>): | |
| <span class="hljs-comment"># 使用点符号访问组件</span> | |
| unet = components.unet | |
| vae = components.vae | |
| scheduler = components.scheduler`,lang:"py",wrap:!1});var b=l(u,2);k(b,{source:"https://github.com/huggingface/diffusers/blob/main/docs/source/zh/modular_diffusers/pipeline_block.md"}),O(2),j(V,p),Z()}export{z as component}; | |
Xet Storage Details
- Size:
- 10.7 kB
- Xet hash:
- b0d6f6ed39af39e1af72b80dd57b2efd4057c05d1ac5b2a09ca9c277e735c54c
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.