ComfyUIにネイティブループを追加: Start LoopノードとEnd Loopノード
ComfyUIコアがワークフローをネイティブにループできるようになりました。Start LoopとEnd Loopを組み合わせれば、回数、インデックス範囲、またはリストでグラフを反復でき、値の引き継ぎと出力の蓄積が可能です。
utilities/loopingカテゴリに表示されます。
ループの描き方
設定するループコンテナはありません。ループはノードのペアであり、本体はそれらの間に位置するものです。Start LoopからEnd Loopまで配線されたものはすべて、1回の反復ごとに実行されます。
ループ構造は通常のプロンプト検証中にチェックされるため、不正なループは実行開始前に失敗します。すべてのStart Loopは正確に1つのEnd Loopと曖昧さなく対応しなければならず、ネストされたスコープは一貫している必要があり、ループブランチはそのEnd Loopの外へ抜け出せません。Start LoopとEnd Loopはノードスキーマで自身をループ境界として宣言し、ペアリングチェックはこれを読み取ります。
実行時には元の本体が抑制され、最初の反復を含めて各反復が新しくキューに入れられたグラフノードとして投影されます。反復は別個のループインタプリタで処理されるのではなく通常のスケジューラ作業のままであり、反復の進捗はノード上でIteration n / totalとして報告されます。
反復回数を指定する3つの方法
Start Loopのmode入力は反復カウンタの生成方法を選択し、選択したモードの入力のみが表示されます。
| モード | 反復対象 | 独自の入力 |
|---|---|---|
simple | 固定の繰り返し回数 | num_iterations(デフォルト4) |
For | 数値のインデックス範囲 | start_iteration_index(デフォルト0)、max_iteration(デフォルト4、排他的)、step(デフォルト1) |
List | 接続されたリストの項目ごとに1回 | list |
stepは最小1で、値が0の場合はエラーになります。計算された反復回数がゼロの場合、ループ本体は実行されず、is_lastはtrueとして報告されます。
Start Loopが返すもの
| 出力 | 意味 |
|---|---|
iteration_index | 現在の反復のインデックス |
is_first | 最初の反復でtrue |
is_last | 最後の反復でtrue |
list_item | Listモードでの現在の項目。他のモードでは空 |
current_iteration_value | この反復で引き継がれる値 |
is_firstは最初のパスだけを変えるための一般的なフックです。たとえば、前のウィンドウの最後のフレームではなくソースフレームからビデオループを開始する場合などです。
最小構成: 1つのStart Loop、小さな生成本体、1つのEnd Loop。画像を保存のパススルーはtermination入力に配線されているため、各反復ごとに1回実行されます。
ループを閉じる
End Loopはスコープを閉じ、何がスコープから出るかを決めます。
| 入力 | 役割 |
|---|---|
output_value | End Loop後に返される値 |
next_iteration_value | 次の反復のためにcurrent_iteration_valueとしてStart Loopに送り返される |
accumulate | 有効にすると、最後の1つだけでなく、すべての反復のoutput_valueが返される |
termination入力 | プレビュー、保存、その他すべての反復で実行する必要がある副作用のための動的に増加する入力。値は返されない |
End Loopには、型がoutput_valueに従う単一の出力ソケットがあります。accumulateを有効にすると、値は通常のComfyUIリストとして反復順に連結されて出てきます。
termination入力はよくある驚きへの対策です。本体の内部にある画像プレビューや画像を保存ノードは、そうしないと最後の反復でしか実行されません。これは以前に投影された本体が上書きされるためです。そのノードのパススルーをtermination入力に配線すると、各反復で1回実行され、ループ境界内に保たれます。
accumulateを有効にすると、4つの生成結果すべてが1つのリストとして返されます。画像プレビューはterminationで処理されるため、各反復の完了が順に確認できます。
反復ごとに処理を変える
iteration_indexは通常の整数出力なので、解像度、ステップ数、プロンプトのバリエーション、LoRA強度のランプなど、下流のあらゆるものを制御できます。
Forモードがiteration_indexを解像度に渡し、サイズの異なる結果が最後に蓄積されます。
反復間で状態を引き継ぐ
initial_iteration_valueは最初の反復で引き継ぎ値を初期化し、各反復のnext_iteration_valueが次の反復のcurrent_iteration_valueになります。これが状態チャンネルのすべてであり、Start LoopとEnd Loopのペアごとに正確に1つ存在します。
複数のものを引き継ぐには、それらをリストに入れます。既存のCreate Listノードは異種入力を受け入れるようになったため、1つの引き継ぎ値で画像とそれを生成したテキストプロンプトのような混在した状態を保持できます。utilitiesカテゴリの2つのノードがこのパターンをサポートします。
- Create List: 混在した入力から引き継ぎ値を構築します。
- Get Item From List: 同じリリースで新登場。リストとインデックスを受け取り、その項目を通常の値として返すため、引き継いだ状態の構成要素を次の反復内で取り出せます。
Z-Imageによる生成とvision-languageによるキャプション付けが、単一の引き継ぎ画像とテキスト値を通じてやり取りされます。
ネストとキャッシュ
Start Loopのparent_iterationはforce入力です。外側のループのiteration_indexをこれに接続すると、ループを別のループ内にネストできます。ネストは推測ではなく明示的で、各Start Loopは依然として正確に1つのEnd Loopを必要とします。
Start Loopのcache_iterationsは高度な機能で、デフォルトではオフです。有効にすると、投影された反復ノードが以前の実行のキャッシュ結果を再利用する場合があります。End Loopノード自体は通常の実行ノードなので、いずれの場合も最終出力は通常どおりキャッシュされます。
プロンプトに対するListモードの外側ループがあり、parent_iterationを介して生成ループがその内側にネストされています。
ビデオと潜在の例
この機構は、各ウィンドウが前のウィンドウに依存するビデオ拡張を念頭に置いて構築されました。公開されている2つの例がこのパターンを直接示しています。
最後のフレームから最初のフレームへのビデオループ: ソース画像がinitial_iteration_valueを初期化し、生成された各ウィンドウの最終フレームが次のウィンドウの最初のフレームになり、フレームのバッチが蓄積されて1つのクリップに再バッチされます。
accumulateをオフにして潜在をループ内で直接引き継ぐため、最後の潜在のみが返されます。さらに最初の反復処理のためのlazyスイッチと、サンプリングが進むにつれて徐々に変化するLoRA強度を組み合わせています。
最もシンプルな出発点である、引き継ぎ値のない4回反復の生成ループは、Start LoopとEnd Loopのペア1組だけです。
ノードの場所
Start LoopとEnd Loopはutilities/loopingカテゴリのコアノードで、ComfyUI本体に同梱されているためノードパックは不要です。Create ListとGet Item From Listはutilitiesにあります。ループの動作は公式の組み込みノードページ(Start Loop と End Loop)に記載されています。
既存のワークフローは影響を受けません。ループはオプトインであり、Start LoopとEnd Loopのペアがないグラフはこれまでどおりキューに入ります。
コメント
GitHubでサインインしてディスカッションに参加しましょう。