ComfyUIワークフローの設定

Marinara Engineは、ローカルのComfyUIサーバーへ画像と動画のリクエストを送れます。ComfyUIを動かすRunPod Serverlessエンドポイントへは、画像のリクエストを送れます。ローカルの画像モデルなら、Marinara内蔵の基本ワークフローを使えます。動画と高度な画像設定では、自分で用意したAPI形式のワークフローを使います。API形式のワークフローとは、ComfyUIからJSONとしてエクスポートしたワークフローのことです。

Marinaraに貼り付けたJSONはスナップショットです。ComfyUIで開いているワークフローとリアルタイムにつながっているわけではありません。ComfyUIでワークフローを変更したら、動作を確認し、もう一度エクスポートして、Marinaraに保存されているJSONを置き換えてください。

始める前に

ComfyUIをインストールし、ワークフローに必要なチェックポイントとカスタムノードを追加して、サーバーを起動します。ローカルのアドレスは通常http://127.0.0.1:8188です。

ComfyUIを家庭内ネットワークの別のコンピューターで動かしている場合は、Marinaraから届くアドレスでサーバーが待ち受けている必要があります。画像のアカウントでは、Marinaraの.envにIMAGE_LOCAL_URLS_ENABLED=trueも必要です。サーバー設定リファレンスを参照してください。それでも接続できないときは、相手のコンピューターのファイアウォールを確認します。

ローカルの言語モデルと画像モデルは、GPUメモリーに同時に載りきらないことがあります。8 GBのカードでは特に起こりやすい問題です。Marinaraの画像キューは画像ジョブが同時に走らないようにしますが、読み込んだ2つのモデルを同じVRAMに収めることまではできません。メモリーが足りない場合は、クラウドの言語モデルを使う、ComfyUIを別のデバイスで動かす、もう一方を使う前に片方のモデルを解放する、のいずれかで対処します。

Marinaraの接続を作る

  1. Connections(接続)をクリックし、Add(追加)をクリックします。Add account(アカウントの追加)ウィンドウのImages & video(画像と動画)で、ローカルサーバーならComfyUI、RunPodのエンドポイントならRunPod Serverless (ComfyUI)を選びます。
  2. ローカルのComfyUIでは、そのアドレス(http://127.0.0.1:8188)を入力します。APIキーは不要です。ComfyUI workflow (optional)(ComfyUIワークフロー、任意)欄が空のときは、Marinaraが内蔵の基本的なtext-to-imageワークフローを使います。
  3. RunPodでは、APIキーとRunPod endpoint ID(RunPodのエンドポイントID)を入力します。カスタムワークフローが必須です。
  4. 画像モデルでLocal image defaults(ローカル画像のデフォルト設定)を設定します。ここで指定した値が、ワークフロー内の対応するプレースホルダーに入ります。
  5. ワークフローを貼り付けて保存し、Test image(画像をテスト)をクリックします。

うまくいかなかった場合は、トラブルシューティングを参照してください。

ワークフローを作ってエクスポートする

  1. Marinara用のワークフローをComfyUIで別に作成します。
  2. チェックポイント、LoRA、VAE、プロンプトエンコーダー、ラテント画像や画像入力のノード、サンプラー、出力ノードを、いつもどおり設定してつなぎます。
  3. ComfyUIでワークフローをキューに入れ、期待どおりの画像ができることを確かめます。
  4. 出力ノードを必ず入れます。Marinaraは完成した画像やアニメーションをComfyUIのワークフロー履歴から読み取るため、SaveImageがもっとも安全な選択肢です。
  5. 編集可能なワークフローを、Marinara_Workflowのようにすぐ見分けられる名前で保存します。
  6. ワークフローをAPI形式でエクスポートします。ComfyUIのフロントエンドのバージョンによって、この操作はSave (API Format)、Export (API)、Export to APIなどと表示されます。見当たらないときは、ComfyUIの開発者向けオプション(dev mode)を有効にします。
  7. 書き出された.jsonファイルをテキストエディターで開きます。

API形式のワークフローは、通常のビジュアルエディターのワークフローとは別物です。トップレベルのキーがノードIDになっていて、各ノードは通常class_typeとinputsを持ちます。必ずAPI版をエクスポートしてください。エディターの見た目のレイアウトを含む通常のワークフローファイルを貼り付けてはいけません。

ComfyUIの動画ワークフロー

Images & video(画像と動画)でComfyUIのアカウントを追加し、その動画モデルを開きます。必須のComfyUI workflow (optional)(ComfyUIワークフロー、任意)欄に、API形式のワークフローを貼り付けます。WAN 2.2をはじめとするローカルの動画グラフも、同じワークフローがComfyUIで動作し、コアのSaveVideoノードなどの出力からMP4を保存できるのであれば利用できます。

動画のワークフローでは、次のプレースホルダーを引用符の中に入れて使えます。

プレースホルダーMarinaraが渡す値
%prompt%組み立てたシーンまたはアニメーションのプロンプト。
%width%, %height%480pは832×480、720pは1280×720。9:16では縦横が入れ替わります。
%seed%新しいランダムな32ビットのシード。
%length%16 fps換算のフレーム数で表したクリップの長さ。
%model%接続にModelが設定されている場合はその値。
%reference_image_name%ComfyUIのLoadImageノード用の、アップロードした先頭フレームのファイル名。

Marinaraは/promptでワークフローをキューに入れ、/historyを監視して、gifsまたはimagesの出力に記載されたMP4をダウンロードします。画像から動画を作る操作では%reference_image_name%が渡されますが、テキストだけの接続テストでは渡されません。同じワークフローで両方に対応させたいときは、この入力を必須にしないでください。

ローカルのWANのレンダリングは、中位クラスのGPUだと30分を超えることがあります。ComfyUIの動画ジョブは、画像専用のCOMFYUI_GEN_TIMEOUTではなくVIDEO_GEN_TIMEOUT_MSを使います。正しいワークフローが途中で打ち切られる場合は、動画側のタイムアウトを延ばしてMarinaraを再起動します。

Marinaraのプレースホルダーを入れる

Marinaraに任せたい値を、以下のプレースホルダーに置き換えます。

ローカルのComfyUIの接続では、すべてのプレースホルダーをJSONの引用符の中に収めます。Marinaraはまずワークフローを解析し、そのあとで"%width%"のように値全体が数値のプレースホルダーを実際の数値に変換します。そのため、数値入力を要求するノードでも問題なく使えます。

RunPod Serverless (ComfyUI)の接続では、"%prompt%"、"%model%"、"%sampler%"などのテキストのプレースホルダーは引用符付きのままにし、%width%、%height%、%seed%、%steps%、%cfg%、%denoise%、%clip_skip%などの数値のプレースホルダーは引用符なしにします。RunPodでは、Marinaraがワークフローを解析するより先に置換が行われるため、挿入された数値によって送信されるJSONが正しい形になります。引用符なしのトークンは生成時まで置き換えられないので、接続の編集画面ではこのテンプレートが一時的に不正なJSONとして表示されることがあります。この警告が出ても保存はできます。

ローカル向けの基本的なAPIワークフローは、関係する部分だけを抜き出すと次のようになります。

{
  "3": {
    "class_type": "KSampler",
    "inputs": {
      "seed": "%seed%",
      "steps": "%steps%",
      "cfg": "%cfg%",
      "sampler_name": "%sampler%",
      "scheduler": "%scheduler%",
      "denoise": "%denoise%"
    }
  },
  "5": {
    "class_type": "EmptyLatentImage",
    "inputs": {
      "width": "%width%",
      "height": "%height%",
      "batch_size": 1
    }
  },
  "6": {
    "class_type": "CLIPTextEncode",
    "inputs": {
      "text": "portrait, %prompt%, masterpiece"
    }
  },
  "7": {
    "class_type": "CLIPTextEncode",
    "inputs": {
      "text": "watermark, %negative_prompt%"
    }
  }
}

これは一部分にすぎません。エクスポートしたワークフローのノードの接続やそのほかの入力はそのまま残してください。プロンプトのプレースホルダーは長い文字列の中に埋め込めるので、固定のタグを前後に付け足せます。数値のプレースホルダーは、原則として値全体にします。RunPod用にコピーしたワークフローでは、その数値トークンを囲む引用符を外します。Marinaraの接続のデフォルト設定で書き換えたくない項目は、ワークフロー側に直接値を書いたままにしておいてもかまいません。

プレースホルダーMarinaraが渡す値
%prompt%画像のポジティブプロンプト。これが無いと接続の編集画面が警告します。
%negative_prompt%画像のネガティブプロンプト。
%width%, %height%要求された画像のサイズ。
%seed%接続で設定したシード。-1にすると毎回ランダムなシードになります。
%model%接続に保存したモデル。ローダーノードが要求するチェックポイント名を正確に指定します。
%steps%サンプリングのステップ数。
%cfg%CFGスケール。%cfg_scale%と%scale%も使えます。
%sampler%サンプラー名。
%scheduler%スケジューラー名。
%denoise%デノイズの強さ。%denoising_strength%も使えます。
%clip_skip%対応するノード向けのClip Skipの値。

編集が終わったらJSONを保存し、ファイル全体をコピーして、画像モデルのComfyUI workflow (optional)(ComfyUIワークフロー、任意)に貼り付けます。保存して、Test image(画像をテスト)をクリックします。

参照画像を使う

生成を開始する機能が画像を持っている場合、Marinaraは最大4枚の参照画像を渡せます。カスタムワークフロー側には、対応する入力ノードとプレースホルダーが必要です。プレースホルダーを書き足しても、ノードが自動で作られたりつながれたりはしません。

ローカルのComfyUI: LoadImageに渡すファイル名

標準的なComfyUIのLoadImageノードでは、ファイル名のプレースホルダーを使います。

{
  "12": {
    "class_type": "LoadImage",
    "inputs": {
      "image": "%reference_image_name%",
      "upload": "image"
    }
  }
}

Marinaraは参照画像をComfyUIの入力ディレクトリーにアップロードし、ComfyUIが返したファイル名でプレースホルダーを置き換えます。%reference_image_name%は1枚目の画像を指します。参照画像の入力が複数あるワークフローでは、%reference_image_name_01%から%reference_image_name_04%まで使えます。

ワークフローが常に画像入力を必要とする場合は、Local image defaults(ローカル画像のデフォルト設定)で、1x1のプレースホルダー画像をアップロードするオプションをオンにします。すると、実際の参照画像が無いリクエストのときは、Marinaraが極小のプレースホルダー画像を渡します。

base64の生データ

1枚目の画像をbase64の生データで受け取るには%reference_image%を、番号付きの入力には%reference_image_01%から%reference_image_04%を使います。これらの値にはdata:image/...の接頭辞が付かないbase64データが入るため、その形式をそのまま受け取れるカスタムノードでしか動きません。

RunPodのワークフローはbase64の生データのプレースホルダーに対応しています。ファイル名でアップロードするプレースホルダーはローカルのComfyUI専用で、RunPodのハンドラー経由では使えません。

キャラクターごとのワークフローを用意する

特定のチェックポイント、LoRAの組み合わせ、ControlNetの構成、参照画像の並びが必要なキャラクターには、そのキャラクター専用にエクスポートしたワークフローとMarinaraの画像接続を用意できます。そのキャラクターや画像機能でモデルを選べる場所では、対応する画像モデルを選びます。

汎用のワークフロー1つで済ませるより結果が安定しやすくなりますが、モデルごとにJSONのコピーを個別に持つことに変わりはありません。ComfyUIでそのキャラクターのワークフローを変更したら、その接続について、エクスポート、編集、コピー、貼り付けの手順をもう一度行ってください。

トラブルシューティング

問題確認すること
ワークフローのJSONが不正だとMarinaraが表示するローカルのComfyUIでは、プレースホルダーを追加したあとの引用符、カンマ、括弧を確認します。RunPodでは、引用符を外してよいのは数値のプレースホルダーだけです。テキストのプレースホルダーとテンプレートの残りは、正しいJSONの書式である必要があります。
プロンプトやプレースホルダーがそのままノードに届くトークンの綴りが一覧のとおりか、貼り付けたワークフローが新しくエクスポートしたAPI版かを確かめます。
指定したサイズが画像に反映されない実際にサンプラーへつながっているラテント画像ノード、または同等のサイズ指定ノードに%width%と%height%を入れます。
ComfyUIがモデルを見つけられないローダーが要求するチェックポイント名を正確に指定するか、%model%を使わずにワークフロー内へチェックポイントを直接書き込みます。
ノードや入力が見つからないとComfyUIが表示するワークフローを作ったときと同じカスタムノードのパッケージをインストールし、入力名が変わっていないか確かめます。
ジョブは完了するのにMarinaraに画像が届かない接続済みのSaveImage出力を追加し、ComfyUIでワークフローをもう一度直接テストします。
参照画像のノードが失敗する通常のローカルのLoadImageノードには%reference_image_name...%のプレースホルダーを使います。base64の生データは、それ専用のノードでのみ使い、Marinaraの機能が実際に参照画像を渡したかどうかも確認します。
リモートやLANのComfyUIのURLがブロックされる画像の接続ではIMAGE_LOCAL_URLS_ENABLEDを有効にします。ComfyUIがネットワークインターフェイスで待ち受けるように設定し、ホストのファイアウォールも確認します。認証のないComfyUIサーバーをインターネットに公開しないでください。
エラー: Outbound response exceeded N bytes応答が設定された上限(デフォルトは30 MiB)を超えました。画像に埋め込まれたワークフローや参照画像のメタデータが原因になることがあります。ComfyUIでメタデータをオフにするか、Marinaraの.envでIMAGE_GEN_MAX_RESPONSE_BYTESを大きくしてMarinaraを再起動します。
時間のかかる画像生成がタイムアウトするMarinaraの.envでCOMFYUI_GEN_TIMEOUTを大きくします。単位は秒で、デフォルトは2400です。
時間のかかる動画生成がタイムアウトするMarinaraの.envでVIDEO_GEN_TIMEOUT_MSを大きくします。単位はミリ秒で、デフォルトは1800000(30分)です。
生成中にGPUメモリーが不足する画像のサイズやモデルのサイズを下げる、ローカルの言語モデルを解放する、リモートの言語モデルを使う、ComfyUIを別のデバイスへ移す、といった方法で対処します。

関連ガイド