すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:ComfyUI を使用して AI 動画生成モデルサービスをデプロイする

最終更新日:Nov 10, 2025

ComfyUI を使用して複雑な AIGC ワークフローを作成し、短い動画やアニメーションを生成できます。Elastic Algorithm Service (EAS) は、シナリオベースのデプロイメントメソッドを提供し、構成するパラメーターをいくつか指定するだけで、ComfyUI と Stable Video Diffusion に基づいて AI 動画生成サービスをデプロイできます。このトピックでは、ComfyUI イメージと一般的な呼び出しメソッドに基づいてサービスをデプロイする方法について説明します。

デプロイメントメソッドを選択する

次の表に、シナリオベースのデプロイメントで使用可能なエディション(Standard Edition、API Edition、Cluster Edition WebUI、Serverless)を示します。

適切なシナリオ

呼び出しメソッド

課金方法

Standard Edition

サービスが単一インスタンスにデプロイされている場合、単一ユーザーが WebUI または API 操作を使用してサービスを呼び出します。

  • WebUI

  • オンラインデバッグ

  • API 呼び出し(同期)

デプロイ構成に基づいて課金されます。詳細については、「EAS の課金」をご参照ください。

API Edition

高並列処理が必要です。システムは、追加の CPU インスタンスを必要とするキューサービスインスタンスを作成します。

API 呼び出し(非同期)

Cluster Edition WebUI

設計チームや教育目的で、複数のユーザーが同時に WebUI でサービスを呼び出します。

WebUI

Serverless

計算リソースの需要が大きく変動します。システムは、サービスリクエストに基づいてサービスを自動的にスケーリングします。

WebUI

サービスデプロイメントは無料です。生成時間に基づいて課金されます。

  • Cluster Edition WebUI:各ユーザーは独自のバックエンド環境と作業ディレクトリを持っています。これにより、効率的な GPU 共有とファイル管理を実現できます。Cluster Edition WebUI サービスの仕組みについては、「Cluster Edition WebUI サービスの仕組み」をご参照ください。

  • Serverless:Serverless エディションは、中国(上海)リージョンと中国(杭州)リージョンでのみサポートされています。

シナリオベースのデプロイメントがビジネス要件を満たせない場合は、Standard Edition、Cluster Edition WebUI、および API Edition の Alibaba Cloud イメージを使用してカスタムモデルをデプロイできます。また、コンソールでカスタムデプロイメントのパラメーターを構成して、他の機能を実装することもできます。

EAS でモデルサービスをデプロイする

方法 1:シナリオベースのモデルデプロイメント(推奨)

  1. PAI コンソール にログオンします。ページ上部でリージョンを選択します。次に、目的のワークスペースを選択し、[Elastic Algorithm Service (EAS) に入る] をクリックします。

  2. Elastic Algorithm Service (EAS) ページで、[サービスのデプロイ] をクリックします。[シナリオベースのモデルデプロイメント] セクションで、[AI 動画生成:ComfyUI ベースのデプロイメント] をクリックします。

  3. [AI 動画生成:ComfyUI ベースのデプロイメント] ページで、次の表に示す主要なパラメーターを構成します。

    パラメーター

    説明

    [基本情報]

    [サービス名]

    モデルサービスの名前を指定します。

    [エディション]

    デプロイメントメソッドを選択する を参照してください。

    [モデル設定]

    次のシナリオでは、モデル設定を追加する必要があります。

    サポートされているタイプ:

    • [OSS]image をクリックして、既存の Object Storage Service (OSS) ディレクトリを選択します。

    • [NAS]:File Storage NAS (NAS) マウントターゲットとソースパスを構成します。

    [リソース構成]

    [インスタンス数]

    [Standard Edition] を選択した場合は、値を 1 に設定することをお勧めします。

    [リソース構成]

    GU30、A10、または T4 GPU タイプをお勧めします。デフォルトでは、費用対効果のために [GPU] > [ml.gu7i.c16m60.1-gu30] が選択されています。

    説明

    ComfyUI はシングル GPU モードのみをサポートしています。つまり、タスクはシングル GPU インスタンスまたは複数のシングル GPU インスタンスで実行できます。ComfyUI はマルチ GPU 同時操作をサポートしていません。

  4. [デプロイ] をクリックします。デプロイメントの完了には約 5 分かかります。[サービスステータス][実行中] に変わると、サービスがデプロイされます。

方法 2:カスタムデプロイメント

  1. PAI コンソール にログオンします。ページ上部でリージョンを選択します。次に、目的のワークスペースを選択し、[Elastic Algorithm Service (EAS) に入る] をクリックします。

  2. [サービスのデプロイ] をクリックします。[カスタムモデルデプロイメント] セクションで、[カスタムデプロイメント] をクリックします。

  3. [カスタムデプロイメント] ページで、次の表に示す主要なパラメーターを構成します。

    パラメーター

    説明

    [基本情報]

    [サービス名]

    サービスの名前を入力します。この例では、[comfyui_svd_demo] という名前を使用しています。

    [環境情報]

    [デプロイメントメソッド]

    [イメージベースのデプロイメント] を選択し、[Web アプリを有効にする] を選択します。

    [イメージ構成]

    [Alibaba Cloud イメージ] リストで、[comfyui] > [comfyui:1.9] を選択します。ここで、

    • x.x:Standard Edition を指定します。

    • x.x-api:API Edition を指定します。

    • x.x-cluster:Cluster Edition を指定します。

    説明
    • イメージバージョンは頻繁に更新されます。最新バージョンを選択することをお勧めします。

    • 各エディションの適切なシナリオについては、デプロイメントメソッドを選択する を参照してください。

    [モデル設定]

    次のシナリオでは、モデル設定を追加する必要があります。

    サポートされているタイプ:

    • OSS

      • [URI]image をクリックして、既存の OSS ディレクトリを選択します。例:oss://bucket-test/data-oss/

      • [マウントパス]/code/data-oss と入力します。OSS ディレクトリは、イメージの /code/data-oss パスにマウントされます。

    • 汎用 NAS

      • [ファイルシステム]:NAS ファイルシステムを選択します。

      • [マウントターゲット]:NAS ファイルシステムのマウントターゲット。EAS サービスは、マウントターゲットを使用して NAS ファイルシステムにアクセスします。

      • [ファイルシステムパス]:ファイルが格納されている NAS パス。例:/data-oss

      • [マウントパス]/code/data-oss と入力します。NAS ファイルシステムのパスは、イメージの /code/data-oss パスにマウントされます。

    [コマンド]

    • イメージバージョンを構成した後、システムは自動的に値を python main.py --listen --port 8000 に設定します。

    • ポート番号:8000。

    モデルを構成した後、[コマンド] フィールドに --data-dir パラメーターを追加する必要があります。マウントディレクトリは、[モデル設定] セクションの [マウントパス] と同じである必要があります。例:python main.py --listen --port 8000 --data-dir /code/data-oss

    [リソース情報]

    [リソースタイプ]

    [パブリックリソース] を選択します。

    [インスタンス]

    Standard Edition を使用する場合は、値を 1 に設定します。

    [デプロイメントリソース]

    GPU アクセラレーションインスタンスタイプを選択する必要があります。費用対効果のために [ml.gu7i.c16m60.1-gu30] をお勧めします。このインスタンスタイプが使用できない場合は、代わりに [ecs.gn6i-c16g1.4xlarge] を選択できます。

    説明

    ComfyUI はシングル GPU モードのみをサポートしています。つまり、タスクはシングル GPU インスタンスまたは複数のシングル GPU インスタンスで実行できます。ComfyUI はマルチ GPU 同時操作をサポートしていません。

  4. [デプロイ] をクリックします。デプロイメントの完了には約 5 分かかります。[サービスステータス][実行中] に変わると、サービスがデプロイされます。

EAS サービスを呼び出す

WebUI

WebUI を介して Standard、Cluster、および Serverless エディションを使用できます。

  1. 呼び出すサービスを見つけ、[サービスタイプ] 列の [Web アプリを表示] をクリックします。

  2. WebUI ページでモデル推論を実行します。

    ComfyUI イメージサービスは、複数のワークフローテンプレートを提供します。[ワークフロー] > [テンプレートを参照] をクリックして、これらのテンプレートを表示および使用します。また、カスタムワークフローをインポートすることもできます。image

    この例では、Wan VACE Text to Video テンプレートを使用しています。ワークフローがロードされた後、[ここにモデルをロード] セクションでモデルを選択し、[プロンプト] セクションにプロンプトを入力して、[実行] をクリックします。

    説明

    新しいワークフローをロードすると、パスの変更により実行中にエラーが発生する場合があります。正常な動作を確保するために、いくつかのモデルとパラメーターを再選択することをお勧めします。

    image

    ワークフローが実行されると、生成された動画が [動画を保存] セクションに表示されます。image

API

Standard Edition は同期呼び出しとオンラインデバッグをサポートしています。API Edition は非同期呼び出しをサポートしています。

説明

EAS における同期呼び出しと非同期呼び出しの一般的な定義:

  • 同期呼び出しは、EAS のキューサービスを使用せずに、推論インスタンスにリクエストを直接送信します。

  • 非同期呼び出しは、EAS のキューサービスを使用して、入力キューにリクエストを送信します。キューサービスにサブスクライブして、非同期推論結果を取得できます。

ComfyUI 自体に非同期キューシステムがあるため、同期呼び出しが行われた場合でも、本質的には非同期で処理されます。リクエストを送信した後、システムはプロンプト ID を返します。次に、プロンプト ID を使用して、推論結果をポーリングします。

1. リクエストボディを生成する

ComfyUI の API リクエストボディはワークフローによって異なります。最初に Standard Edition サービスの WebUI でワークフローを構成し、左上隅にある [ワークフロー] > [エクスポート(API)] を選択して API 形式を保存し、ワークフローの JSON ファイルを取得します。image

  • 同期呼び出しの場合、JSON ファイルの内容はリクエストボディの prompt フィールドに含める必要があります。

  • 非同期呼び出しの場合、リクエストボディは JSON ファイルの内容そのものです。

クリックして、前述のワークフローの同期呼び出しのサンプルリクエストボディを表示する

{
    "prompt": {
        "3": {
            "inputs": {
                "seed": 367490676387803,
                "steps": 40,
                "cfg": 7,
                "sampler_name": "dpmpp_sde_gpu",
                "scheduler": "karras",
                "denoise": 1,
                "model": [
                    "4",
                    0
                ],
                "positive": [
                    "6",
                    0
                ],
                "negative": [
                    "7",
                    0
                ],
                "latent_image": [
                    "5",
                    0
                ]
            },
            "class_type": "KSampler",
            "_meta": {
                "title": "K sampler"  // Kサンプラー
            }
        },
        "4": {
            "inputs": {
                "ckpt_name": "LandscapeBING_v10.safetensors"
            },
            "class_type": "CheckpointLoaderSimple",
            "_meta": {
                "title": "Checkpoint loader (simple)" // チェックポイントローダー(シンプル)
            }
        },
        "5": {
            "inputs": {
                "width": 720,
                "height": 1280,
                "batch_size": 1
            },
            "class_type": "EmptyLatentImage",
            "_meta": {
                "title": "Empty Latent" // 空の潜在
            }
        },
        "6": {
            "inputs": {
                "text": "Rocket takes off from the ground, fire,sky, airplane", // ロケットが地面から離陸する、火、空、飛行機
                "clip": [
                    "4",
                    1
                ]
            },
            "class_type": "CLIPTextEncode",
            "_meta": {
                "title": "CLIP text encoder" // CLIPテキストエンコーダー
            }
        },
        "7": {
            "inputs": {
                "text": "",
                "clip": [
                    "4",
                    1
                ]
            },
            "class_type": "CLIPTextEncode",
            "_meta": {
                "title": "CLIP text encoder" // CLIPテキストエンコーダー
            }
        },
        "8": {
            "inputs": {
                "samples": [
                    "3",
                    0
                ],
                "vae": [
                    "4",
                    2
                ]
            },
            "class_type": "VAEDecode",
            "_meta": {
                "title": "VAE decoding" // VAEデコード
            }
        },
        "9": {
            "inputs": {
                "filename_prefix": "ComfyUI",
                "images": [
                    "8",
                    0
                ]
            },
            "class_type": "SaveImage",
            "_meta": {
                "title": "Save the image" // 画像を保存
            }
        },
        "13": {
            "inputs": {
                "seed": 510424455529432,
                "steps": 40,
                "cfg": 2.5,
                "sampler_name": "euler_ancestral",
                "scheduler": "karras",
                "denoise": 1,
                "model": [
                    "17",
                    0
                ],
                "positive": [
                    "16",
                    0
                ],
                "negative": [
                    "16",
                    1
                ],
                "latent_image": [
                    "16",
                    2
                ]
            },
            "class_type": "KSampler",
            "_meta": {
                "title": "K sampler" // Kサンプラー
            }
        },
        "14": {
            "inputs": {
                "samples": [
                    "13",
                    0
                ],
                "vae": [
                    "18",
                    2
                ]
            },
            "class_type": "VAEDecode",
            "_meta": {
                "title": "VAE decoding" // VAEデコード
            }
        },
        "15": {
            "inputs": {
                "filename_prefix": "ComfyUI",
                "fps": 10,
                "lossless": false,
                "quality": 85,
                "method": "default",
                "images": [
                    "14",
                    0
                ]
            },
            "class_type": "SaveAnimatedWEBP",
            "_meta": {
                "title": "Save WEBP" // WEBPを保存
            }
        },
        "16": {
            "inputs": {
                "width": 512,
                "height": 768,
                "video_frames": 35,
                "motion_bucket_id": 140,
                "fps": 15,
                "augmentation_level": 0.15,
                "clip_vision": [
                    "18",
                    1
                ],
                "init_image": [
                    "8",
                    0
                ],
                "vae": [
                    "18",
                    2
                ]
            },
            "class_type": "SVD_img2vid_Conditioning",
            "_meta": {
                "title": "SVD_Image to Video_Condition" // SVD_画像から動画への_条件
            }
        },
        "17": {
            "inputs": {
                "min_cfg": 1,
                "model": [
                    "18",
                    0
                ]
            },
            "class_type": "VideoLinearCFGGuidance",
            "_meta": {
                "title": "Linear CFG Bootstrap" // 線形CFGブートストラップ
            }
        },
        "18": {
            "inputs": {
                "ckpt_name": "svd_xt_image_decoder.safetensors"
            },
            "class_type": "ImageOnlyCheckpointLoader",
            "_meta": {
                "title": "Checkpoint loader (image only)" // チェックポイントローダー(画像のみ)
            }
        },
        "19": {
            "inputs": {
                "frame_rate": 10,
                "loop_count": 0,
                "filename_prefix": "comfyUI",
                "format": "video/h264-mp4",
                "pix_fmt": "yuv420p",
                "crf": 20,
                "save_metadata": true,
                "pingpong": false,
                "save_output": true,
                "images": [
                    "14",
                    0
                ]
            },
            "class_type": "VHS_VideoCombine",
            "_meta": {
                "title": "Merge to video" // ビデオにマージ
            }
        }
    }
}

2. 呼び出しを開始する

オンラインデバッグ

Standard Edition サービスのみがオンラインデバッグをサポートしています。

  1. Elastic Algorithm Service (EAS) ページで、デバッグするサービスを見つけ、[アクション] 列の [オンラインデバッグ] をクリックします。

  2. POST リクエストを送信して、プロンプト ID を取得します。

    1. [リクエストパラメーター] セクションで、[本文] コードエディターに準備したリクエスト本文を入力します。リクエスト URL 入力ボックスに /prompt を追加します。image

    2. [リクエストを送信] をクリックして、[デバッグ情報] セクションに返された結果を表示します。次の図は例を示しています。image

  3. GET リクエストを送信して、プロンプト ID に基づいて推論結果を取得します。

    1. [リクエストパラメーター] セクションで、リクエストメソッドを GET に変更し、入力ボックスに /history/<prompt id> と入力します。次の図は例を示しています。image

      <prompt id> をステップ 2 で取得したプロンプト ID に置き換えます。

    2. [リクエストを送信] をクリックして、推論結果を取得します。

      マウントされたストレージの output ディレクトリに生成された推論結果を表示できます。

同期呼び出し

Standard Edition サービスのみが同期呼び出しをサポートしています。

  1. 呼び出し方法を表示します。

    1. サービスリストで、Standard Edition サービスの名前をクリックします。[基本情報] セクションで、[エンドポイント情報を表示] をクリックします。

    2. [呼び出し方法] パネルで、サービスエンドポイントとトークンを取得します。image

  2. POST リクエストを送信して、プロンプト ID を取得します。

    cURL

    • HTTP リクエストメソッド:POST

    • リクエスト URL:<service_url>/prompt

    • リクエストヘッダー:

      ヘッダー

      説明

      Authorization

      <token>

      認証キー

      Content-Type

      application/json

      リクエストボディの形式

    • サンプルコード

      curl --location --request POST '<service_url>/prompt' \
      --header 'Authorization: <token>' \
      --header 'Content-Type: application/json' \
      --data-raw '{
          "prompt":
          ...omitted // 省略
      }'

      以下の表で、主要なパラメーターについて説明します。

      パラメータ

      説明

      <service_url>

      値をステップ 1 で取得したエンドポイントに置き換えます。エンドポイントの末尾にあるスラッシュ(/)を削除します。例:http://comfyui****.175805416243****.cn-beijing.pai-eas.aliyuncs.com

      <token>

      値をステップ 1 で取得したトークンに置き換えます。例:ZGJmNzcwYjczODE1MmVlNWY1NTNiNGYxNDkzODI****NzU2NTFiOA==

      data-raw

      値をリクエスト本文に設定します。例:

      重要

      リクエスト本文のブール値(true および false)の最初の文字は小文字にする必要があります。

      クリックしてリクエスト本文のサンプルを表示します

      {
          "prompt": {
              "3": {
                  "inputs": {
                      "seed": 367490676387803,
                      "steps": 40,
                      "cfg": 7,
                      "sampler_name": "dpmpp_sde_gpu",
                      "scheduler": "karras",
                      "denoise": 1,
                      "model": [
                          "4",
                          0
                      ],
                      "positive": [
                          "6",
                          0
                      ],
                      "negative": [
                          "7",
                          0
                      ],
                      "latent_image": [
                          "5",
                          0
                      ]
                  },
                  "class_type": "KSampler",
                  "_meta": {
                      "title": "K サンプラー" //日本語訳
                  }
              },
              "4": {
                  "inputs": {
                      "ckpt_name": "LandscapeBING_v10.safetensors"
                  },
                  "class_type": "CheckpointLoaderSimple",
                  "_meta": {
                      "title": "チェックポイントローダー(シンプル)" //日本語訳
                  }
              },
              "5": {
                  "inputs": {
                      "width": 720,
                      "height": 1280,
                      "batch_size": 1
                  },
                  "class_type": "EmptyLatentImage",
                  "_meta": {
                      "title": "空の潜在画像" //日本語訳
                  }
              },
              "6": {
                  "inputs": {
                      "text": "Rocket takes off from the ground, fire,sky, airplane",
                      "clip": [
                          "4",
                          1
                      ]
                  },
                  "class_type": "CLIPTextEncode",
                  "_meta": {
                      "title": "CLIP テキストエンコーダー" //日本語訳
                  }
              },
              "7": {
                  "inputs": {
                      "text": "",
                      "clip": [
                          "4",
                          1
                      ]
                  },
                  "class_type": "CLIPTextEncode",
                  "_meta": {
                      "title": "CLIP テキストエンコーダー" //日本語訳
                  }
              },
              "8": {
                  "inputs": {
                      "samples": [
                          "3",
                          0
                      ],
                      "vae": [
                          "4",
                          2
                      ]
                  },
                  "class_type": "VAEDecode",
                  "_meta": {
                      "title": "VAE デコード" //日本語訳
                  }
              },
              "9": {
                  "inputs": {
                      "filename_prefix": "ComfyUI",
                      "images": [
                          "8",
                          0
                      ]
                  },
                  "class_type": "SaveImage",
                  "_meta": {
                      "title": "画像を保存" //日本語訳
                  }
              },
              "13": {
                  "inputs": {
                      "seed": 510424455529432,
                      "steps": 40,
                      "cfg": 2.5,
                      "sampler_name": "euler_ancestral",
                      "scheduler": "karras",
                      "denoise": 1,
                      "model": [
                          "17",
                          0
                      ],
                      "positive": [
                          "16",
                          0
                      ],
                      "negative": [
                          "16",
                          1
                      ],
                      "latent_image": [
                          "16",
                          2
                      ]
                  },
                  "class_type": "KSampler",
                  "_meta": {
                      "title": "K サンプラー" //日本語訳
                  }
              },
              "14": {
                  "inputs": {
                      "samples": [
                          "13",
                          0
                      ],
                      "vae": [
                          "18",
                          2
                      ]
                  },
                  "class_type": "VAEDecode",
                  "_meta": {
                      "title": "VAE デコード" //日本語訳
                  }
              },
              "15": {
                  "inputs": {
                      "filename_prefix": "ComfyUI",
                      "fps": 10,
                      "lossless": false,
                      "quality": 85,
                      "method": "default",  //メソッドは英語のまま
                      "images": [
                          "14",
                          0
                      ]
                  },
                  "class_type": "SaveAnimatedWEBP",
                  "_meta": {
                      "title": "WEBP を保存" //日本語訳
                  }
              },
              "16": {
                  "inputs": {
                      "width": 512,
                      "height": 768,
                      "video_frames": 35,
                      "motion_bucket_id": 140,
                      "fps": 15,
                      "augmentation_level": 0.15,
                      "clip_vision": [
                          "18",
                          1
                      ],
                      "init_image": [
                          "8",
                          0
                      ],
                      "vae": [
                          "18",
                          2
                      ]
                  },
                  "class_type": "SVD_img2vid_Conditioning",
                  "_meta": {
                      "title": "SVD_Image to Video_Condition" //英語のまま
                  }
              },
              "17": {
                  "inputs": {
                      "min_cfg": 1,
                      "model": [
                          "18",
                          0
                      ]
                  },
                  "class_type": "VideoLinearCFGGuidance",
                  "_meta": {
                      "title": "Linear CFG Bootstrap" //英語のまま
                  }
              },
              "18": {
                  "inputs": {
                      "ckpt_name": "svd_xt_image_decoder.safetensors"
                  },
                  "class_type": "ImageOnlyCheckpointLoader",
                  "_meta": {
                      "title": "チェックポイントローダー(イメージのみ)" //日本語訳
                  }
              },
              "19": {
                  "inputs": {
                      "frame_rate": 10,
                      "loop_count": 0,
                      "filename_prefix": "comfyUI",
                      "format": "video/h264-mp4",  //フォーマットは英語のまま
                      "pix_fmt": "yuv420p",
                      "crf": 20,
                      "save_metadata": true,
                      "pingpong": false,
                      "save_output": true,
                      "images": [
                          "14",
                          0
                      ]
                  },
                  "class_type": "VHS_VideoCombine",
                  "_meta": {
                      "title": "ビデオにマージ" //日本語訳
                  }
              }
          }
      }

    Python

    サンプルコード:

    import requests
    
    url = "<service_url>/prompt"
    
    payload = {
        "prompt":
        ...omitted
    }
    
    session = requests.session()
    session.headers.update({"Authorization":"<token>"})
    
    
    response = session.post(url=f'{url}', json=payload)
    if response.status_code != 200:
        raise Exception(response.content)
    
    data = response.json()
    print(data)

    次の表に、主要なパラメータを示します。

    パラメータ

    説明

    <service_url>

    値をステップ 1 で取得したエンドポイントに置き換えます。エンドポイントの末尾にあるスラッシュ (/) を削除します。例: http://comfyui****.175805416243****.cn-beijing.pai-eas.aliyuncs.com

    <token>

    値をステップ 1 で取得したトークンに置き換えます。ZGJmNzcwYjczODE1MmVlNWY1NTNiNGYxNDkzODI****NzU2NTFiOA==

    payload

    値をリクエスト本文に設定します。例:

    重要

    リクエスト本文のブール値 (True および False) の最初の文字は大文字にする必要があります。

    クリックしてサンプルのリクエスト本文を表示する

    {
        "prompt": {
            "3": {
                "inputs": {
                    "seed": 367490676387803,
                    "steps": 40,
                    "cfg": 7,
                    "sampler_name": "dpmpp_sde_gpu",
                    "scheduler": "karras",
                    "denoise": 1,
                    "model": [
                        "4",
                        0
                    ],
                    "positive": [
                        "6",
                        0
                    ],
                    "negative": [
                        "7",
                        0
                    ],
                    "latent_image": [
                        "5",
                        0
                    ]
                },
                "class_type": "KSampler",
                "_meta": {
                    "title": "Kサンプラー" //日本語訳
                }
            },
            "4": {
                "inputs": {
                    "ckpt_name": "LandscapeBING_v10.safetensors"
                },
                "class_type": "CheckpointLoaderSimple",
                "_meta": {
                    "title": "チェックポイントローダー (シンプル)" //日本語訳
                }
            },
            "5": {
                "inputs": {
                    "width": 720,
                    "height": 1280,
                    "batch_size": 1
                },
                "class_type": "EmptyLatentImage",
                "_meta": {
                    "title": "空の潜在画像" //日本語訳
                }
            },
            "6": {
                "inputs": {
                    "text": "Rocket takes off from the ground, fire,sky, airplane",
                    "clip": [
                        "4",
                        1
                    ]
                },
                "class_type": "CLIPTextEncode",
                "_meta": {
                    "title": "CLIP テキストエンコーダー" //日本語訳
                }
            },
            "7": {
                "inputs": {
                    "text": "",
                    "clip": [
                        "4",
                        1
                    ]
                },
                "class_type": "CLIPTextEncode",
                "_meta": {
                    "title": "CLIP テキストエンコーダー" //日本語訳
                }
            },
            "8": {
                "inputs": {
                    "samples": [
                        "3",
                        0
                    ],
                    "vae": [
                        "4",
                        2
                    ]
                },
                "class_type": "VAEDecode",
                "_meta": {
                    "title": "VAE デコード" //日本語訳
                }
            },
            "9": {
                "inputs": {
                    "filename_prefix": "ComfyUI",
                    "images": [
                        "8",
                        0
                    ]
                },
                "class_type": "SaveImage",
                "_meta": {
                    "title": "画像を保存する" //日本語訳
                }
            },
            "13": {
                "inputs": {
                    "seed": 510424455529432,
                    "steps": 40,
                    "cfg": 2.5,
                    "sampler_name": "euler_ancestral",
                    "scheduler": "karras",
                    "denoise": 1,
                    "model": [
                        "17",
                        0
                    ],
                    "positive": [
                        "16",
                        0
                    ],
                    "negative": [
                        "16",
                        1
                    ],
                    "latent_image": [
                        "16",
                        2
                    ]
                },
                "class_type": "KSampler",
                "_meta": {
                    "title": "Kサンプラー" //日本語訳
                }
            },
            "14": {
                "inputs": {
                    "samples": [
                        "13",
                        0
                    ],
                    "vae": [
                        "18",
                        2
                    ]
                },
                "class_type": "VAEDecode",
                "_meta": {
                    "title": "VAE デコード" //日本語訳
                }
            },
            "15": {
                "inputs": {
                    "filename_prefix": "ComfyUI",
                    "fps": 10,
                    "lossless": false,
                    "quality": 85,
                    "method": "default",
                    "images": [
                        "14",
                        0
                    ]
                },
                "class_type": "SaveAnimatedWEBP",
                "_meta": {
                    "title": "WEBP を保存" //日本語訳
                }
            },
            "16": {
                "inputs": {
                    "width": 512,
                    "height": 768,
                    "video_frames": 35,
                    "motion_bucket_id": 140,
                    "fps": 15,
                    "augmentation_level": 0.15,
                    "clip_vision": [
                        "18",
                        1
                    ],
                    "init_image": [
                        "8",
                        0
                    ],
                    "vae": [
                        "18",
                        2
                    ]
                },
                "class_type": "SVD_img2vid_Conditioning",
                "_meta": {
                    "title": "SVD_Image to Video_Condition" //日本語訳が必要
                }
            },
            "17": {
                "inputs": {
                    "min_cfg": 1,
                    "model": [
                        "18",
                        0
                    ]
                },
                "class_type": "VideoLinearCFGGuidance",
                "_meta": {
                    "title": "Linear CFG Bootstrap" //日本語訳が必要
                }
            },
            "18": {
                "inputs": {
                    "ckpt_name": "svd_xt_image_decoder.safetensors"
                },
                "class_type": "ImageOnlyCheckpointLoader",
                "_meta": {
                    "title": "チェックポイントローダー (イメージのみ)" //日本語訳
                }
            },
            "19": {
                "inputs": {
                    "frame_rate": 10,
                    "loop_count": 0,
                    "filename_prefix": "comfyUI",
                    "format": "video/h264-mp4",
                    "pix_fmt": "yuv420p",
                    "crf": 20,
                    "save_metadata": true,
                    "pingpong": false,
                    "save_output": true,
                    "images": [
                        "14",
                        0
                    ]
                },
                "class_type": "VHS_VideoCombine",
                "_meta": {
                    "title": "ビデオにマージ" //日本語訳
                }
            }
        }
    }

    サンプルの応答:

    {
        "prompt_id": "021ebc5b-e245-4e37-8bd3-00f7b949****",
        "number": 5,
        "node_errors": {}
    }

    応答からプロンプト ID を取得できます。

  3. 推論結果を取得するためのリクエストを送信します。

    cURL

    • HTTP リクエストメソッド: GET

    • リクエスト URL: <service_url>/history/<prompt_id>

    • リクエストヘッダー:

    • ヘッダー

      説明

      Authorization

      <token>

      認証キー

    • サンプルコード:

      curl --location --request GET '<service_url>/history/<prompt_id>' \
           --header 'Authorization: <token>'

      次の表は、主要なパラメーターについて説明しています。

      パラメーター

      説明

      <service_url>

      値をステップ 1 で取得したエンドポイントに置き換えます。エンドポイントの末尾にあるスラッシュ (/) を削除します。例: http://comfyui****.175805416243****.cn-beijing.pai-eas.aliyuncs.com

      <token>

      値をステップ 1 で取得したトークンに置き換えます。例: ZGJmNzcwYjczODE1MmVlNWY1NTNiNGYxNDkzODI****NzU2NTFiOA==

      <prompt_id>

      値をステップ 2 で取得したプロンプト ID に置き換えます。

    Python

    サンプルコード:

    import requests
    
    # リクエストURLを作成します。 // Create the request URL.
    url = "<service_url>/history/<prompt_id>"
    
    session = requests.session()
    session.headers.update({"Authorization":"<token>"})
    
    response = session.get(url=f'{url}')
    
    if response.status_code != 200:
        raise Exception(response.content)
    
    data = response.json()
    print(data)

    次の表は、主要なパラメーターについて説明しています。

    パラメーター

    説明

    <service_url>

    値をステップ 1 で取得したエンドポイントに置き換えます。エンドポイントの末尾にあるスラッシュ (/) を削除します。例: http://comfyui****.175805416243****.cn-beijing.pai-eas.aliyuncs.com

    <token>

    値をステップ 1 で取得したトークンに置き換えます。例: ZGJmNzcwYjczODE1MmVlNWY1NTNiNGYxNDkzODI****NzU2NTFiOA==

    <prompt_id>

    値をステップ 2 で取得したプロンプト ID に置き換えます。

    サンプルレスポンス:

    サンプルレスポンスを表示するにはクリックします

    {
        "130bcd6b-5bb5-496c-9c8c-3a1359a0****": {
            "prompt": ...omitted, // 省略
            "outputs": {
                "9": {
                    "images": [
                        {
                            "filename": "ComfyUI_1712645398_18dba34d-df87-4735-a577-c63d5506a6a1_.png",
                            "subfolder": "",
                            "type": "output"
                        }
                    ]
                },
                "15": {
                    "images": [
                        {
                            "filename": "ComfyUI_1712645867_.webp",
                            "subfolder": "",
                            "type": "output"
                        }
                    ],
                    "animated": [
                        true
                    ]
                },
                "19": {
                    "gifs": [
                        {
                            "filename": "comfyUI_00002.mp4",
                            "subfolder": "",
                            "type": "output",
                            "format": "video/h264-mp4"
                        }
                    ]
                }
            },
            "status": {
                "status_str": "success",
                "completed": true,
                "messages": ...omitted, // 省略
            }
        }
    }
    

    このサンプルレスポンスの outputs セクションには、生成されたイメージ、WEBP ファイル、および MP4 ビデオが提供されています。これらのファイルは、マウントされたストレージの output ディレクトリで名前で検索できます。

非同期呼び出し

API Edition サービスのみが非同期呼び出しをサポートし、呼び出しは api_prompt を使用して送信されます。

  1. 呼び出し方法を表示します。

    API Edition サービスの [サービスの種類] 列で、[呼び出し方法] をクリックします。 [呼び出し方法] パネルの [非同期呼び出し] タブで、サービスエンドポイントとトークンを表示します。image

  2. リクエストを送信します。

    サンプルコード:

    import requests,io,base64
    from PIL import Image, PngImagePlugin
    
    url = "<service_url>"
    session = requests.session()
    session.headers.update({"Authorization":"<token>"})
    
    work_flow = {
        '3': 
        ...omitted  # 省略
      }
    
    for i in range(5):
      payload = work_flow
      response = session.post(url=f'{url}/api_prompt?task_id=txt2img_{i}', json=payload)
      if response.status_code != 200:
        exit(f"send request error:{response.content}") # リクエスト送信エラー
      else:
        print(f"send {i} success, index is {response.content}") # {i} 送信成功、インデックスは {response.content}
    

    次の表に、主要なパラメータを示します。

    パラメータ

    説明

    <service_url>

    値を手順 1 で取得したエンドポイントに置き換えます。エンドポイントの末尾にあるスラッシュ (/) を削除します。例: http://175805416243****.cn-beijing.pai-eas.aliyuncs.com/api/predict/comfyui_api

    <token>

    値を手順 1 で取得したトークンに置き換えます。例: ZTJhM****TBhMmJkYjM3M2U0NjM1NGE3OGNlZGEyZTdjYjlm****Nw==

    work_flow

    リクエスト本文 (ワークフローの JSON ファイルの内容) を設定します。

    重要

    ファイル内のブール値 (True および False) の最初の文字は大文字にする必要があります。

    クリックしてサンプル JSON ファイルを表示する

    {
      "3": {
        "inputs": {
          "seed": 1021224598837526,
          "steps": 40,
          "cfg": 7,
          "sampler_name": "dpmpp_sde_gpu",
          "scheduler": "karras",
          "denoise": 1,
          "model": [
            "4",
            0
          ],
          "positive": [
            "6",
            0
          ],
          "negative": [
            "7",
            0
          ],
          "latent_image": [
            "5",
            0
          ]
        },
        "class_type": "KSampler",
        "_meta": {
          "title": "K サンプラー"  // K sampler
        }
      },
      // ... (以下省略)
    }
  3. 結果をサブスクライブします。

    1. 次のコマンドを実行して、eas_prediction SDK をインストールします。

      pip install eas_prediction  --user
    2. 次のコードを実行して応答を取得します。

      from eas_prediction import QueueClient
      
      sink_queue = QueueClient('<service_domain>', '<service_name>/sink')
      sink_queue.set_token('<token>')
      sink_queue.init()
      
      watcher = sink_queue.watch(0, 5, auto_commit=False)
      for x in watcher.run():
          if 'task_id' in x.tags:
              print('index {} task_id is {}'.format(x.index, x.tags['task_id'])) # インデックス {} task_id は {}
          print(f'index {x.index} data is {x.data}') # インデックス {x.index} データは {x.data}
          sink_queue.commit(x.index)
      

      次の表に、主要なパラメータを示します。

      パラメータ

      説明

      <service_domain>

      値を手順 1 で取得したサービスエンドポイントに置き換えます。例: 139699392458****.cn-hangzhou.pai-eas.aliyuncs.com

      <service_name>

      値を EAS サービスの名前に置き換えます。

      <token>

      値を手順 1 で取得したトークンに置き換えます。

      サンプルレスポンス:

      index 42 task_id is txt2img_0
      index 42 data is b'[{"type": "executed", "data": {"node": "9", "output": {"images": [{"filename": "ComfyUI_1712647318_8e7f3c93-d2a8-4377-92d5-8eb552adc172_.png", "subfolder": "", "type": "output"}]}, "prompt_id": "c3c983b6-f92b-4dd5-b4dc-442db4d1736f"}}, {"type": "executed", "data": {"node": "15", "output": {"images": [{"filename": "ComfyUI_1712647895_.webp", "subfolder": "", "type": "output"}], "animated": [true]}, "prompt_id": "c3c983b6-f92b-4dd5-b4dc-442db4d1736f"}}, {"type": "executed", "data": {"node": "19", "output": {"gifs": [{"filename": "comfyUI_00001.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4"}]}, "prompt_id": "c3c983b6-f92b-4dd5-b4dc-442db4d1736f"}}, {"9": {"images": [{"filename": "ComfyUI_1712647318_8e7f3c93-d2a8-4377-92d5-8eb552adc172_.png", "subfolder": "", "type": "output"}]}, "15": {"images": [{"filename": "ComfyUI_1712647895_.webp", "subfolder": "", "type": "output"}], "animated": [true]}, "19": {"gifs": [{"filename": "comfyUI_00001.mp4", "subfolder": "", "type": "output", "format": "video/h264-mp4"}]}}]'
      // ... (以下省略)
      

      マウントされたストレージの output ディレクトリに推論結果ファイルが表示されます。

その他の使用方法

ComfyUI で独自のワークフローを使用する

ローカルファイルシステムからワークフローを開くには、WebUI ページの左上隅にある[ワークフロー] > [開く]を選択します。

image

カスタムモデルのマウントと ComfyUI プラグインのインストール

カスタムモデルを使用するか、不足しているノード (ComfyUI プラグイン) をインストールするには、サービスに OSS または NAS ストレージをマウントする必要があります。カスタムデプロイを使用する場合は、入力する[コマンド]に --data-dir マウントディレクトリパラメーターも追加する必要があります。詳細については、「方法2: カスタムデプロイ」をご参照ください。サービスをデプロイすると、システムはマウントされた OSS バケットまたは NAS ファイルシステムに、次の図に示すディレクトリ構造を自動的に作成します。

image

ここで:

  • custom_nodes: このディレクトリは、ComfyUI プラグインを保存するために使用されます。

  • models: このディレクトリは、モデルファイルを保存するために使用されます。

そのためには、以下の手順を実行します。

  1. モデルファイルまたはプラグインをアップロードします。 OSS を使用する場合は、「手順 2: ファイルをアップロードする」をご参照ください。

    説明

    GitHub やその他のプラットフォームからコードをプルしたり、インターネットからモデルをダウンロードしたりして、ComfyUI Manager にプラグインを直接インストールすることはお勧めしません。ネットワーク接続が失敗する可能性があります。

    モデルファイルをアップロードする

    マウントされたストレージの models ディレクトリの適切なサブディレクトリにモデルファイルをアップロードします。モデルをアップロードするサブディレクトリを決定するには、対応するノードのオープンソースプロジェクトライブラリの指示を参照してください。例:

    • Checkpoint loader ノードの場合は、models/checkpoints パスにモデルをアップロードする必要があります。

    • スタイルモデルローダーの場合は、models/styles パスにモデルをアップロードする必要があります。

    プラグインをアップロードする

    サードパーティの ComfyUI プラグインは、マウントされたストレージの custom_nodes ディレクトリにアップロードすることをお勧めします。

  2. サービスを再起動します

    モデルまたはプラグインをマウントされたストレージにアップロードした後、モデルまたはプラグインを有効にするには、サービスを再起動する必要があります。 ComfyUI Manager で [再起動] をクリックできます。再起動プロセスには約 5 分かかります。

    image

よくある質問

サービスがスタックする、または ComfyUI がイメージの生成に失敗する場合はどうすればよいですか?

ほとんどの場合、これはリソース仕様がお客様のビジネス要件を満たしていないことが原因です。 サービスイメージとリソース仕様が想定どおりに設定されているか確認してください。 GU30、A10 または T4 GPU タイプを推奨します。 たとえば、コスト効率を確保するために [ml.gu7i.c16m60.1-gu30] を選択できます。

モデルローダーに「undefined」が表示される場合はどうすればよいですか?

モデルローダーの要件に基づいて、モデルディレクトリが正しく設定されているか確認してください。

サービスの実行中にモデルファイルをアップロードした場合、モデルを有効にするにはサービスを再起動してください。

xFormer はどのように画像生成を高速化しますか?

xFormers は Transformer ベースのオープンソース高速化ツールで、画像や動画の生成を効果的に高速化し、GPU 使用率を向上させることができます。デフォルトで、ComfyUI のイメージベースのデプロイメントでは xFormers の高速化が有効になっています。高速化の効果は、ワークフローのサイズによって異なります。GPU によって高速化されるモデル、特に NVIDIA GPU 上で実行されるモデルでは、より高い高速化効果が得られます。

ComfyUI サーバーレス版のデプロイにおける EAS と Function Compute の違い

  • EAS: 長時間実行されるステートフル サービスに適しています。 EAS にデプロイされた ComfyUI の Serverless エディションでは、モデルをオンライン推論サービスまたは AI 搭載 Web アプリケーションとして数クリックでデプロイでき、自動スケーリングやブルーグリーン デプロイメントなどの機能が提供されます。シナリオベースのモデルデプロイメントまたはカスタムデプロイメントを使用して、EAS に ComfyUI をデプロイできます。

  • Function Compute: 高品質の画像生成が必要なサービスに適しています。 Function Compute にデプロイされた ComfyUI の Serverless エディションは、サーバーレスアーキテクチャに基づいており、従量課金制の課金方式を使用します。自動スケーリングなどの機能を提供し、ComfyUI カスタムモデルの使用とプラグインのインストールを可能にします。 Function Compute 3.0 コンソールでアプリケーションを作成し、ComfyUI テンプレートを選択し、構成項目を指定できます。

利用可能なモデルファイルと ComfyUI プラグインを確認するにはどうすればよいですか?

  • デフォルトの ComfyUI ワークフローの場合、対応するノードで利用可能なモデルファイルを確認する必要があります。たとえば、[Checkpoint Loader] のドロップダウンリストで利用可能なモデルファイルを表示できます。

  • WebUI ページを右クリックし、ショートカットメニューから [ノードを追加] を選択して、インストールされているすべての ComfyUI プラグインを表示します。

WebUI ページのデフォルト言語を変更するにはどうすればよいですか?

  1. [Elastic Algorithm Service (EAS)] ページで、呼び出すサービスを見つけ、[サービスの種類] 列の [Web アプリを表示] をクリックします。

  2. WebUI ページで、左下隅にある image をクリックします。

  3. [設定] ダイアログボックスで、次の 2 つの場所で言語を設定します。パラメータを設定したら、ページをリフレッシュして再読み込みします。

    • 左側のナビゲーションウィンドウで、[Comfy] を選択します。右側のエリア設定で、対象言語を設定します。image

    • 左側のナビゲーションウィンドウで、[AGL] を選択します。右側の [ロケール] セクションで、対象言語を設定します。image

参考

  • ComfyUI ベースの API Edition サービスは、非同期キューを使用します。詳細については、「非同期推論サービスをデプロイする」をご参照ください。

  • また、EAS を使用して次の項目をデプロイすることもできます。

    • Web UI または API 操作を使用して呼び出すことができる LLM アプリケーションをデプロイできます。 LLM アプリケーションがデプロイされた後、LangChain フレームワークを使用して企業ナレッジベースを LLM アプリケーションに統合し、インテリジェントな Q&A および自動化機能を実装します。詳細については、「EAS で LLM を迅速にデプロイする」をご参照ください。

    • 特定のナレッジベースに依存する Q&A、要約、およびその他の自然言語処理 ( NLP ) タスクに適した Retrieval-Augmented Generation ( RAG ) ベースの LLM チャットボットをデプロイできます。詳細については、「RAG ベースの LLM チャットボットをデプロイする」をご参照ください。

付録

クラスター版 WebUI サービスの仕組み

次の図に示すように:

  • Cluster Edition WebUI サービスは、マルチユーザー シナリオに適しています。このサービスは、クライアントとバックエンド推論インスタンスを切り離すことで、複数のユーザーが異なる時間にバックエンド推論インスタンスを再利用できるようにします。これにより、インスタンスの使用率が向上し、推論コストが削減されます。

  • プロキシは、クライアント プロセスと推論インスタンスを管理するために使用されます。操作はユーザー プロセスで処理されます。パブリック ディレクトリと個人ディレクトリのファイルのみを管理できます。これにより、チーム メンバーの作業ディレクトリが分離されます。推論インスタンスを使用してリクエストを処理する場合、プロキシはバックエンド推論インスタンスから使用可能なインスタンスを特定して、推論リクエストを処理します。