Buckets:

download
raw
10.8 kB
import"../chunks/DsnmJJEf.js";import{i as m,h as w,C as k,H as s,a,E as b,s as A}from"../chunks/DdZvggmf.js";import{p as _,o as B,s as l,f as C,a as J,b as I,c as y,n as Q}from"../chunks/BbekZcyp.js";const E='{"title":"LoopSequentialPipelineBlocks","local":"loopsequentialpipelineblocks","sections":[{"title":"循环包装器","local":"循环包装器","sections":[],"depth":2},{"title":"循环块","local":"循环块","sections":[],"depth":2},{"title":"LoopSequentialPipelineBlocks","local":"loopsequentialpipelineblocks","sections":[],"depth":2}],"depth":1}';var R=y('<meta name="hf:doc:metadata"/>'),f=y("<p></p> <!> <!> <p><code>LoopSequentialPipelineBlocks</code> 是一种多块类型,它将其他 <code>ModularPipelineBlocks</code> 以循环方式组合在一起。数据循环流动,使用 <code>intermediate_inputs</code> 和 <code>intermediate_outputs</code>,并且每个块都是迭代运行的。这通常用于创建一个默认是迭代的去噪循环。</p> <p>本指南向您展示如何创建 <code>LoopSequentialPipelineBlocks</code>。</p> <!> <p><code>LoopSequentialPipelineBlocks</code>,也被称为 <em>循环包装器</em>,因为它定义了循环结构、迭代变量和配置。在循环包装器内,您需要以下变量。</p> <ul><li><code>loop_inputs</code> 是用户提供的值,等同于 <code>inputs</code>。</li> <li><code>loop_intermediate_inputs</code> 是来自 <code>PipelineState</code> 的中间变量,等同于 <code>~modular_pipelines.ModularPipelineBlocks.intermediate_inputs</code>。</li> <li><code>loop_intermediate_outputs</code> 是由块创建并添加到 <code>PipelineState</code> 的新中间变量。它等同于 <code>intermediate_outputs</code>。</li> <li><code>__call__</code> 方法定义了循环结构和迭代逻辑。</li></ul> <!> <p>循环包装器可以传递额外的参数,如当前迭代索引,到循环块。</p> <!> <p>循环块是一个 <code>ModularPipelineBlocks</code>,但 <code>__call__</code> 方法的行为不同。</p> <ul><li>它从循环包装器。</li> <li>它直接与<code>BlockState</code>一起工作,而不是<code>PipelineState</code>。</li> <li>它不需要检索或更新<code>BlockState</code>。</li></ul> <p>循环块共享相同的<code>BlockState</code>,以允许值在循环的每次迭代中累积和变化。</p> <!> <!> <p>使用<code>from_blocks_dict()</code>方法将循环块添加到循环包装器中,以创建<code>LoopSequentialPipelineBlocks</code>。</p> <!> <p>添加更多的循环块以在每次迭代中运行,使用<code>from_blocks_dict()</code>。这允许您在不改变循环逻辑本身的情况下修改块。</p> <!> <!> <p></p>",1);function S(T,h){_(h,!1),B(()=>{new URLSearchParams(window.location.search).get("fw")}),m();var e=f();w("h54v7e",U=>{var r=R();A(r,"content",E),J(U,r)});var o=l(C(e),2);k(o,{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"});var n=l(o,2);s(n,{title:"LoopSequentialPipelineBlocks",local:"loopsequentialpipelineblocks",headingTag:"h1"});var p=l(n,6);s(p,{title:"循环包装器",local:"循环包装器",headingTag:"h2"});var c=l(p,6);a(c,{code:"aW1wb3J0JTIwdG9yY2glMEFmcm9tJTIwZGlmZnVzZXJzLm1vZHVsYXJfcGlwZWxpbmVzJTIwaW1wb3J0JTIwTG9vcFNlcXVlbnRpYWxQaXBlbGluZUJsb2NrcyUyQyUyME1vZHVsYXJQaXBlbGluZUJsb2NrcyUyQyUyMElucHV0UGFyYW0lMkMlMjBPdXRwdXRQYXJhbSUwQSUwQWNsYXNzJTIwTG9vcFdyYXBwZXIoTG9vcFNlcXVlbnRpYWxQaXBlbGluZUJsb2NrcyklM0ElMEElMjAlMjAlMjAlMjBtb2RlbF9uYW1lJTIwJTNEJTIwJTIydGVzdCUyMiUwQSUyMCUyMCUyMCUyMCU0MHByb3BlcnR5JTBBJTIwJTIwJTIwJTIwZGVmJTIwZGVzY3JpcHRpb24oc2VsZiklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjAlMjJJJ20lMjBhJTIwbG9vcCEhJTIyJTBBJTIwJTIwJTIwJTIwJTQwcHJvcGVydHklMEElMjAlMjAlMjAlMjBkZWYlMjBsb29wX2lucHV0cyhzZWxmKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJldHVybiUyMCU1QklucHV0UGFyYW0obmFtZSUzRCUyMm51bV9zdGVwcyUyMiklNUQlMEElMjAlMjAlMjAlMjAlNDB0b3JjaC5ub19ncmFkKCklMEElMjAlMjAlMjAlMjBkZWYlMjBfX2NhbGxfXyhzZWxmJTJDJTIwY29tcG9uZW50cyUyQyUyMHN0YXRlKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJsb2NrX3N0YXRlJTIwJTNEJTIwc2VsZi5nZXRfYmxvY2tfc3RhdGUoc3RhdGUpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwJUU1JUJFJUFBJUU3JThFJUFGJUU3JUJCJTkzJUU2JTlFJTg0JTIwLSUyMCVFNSU4RiVBRiVFNCVCQiVBNSVFNiVBMCVCOSVFNiU4RCVBRSVFNiU4MiVBOCVFNyU5QSU4NCVFOSU5QyU4MCVFNiVCMSU4MiVFNSVBRSU5QSVFNSU4OCVCNiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMGklMjBpbiUyMHJhbmdlKGJsb2NrX3N0YXRlLm51bV9zdGVwcyklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBsb29wX3N0ZXAlMjAlRTYlOEMlODklRTklQTElQkElRTUlQkElOEYlRTYlODklQTclRTglQTElOEMlRTYlODklODAlRTYlOUMlODklRTYlQjMlQTglRTUlODYlOEMlRTclOUElODQlRTUlOUQlOTclMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBjb21wb25lbnRzJTJDJTIwYmxvY2tfc3RhdGUlMjAlM0QlMjBzZWxmLmxvb3Bfc3RlcChjb21wb25lbnRzJTJDJTIwYmxvY2tfc3RhdGUlMkMlMjBpJTNEaSklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLnNldF9ibG9ja19zdGF0ZShzdGF0ZSUyQyUyMGJsb2NrX3N0YXRlKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJldHVybiUyMGNvbXBvbmVudHMlMkMlMjBzdGF0ZQ==",highlighted:`<span class="hljs-keyword">import</span> torch
<span class="hljs-keyword">from</span> diffusers.modular_pipelines <span class="hljs-keyword">import</span> LoopSequentialPipelineBlocks, ModularPipelineBlocks, InputParam, OutputParam
<span class="hljs-keyword">class</span> <span class="hljs-title class_">LoopWrapper</span>(<span class="hljs-title class_ inherited__">LoopSequentialPipelineBlocks</span>):
model_name = <span class="hljs-string">&quot;test&quot;</span>
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">description</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> <span class="hljs-string">&quot;I&#x27;m a loop!!&quot;</span>
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">loop_inputs</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> [InputParam(name=<span class="hljs-string">&quot;num_steps&quot;</span>)]
<span class="hljs-meta"> @torch.no_grad()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__call__</span>(<span class="hljs-params">self, components, state</span>):
block_state = <span class="hljs-variable language_">self</span>.get_block_state(state)
<span class="hljs-comment"># 循环结构 - 可以根据您的需求定制</span>
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(block_state.num_steps):
<span class="hljs-comment"># loop_step 按顺序执行所有注册的块</span>
components, block_state = <span class="hljs-variable language_">self</span>.loop_step(components, block_state, i=i)
<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 t=l(c,4);s(t,{title:"循环块",local:"循环块",headingTag:"h2"});var M=l(t,8);a(M,{code:"Y2xhc3MlMjBMb29wQmxvY2soTW9kdWxhclBpcGVsaW5lQmxvY2tzKSUzQSUwQSUyMCUyMCUyMCUyMG1vZGVsX25hbWUlMjAlM0QlMjAlMjJ0ZXN0JTIyJTBBJTIwJTIwJTIwJTIwJTQwcHJvcGVydHklMEElMjAlMjAlMjAlMjBkZWYlMjBpbnB1dHMoc2VsZiklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjAlNUJJbnB1dFBhcmFtKG5hbWUlM0QlMjJ4JTIyKSU1RCUwQSUyMCUyMCUyMCUyMCU0MHByb3BlcnR5JTBBJTIwJTIwJTIwJTIwZGVmJTIwaW50ZXJtZWRpYXRlX291dHB1dHMoc2VsZiklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjAlRTglQkYlOTklRTQlQjglQUElRTUlOUQlOTclRTQlQkElQTclRTclOTQlOUYlRTclOUElODQlRTglQkUlOTMlRTUlODclQkElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjAlNUJPdXRwdXRQYXJhbShuYW1lJTNEJTIyeCUyMiklNUQlMEElMjAlMjAlMjAlMjAlNDBwcm9wZXJ0eSUwQSUyMCUyMCUyMCUyMGRlZiUyMGRlc2NyaXB0aW9uKHNlbGYpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwJTIyJUU2JTg4JTkxJUU2JTk4JUFGJUU0JUI4JTgwJUU0JUI4JUFBJUU1JTlDJUE4JTYwTG9vcFdyYXBwZXIlNjAlRTclQjElQkIlRTUlODYlODUlRTklODMlQTglRTQlQkQlQkYlRTclOTQlQTglRTclOUElODQlRTUlOUQlOTclMjIlMEElMjAlMjAlMjAlMjBkZWYlMjBfX2NhbGxfXyhzZWxmJTJDJTIwY29tcG9uZW50cyUyQyUyMGJsb2NrX3N0YXRlJTJDJTIwaSUzQSUyMGludCklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBibG9ja19zdGF0ZS54JTIwJTJCJTNEJTIwMSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJldHVybiUyMGNvbXBvbmVudHMlMkMlMjBibG9ja19zdGF0ZQ==",highlighted:`<span class="hljs-keyword">class</span> <span class="hljs-title class_">LoopBlock</span>(<span class="hljs-title class_ inherited__">ModularPipelineBlocks</span>):
model_name = <span class="hljs-string">&quot;test&quot;</span>
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">inputs</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> [InputParam(name=<span class="hljs-string">&quot;x&quot;</span>)]
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">intermediate_outputs</span>(<span class="hljs-params">self</span>):
<span class="hljs-comment"># 这个块产生的输出</span>
<span class="hljs-keyword">return</span> [OutputParam(name=<span class="hljs-string">&quot;x&quot;</span>)]
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">description</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> <span class="hljs-string">&quot;我是一个在\`LoopWrapper\`类内部使用的块&quot;</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__call__</span>(<span class="hljs-params">self, components, block_state, i: <span class="hljs-built_in">int</span></span>):
block_state.x += <span class="hljs-number">1</span>
<span class="hljs-keyword">return</span> components, block_state`,lang:"py",wrap:!1});var i=l(M,2);s(i,{title:"LoopSequentialPipelineBlocks",local:"loopsequentialpipelineblocks",headingTag:"h2"});var j=l(i,4);a(j,{code:"bG9vcCUyMCUzRCUyMExvb3BXcmFwcGVyLmZyb21fYmxvY2tzX2RpY3QoJTdCJTIyYmxvY2sxJTIyJTNBJTIwTG9vcEJsb2NrJTdEKQ==",highlighted:'loop = LoopWrapper.from_blocks_dict({<span class="hljs-string">&quot;block1&quot;</span>: LoopBlock})',lang:"py",wrap:!1});var d=l(j,4);a(d,{code:"bG9vcCUyMCUzRCUyMExvb3BXcmFwcGVyLmZyb21fYmxvY2tzX2RpY3QoJTdCJTIyYmxvY2sxJTIyJTNBJTIwTG9vcEJsb2NrKCklMkMlMjAlMjJibG9jazIlMjIlM0ElMjBMb29wQmxvY2slN0Qp",highlighted:'loop = LoopWrapper.from_blocks_dict({<span class="hljs-string">&quot;block1&quot;</span>: LoopBlock(), <span class="hljs-string">&quot;block2&quot;</span>: LoopBlock})',lang:"py",wrap:!1});var u=l(d,2);b(u,{source:"https://github.com/huggingface/diffusers/blob/main/docs/source/zh/modular_diffusers/loop_sequential_pipeline_blocks.md"}),Q(2),J(T,e),I()}export{S as component};

Xet Storage Details

Size:
10.8 kB
·
Xet hash:
bd7aaed0a0697a97026dac6537f692f609f76c7702c8786f1db630118a980f47

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.