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

Platform For AI:ComfyUIを使用したAIビデオ生成モデルサービスのデプロイ

最終更新日:Jul 22, 2024

Platform for AI (PAI) のElastic Algorithm Service (EAS) を使用すると、ComfyUIおよびStable video Diffusionモデルに基づくAIビデオ生成サービスを迅速に展開できます。 このサービスを使用して、ソーシャルメディアプラットフォームで短いビデオやアニメーションを生成するなどのタスクを完了できます。 このトピックでは、ComfyUIイメージに基づいてサービスをデプロイする方法と、サービスを呼び出す一般的なメソッドについて説明します。

背景情報

ジェネレーティブAIが注目を集めるにつれて、AIを利用したビデオ生成は人気のあるアプリケーション業界になりました。 ビデオ生成のための多くのオープンソース基礎モデルが市場で入手可能である。 モデルのパフォーマンスと特定のシナリオに基づいて、基礎モデルを選択できます。 生成AI用のノードベースのweb UIツールであるComfyUIは、AIを利用したコンテンツ生成プロセスをワーカーノードに分割して、正確なワークフローのカスタマイズと再現性を実現します。 ComfyUIベースのAIビデオ生成サービスは、次のいずれかのエディションですばやくデプロイできます。

  • Standard Edition: サービスが単一のインスタンスにデプロイされているときに、単一のユーザーがweb UIを使用して、またはAPI操作を使用してサービスを呼び出すシナリオに適しています。 次の呼び出し方法がサポートされています。

    • Web UI: リクエストを送信すると、フロントエンドはリクエストをバックエンドサーバーに転送します。 すべてのリクエストは、同じバックエンドインスタンスによって処理されます。 1つのインスタンスにのみサービスをデプロイすることを推奨します。 サービスが複数のインスタンスにデプロイされており、web UIを使用してサービスを呼び出す場合は、[クラスターエディション] を選択します。

    • API: リクエストを送信すると、リクエストはEASインターフェイスを使用して送信されます。 1つのインスタンスにのみサービスをデプロイすることを推奨します。 サービスが複数のインスタンスにデプロイされており、API操作を使用してサービスを呼び出す場合は、[API Edition] を選択します。

  • API Edition: 同時実行性の高いシナリオに適しています。 システムは、サービスを非同期サービスとして自動的にデプロイします。 このエディションは、API操作を使用したサービス呼び出しのみをサポートします。 システムは、非同期推論サービスインスタンスに加えて、キューサービスインスタンスを作成します。

  • Cluster Edition: 複数のユーザーが同時にweb UIを使用してサービスを呼び出す場合に適しています。 このエディションは、web UIを使用したサービス呼び出しのみをサポートします。 このエディションは、グループ作業のシナリオで使用できます。 システムは、推論クラスタの利用を改善し、コストを削減するために、異なる時間におけるリソースの再利用を可能にする。 システムは、プロキシが推論サービスインスタンスに加えてウェブUIからの要求を処理することを可能にするインスタンスを作成する。 Cluster Editionサービスの仕組みについては、「Cluster Editionサービスの原則」をご参照ください。 Cluster Editionには次の利点があります。

    • システムは、ユーザーごとに個別のバックエンド環境を提供します。 サービスに複数のインスタンスを設定すると、単一のユーザーのタスクが順番に実行され、複数のユーザーのタスクがインスタンス間で分散され、効率的なGPU共有が実現されます。

    • システムは、モデルや生成された画像やビデオなどのファイルの保存と管理を容易にするために、各ユーザーに個別の作業ディレクトリを割り当てます。

手順:

  1. EASでのモデルサービスのデプロイ

    ビジネス要件に基づいてエディションを選択します。

  2. EASサービスを呼び出す

    使用するエディションに基づいて、次のいずれかの方法を選択します。

    • web UIを使用したEASサービスの呼び出し

      web UIを使用してサービス要求を送信します。 このメソッドは、Standard EditionとCluster Editionでサポートされています。

    • EASサービスをオンラインでデバッグする

      EASのオンラインデバッグページで同期サービス要求を送信します。 このメソッドは、Standard Editionでのみサポートされます。

    • API操作を使用したEASサービスの呼び出し

      API操作を使用してサービスリクエストを送信します。 このメソッドは、Standard EditionとAPI Editionでのみサポートされます。 Standard Editionは同期サービス呼び出しをサポートし、API Editionは非同期サービス呼び出しをサポートします。

前提条件

微調整されたモデルをデプロイする前、ComfyUIプラグインをインストールする前、またはAPI操作を使用してサービスを呼び出す前に、Apsara File Storage NAS (NAS) ファイルシステムまたはObject Storage service (OSS) バケットをマウントする必要があります。 これにより、微調整されたモデルとプラグインのアップロードと推論結果の取得が容易になります。 次の操作が完了していることを確認してください。

  • OSSバケットと空のファイルディレクトリが作成されます。 例: oss:// bucket-test/data-oss/ bucket-testはOSSバケットの名前で、data-ossはバケット内の空のディレクトリです。 バケットの作成方法の詳細については、「バケットの作成」をご参照ください。 空のディレクトリを作成する方法の詳細については、「ディレクトリの管理」をご参照ください。

  • NASファイルシステムと空のディレクトリが作成されます。 詳細については、「NASファイルシステムの作成」をご参照ください。

EASでのモデルサービスのデプロイ

次の配置方法がサポートされています。

方法1: シナリオベースのモデル展開 (推奨)

  1. EAS-Online Model Servicesページに移動します。

    1. PAIコンソールにログインします。

    2. 左側のナビゲーションウィンドウで、[ワークスペース] をクリックします。 [ワークスペース] ページで、モデルを配置するワークスペースの名前をクリックします。

    3. 左側のナビゲーションウィンドウで、[モデル展開] > [Elastic Algorithm Service (EAS)] を選択して、[Elastic Algorithm Service (EAS)] ページに移動します。 image

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

  3. [AIビデオ生成: ComfyUIベースのデプロイ] ページで、次のパラメーターを設定します。

    パラメーター

    説明

    基本情報

    サービス名

    モデルサービスの名前。

    エディション

    サービスのエディション。 有効な値:

    • Standard Edition: サービスが単一のインスタンスにデプロイされているときに、単一のユーザーがweb UIを使用して、またはAPI操作を使用してサービスを呼び出すシナリオに適しています。

    • API Edition: 同時実行性の高いシナリオに適しています。 システムは、サービスを非同期サービスとして自動的にデプロイします。 このエディションは、API操作を使用したサービス呼び出しのみをサポートします。

    • Cluster Edition WebUI: 複数のユーザーが同時にweb UIを使用してサービスを呼び出す場合に適しています。 このエディションは、web UIを使用したサービス呼び出しのみをサポートします。 Cluster Editionサービスの仕組みについては、「Cluster Editionサービスの原則」をご参照ください。

    各エディションのシナリオについては、このトピックの「背景情報」をご参照ください。

    モデル設定

    微調整されたモデルをデプロイする場合は、ComfyUIプラグインをインストールするか、API操作を使用してAPI EditionまたはStandard Editionサービスを呼び出す場合は、[追加] をクリックしてモデルを構成します。 これにより、モデルとプラグインのアップロードと推論結果の取得が容易になります。 有効な値:

    • OSSのマウント: imageアイコンをクリックして、既存のOSSディレクトリを選択します。

    • NASのマウント: NASマウントターゲットとNASソースパスを設定します。

    以降の手順で、カスタムモデルとComfyUIプラグインを特定のOSSまたはNASパスにアップロードできます。 詳細については、このトピックの「カスタムモデルとComfyUIプラグインをマウントする方法」を参照してください。

    リソース設定

    インスタンス数

    [Standard Edition] を選択した場合、インスタンス数を1に設定することを推奨します。

    リソース設定

    GU30、A10、またはT4 GPUタイプを使用することを推奨します。 デフォルトでは、GPU-accelerated > ml.gu7i.c16m60.1-gu30インスタンスタイプを使用して費用対効果を確保します。

    説明

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

  4. [デプロイ] をクリックします。

方法2: カスタム展開

  1. EAS-Online Model Servicesページに移動します。

    1. PAIコンソールにログインします。

    2. 左側のナビゲーションウィンドウで、[ワークスペース] をクリックします。 [ワークスペース] ページで、モデルを配置するワークスペースの名前をクリックします。

    3. 左側のナビゲーションウィンドウで、[モデル展開] > [Elastic Algorithm Service (EAS)] を選択して、[Elastic Algorithm Service (EAS)] ページに移動します。 image

  2. [Elastic Algorithm Service (EAS)] ページで、[サービスのデプロイ] をクリックします。 表示されるダイアログボックスで、[カスタムデプロイ] を選択し、[OK] をクリックします。

  3. [サービスのデプロイ] ページで、パラメーターを設定します。 下表に、各パラメーターを説明します。

    パラメーター

    説明

    モデルサービス情報

    サービス名

    サービスの名前です。 この例では、comfyui_svd_demoという名前が使用されています。

    デプロイ方法

    [イメージを使用したWebアプリのデプロイ] を選択します。

    画像の選択

    PAI Imageを選択し、ドロップダウンリストからcomfyui1.3を選択します。 次のパラメータに注意してください。

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

    • x.x.x-api: APIのバージョンを指定します。

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

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

    • 各エディションのシナリオについては、このトピックの「背景情報」をご参照ください。

    モデル設定の指定

    微調整されたモデルをデプロイし、ComfyUIプラグインをインストールするか、API操作を使用してAPI EditionまたはStandard Editionサービスを呼び出す場合は、[モデル設定の指定] をクリックしてモデルとプラグインをアップロードし、推論結果を取得するようにモデルを設定します。 有効な値:

    • OSSパスのマウント

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

      • マウントパス: 値を /code/data-ossに設定します。 OSSファイルディレクトリは、イメージの /code/data-ossパスにマウントされます。

    • マウントNASファイルシステム

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

      • NASソースパス: ファイルが保存されているNASパス。 例: /data-oss

      • マウントパス: 値を /code/data-ossに設定します。 NASファイルシステムのパスは、イメージの /code/data-ossパスにマウントされます。

    以降の手順で、カスタムモデルとComfyUIプラグインを特定のOSSまたはNASパスにアップロードできます。 詳細については、このトピックの「カスタムモデルとComfyUIプラグインをマウントする方法」を参照してください。

    実行するコマンド

    • イメージバージョンを設定すると、システムは自動的にパラメーターを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. [デプロイ] をクリックします。

    [サービスステータス][実行中] の場合、サービスはデプロイされます。

EASサービスを呼び出す

web UIを使用してEASサービスを呼び出す

web UIを使用して、Standard EditionまたはCluster EditionのEASサービスを呼び出すことができます。 Standard Editionサービスでは、すべてのリクエストは同じバックエンドインスタンスによって処理されます。 Cluster Editionサービスは、複数のインスタンス間でリクエストを分散し、グループ作業シナリオに適しています。 以下の手順を実行します。

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

    説明

    web UIにアクセスすると、web UIページの読み込みに約1分かかり、インターフェイスが表示されます。

  2. webアプリケーションインターフェイスでモデル推論を実行します。

    ビジネス要件に基づいて、テキストからイメージへの生成モデルとイメージからビデオへの生成モデルを選択します。 この例では、デフォルト設定を使用します。 [CLIPテキストのエンコード (プロンプト)] セクションに、Rocket take off from the ground, fire, sky, airplaneなどのテキストプロンプトを入力し、[キュープロンプト] をクリックします。 システムはワークフローの実行とビデオの生成を開始します。 85453c9fcadd222fbb087c5acddb6e90.png

  3. 生成されたビデオを右クリックし、[画像の保存] を選択して、生成されたビデオをオンプレミスデバイスに保存します。 image.png

    次のセクションでは、生成されたビデオの例を示します。

EASサービスをオンラインでデバッグする

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

  1. リクエスト本文を生成します。 詳細については、このトピックの「リクエスト本文の生成」をご参照ください。

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

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

    1. [リクエストパラメータオンラインチューニング] セクションの [ボディ] タブで、リクエストボディを入力します。 リクエストURL入力ボックスに /promptと入力します。 image

    2. [リクエストの送信] をクリックし、[デバッグ情報] セクションに予測結果を表示します。 例: image

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

    1. [リクエストパラメータオンラインチューニング] セクションで、ドロップダウンリストから [GET] を選択し、入力ボックスに /history/<prompt id> と入力します。 例: image

      <prompt id> を手順3で取得したプロンプトIDに置き換えます。

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

      推論結果は、マウントされたストレージの出力ディレクトリで確認できます。

API操作を使用してEASサービスを呼び出す

API操作を使用して、Standard EditionまたはAPI Editionサービスを呼び出すことができます。 API呼び出しは、同期および非同期サービス呼び出しをサポートします。

  • 同期呼び出し

    Standard Editionサービスは、同期呼び出しのみをサポートします。 同期リクエストを送信すると、クライアントは実行を一時停止し、結果が返されるのを待ちます。

  • 非同期呼び出し

    API Editionサービスは、非同期呼び出しのみをサポートします。 クライアントはEASのキューサービスを使用して入力キューに要求を送信し、出力キューの推論結果にサブスクライブします。

ComfyUIには非同期キューシステムがあります。 同期呼も非同期的に処理される。 リクエストを送信すると、システムはプロンプトIDを返します。 推論結果をポーリングするには、プロンプトIDを使用する必要があります。

同期呼び出し

  1. API呼び出しに関する情報を表示します。

    1. サービスリストで、Standard Editionサービスの名前をクリックして、[サービスの詳細] ページに移動します。

    2. [基本情報] セクションで、[エンドポイント情報の表示] をクリックします。

    3. [呼び出し方法] ダイアログボックスの [パブリックエンドポイント] タブで、サービスエンドポイントとトークンを取得します。 image

  2. プロンプトIDを取得します。

    1. リクエスト本文を生成します。 詳細については、このトピックの「リクエスト本文の生成」をご参照ください。

    2. プロンプトIDを取得するためのリクエストを送信します。

      次の方法がサポートされています。

      カール

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

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

      • リクエストヘッダー:

        リクエストヘッダー

        説明

        承認

        <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 sampler"
                    }
                },
                "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"
                    }
                },
                "7": {
                    "inputs": {
                        "text": "",
                        "clip": [
                            "4",
                            1
                        ]
                    },
                    "class_type": "CLIPTextEncode",
                    "_meta": {
                        "title": "CLIP text encoder"
                    }
                },
                "8": {
                    "inputs": {
                        "samples": [
                            "3",
                            0
                        ],
                        "vae": [
                            "4",
                            2
                        ]
                    },
                    "class_type": "VAEDecode",
                    "_meta": {
                        "title": "VAE decoding"
                    }
                },
                "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"
                    }
                },
                "14": {
                    "inputs": {
                        "samples": [
                            "13",
                            0
                        ],
                        "vae": [
                            "18",
                            2
                        ]
                    },
                    "class_type": "VAEDecode",
                    "_meta": {
                        "title": "VAE decoding"
                    }
                },
                "15": {
                    "inputs": {
                        "filename_prefix": "ComfyUI",
                        "fps": 10,
                        "lossless": false,
                        "quality": 85,
                        "method": "default",
                        "images": [
                            "14",
                            0
                        ]
                    },
                    "class_type": "SaveAnimatedWEBP",
                    "_meta": {
                        "title": "Save 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": "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"
                    }
                }
            }
        }

      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 sampler"
                  }
              },
              "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"
                  }
              },
              "7": {
                  "inputs": {
                      "text": "",
                      "clip": [
                          "4",
                          1
                      ]
                  },
                  "class_type": "CLIPTextEncode",
                  "_meta": {
                      "title": "CLIP text encoder"
                  }
              },
              "8": {
                  "inputs": {
                      "samples": [
                          "3",
                          0
                      ],
                      "vae": [
                          "4",
                          2
                      ]
                  },
                  "class_type": "VAEDecode",
                  "_meta": {
                      "title": "VAE decoding"
                  }
              },
              "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"
                  }
              },
              "14": {
                  "inputs": {
                      "samples": [
                          "13",
                          0
                      ],
                      "vae": [
                          "18",
                          2
                      ]
                  },
                  "class_type": "VAEDecode",
                  "_meta": {
                      "title": "VAE decoding"
                  }
              },
              "15": {
                  "inputs": {
                      "filename_prefix": "ComfyUI",
                      "fps": 10,
                      "lossless": False,
                      "quality": 85,
                      "method": "default",
                      "images": [
                          "14",
                          0
                      ]
                  },
                  "class_type": "SaveAnimatedWEBP",
                  "_meta": {
                      "title": "Save 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": "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"
                  }
              }
          }
      }

      レスポンス例:

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

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

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

    次の方法がサポートされています。

    カール

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

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

    • リクエストヘッダー:

    • リクエストヘッダー

      説明

      承認

      <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
    
    # 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,
            }
        }
    }
    

    上記の応答では、生成された画像、WEBPファイル、およびMP4ビデオが出力セクションで返されます。 マウントされたストレージの出力ディレクトリにファイル名でファイルがあります。

非同期呼び出し

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

  1. API呼び出しに関する情報を表示します。

    サービスの [サービスタイプ] 列で [呼び出し方法] をクリックします。 [呼び出し方法] ダイアログボックスで、[非同期呼び出し] タブでサービスエンドポイントとトークンを表示します。 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}")

    下表に、各パラメーターを説明します。

    パラメーター

    説明

    <service_url>

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

    <token>

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

    work_flow

    値をワークフローのJSONファイルの内容に設定します。 ワークフロー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 sampler"
        }
      },
      "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"
        }
      },
      "7": {
        "inputs": {
          "text": "",
          "clip": [
            "4",
            1
          ]
        },
        "class_type": "CLIPTextEncode",
        "_meta": {
          "title": "CLIP text encoder"
        }
      },
      "8": {
        "inputs": {
          "samples": [
            "3",
            0
          ],
          "vae": [
            "4",
            2
          ]
        },
        "class_type": "VAEDecode",
        "_meta": {
          "title": "VAE decoding"
        }
      },
      "9": {
        "inputs": {
          "filename_prefix": "ComfyUI",
          "images": [
            "8",
            0
          ]
        },
        "class_type": "SaveImage",
        "_meta": {
          "title": "Save the image"
        }
      },
      "13": {
        "inputs": {
          "seed": 1072245043382649,
          "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"
        }
      },
      "14": {
        "inputs": {
          "samples": [
            "13",
            0
          ],
          "vae": [
            "18",
            2
          ]
        },
        "class_type": "VAEDecode",
        "_meta": {
          "title": "VAE decoding"
        }
      },
      "15": {
        "inputs": {
          "filename_prefix": "ComfyUI",
          "fps": 10,
          "lossless": False,
          "quality": 85,
          "method": "default",
          "images": [
            "14",
            0
          ]
        },
        "class_type": "SaveAnimatedWEBP",
        "_meta": {
          "title": "Save 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": "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"
        }
      }
    }
  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']))
          print(f'index {x.index} data is {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"}]}}]'
      index 43 task_id is txt2img_1
      index 43 data is b'[{"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"}]}}]'
      index 44 task_id is txt2img_2
      index 44 data is b'[{"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"}]}}]'
      index 45 task_id is txt2img_3
      index 45 data is b'[{"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"}]}}]'
      index 46 task_id is txt2img_4
      index 46 data is b'[{"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"}]}}]'

      実装ストレージの出力ディレクトリにある推論結果ファイルを参照できます。

関連ドキュメント

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

  • EASは、次のシナリオベースの展開もサポートしています。

    • EASを使用して数回クリックするだけでLLMをデプロイし、web UIまたはAPI操作を使用してモデルを呼び出すことができます。 LLMをデプロイした後、LangChainフレームワークを使用して、カスタムナレッジベースに接続されたQ&aチャットボットを構築できます。 詳細については、「EASでのオープンソースLLMの迅速なデプロイ」をご参照ください。

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

付録

リクエスト本文の生成

web UIページでビジネス要件に基づいてワークフローを構成し、リクエスト本文を生成する必要があります。 以下の手順を実行します。

  1. [Elastic Algorithm Service (EAS)] ページで、表示するサービスを見つけ、[サービスの種類] 列の [Webアプリの表示] をクリックして、ComfyUIベースのweb UIページに移動します。

    説明

    web UIページの読み込みには、インターフェイスが表示されるまでに約1分かかります。

  2. web UIページで、アイコンをクリックしimageます。 [設定] ダイアログボックスで、[Devモードのオプションを有効にする] を選択します。 image

  3. web UIページで、ビジネス要件に基づいてワークフローを設定します。

    [チェックポイントの読み込み] セクションでモデルを選択したり、[CLIPテキストのエンコード (プロンプト)] セクションでプロンプトを入力したり、サンプラーの設定を調整したりできます。 設定が完了したら、[キュープロンプト] をクリックしてAI生成ビデオを取得します。

  4. ワークフローが期待どおりに機能する場合は、[保存 (API形式)] をクリックしてワークフローのJSONファイルをダウンロードします。 image

    以下の点にご注意ください。

    • 同期呼び出しまたはオンラインデバッグのリクエスト本文では、ダウンロードした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"
                  }
              },
              "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"
                  }
              },
              "7": {
                  "inputs": {
                      "text": "",
                      "clip": [
                          "4",
                          1
                      ]
                  },
                  "class_type": "CLIPTextEncode",
                  "_meta": {
                      "title": "CLIP text encoder"
                  }
              },
              "8": {
                  "inputs": {
                      "samples": [
                          "3",
                          0
                      ],
                      "vae": [
                          "4",
                          2
                      ]
                  },
                  "class_type": "VAEDecode",
                  "_meta": {
                      "title": "VAE decoding"
                  }
              },
              "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"
                  }
              },
              "14": {
                  "inputs": {
                      "samples": [
                          "13",
                          0
                      ],
                      "vae": [
                          "18",
                          2
                      ]
                  },
                  "class_type": "VAEDecode",
                  "_meta": {
                      "title": "VAE decoding"
                  }
              },
              "15": {
                  "inputs": {
                      "filename_prefix": "ComfyUI",
                      "fps": 10,
                      "lossless": false,
                      "quality": 85,
                      "method": "default",
                      "images": [
                          "14",
                          0
                      ]
                  },
                  "class_type": "SaveAnimatedWEBP",
                  "_meta": {
                      "title": "Save 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": "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"
                  }
              }
          }
      }
    • 非同期呼び出しのリクエスト本文では、プロンプトフィールドを指定する必要はありません。 上記のサンプルのリクエスト本文では、ダウンロードしたJSONファイルの内容が使用されています。

Cluster Editionサービスの原則

次の図は、Cluster Editionサービスの動作を示しています。

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

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

イメージ生成の高速化

xFormersは、Transformerに基づくオープンソースのアクセラレーションツールです。 画像とビデオの生成を効果的に加速し、GPU使用率を改善できます。 デフォルトでは、ComfyUIベースのサービス展開に対してxFormersアクセラレーションが有効になっています。

カスタムモデルとComfyUIプラグインをマウントするにはどうすればよいですか?

サービスをデプロイすると、マウントされたOSSバケットまたはNASファイルシステムに次のディレクトリ構造が自動的に作成されます。image

次のパラメータに注意してください。

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

  • models: モデルファイルを格納するディレクトリです。

オープンソースコミュニティからサードパーティのComfyUIプラグインを取得する場合、またはカスタムモデルを生成する場合は、これらのプラグインまたはモデルファイルを指定されたディレクトリに保存して、システムが新しいモデルとプラグインをロードして使用できるようにする必要があります。 以下の手順を実行します。

  1. サービスをデプロイしたら、表示するサービスを見つけて、[サービスの種類] 列の [Webアプリの表示] をクリックします。

  2. web UIページで、使用可能なモデルファイルとComfyUIプラグインのリストを表示します。

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

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

  3. モデルファイルを読み込みます。

    1. マウントされたストレージのmodelsディレクトリのサブディレクトリにモデルファイルをアップロードします。 詳細については、OSSコンソールを使用して開始するトピックの「ファイルのアップロード」セクションをご参照ください。 モデルをアップロードするサブディレクトリを決定するには、対応するノードのオープンソースプロジェクトライブラリの手順を参照してください。 たとえば、Checkpointローダーノードの場合、モデルをmodels/checkpointsパスにアップロードする必要があります。

    2. web UIページで、[更新] をクリックし、[チェックポイントローダー] のドロップダウンリストからモデルファイルが読み込まれているかどうかを確認します。 image

    3. モデルファイルが読み込まれていない場合は、[プロセスの再起動] をクリックしてモデルファイルを再読み込みします。 image

      このプロセスには約5分かかり、その間にサービスは自動的に再起動してサービスを提供します。 サービスの再起動後、web UIページにアクセスして、モデルファイルが読み込まれているかどうかを確認できます。

  4. 次のいずれかの方法を使用して、ComfyUIプラグインを読み込むことができます。

    • (推奨) ComfyUIプラグインをアップロードして読み込みます。

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

      2. web UIページで、[プロセスの再起動] をクリックします。

        このプロセスには約5分かかり、その間にサービスは自動的に再起動してサービスを提供します。 サービスの再起動後、web UIページにアクセスして、プラグインが読み込まれているかどうかを確認できます。

    • Managerに直接プラグインをインストールします。 GitHubプラットフォームからコードを取得すると、ネットワーク接続が失敗することがあります。

      web UIページで、[マネージャー] をクリックします。 ComfyUI Managerダイアログボックスで、ノードをインストールします。 image