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

Platform For AI:安定拡散web UIを使用したAIペイントサービスのデプロイ

最終更新日:Jul 26, 2024

安定した拡散は、高品質で高解像度の画像を生成できる、安定した使いやすい画像生成モデルです。 オープンソースのStable Diffusion WebUIは、Gradioライブラリに基づいて開発されたStable Diffusionモデル用のブラウザインターフェイスであり、さまざまな画像生成ツールを提供します。 Platform for AI (PAI) のElastic Algorithm Service (EAS) は、複数のパラメーターを設定することで、Stable Diffusion WebUIに基づいてモデルサービスを展開できるシナリオベースの展開モードを提供します。 デプロイしたサービスを使用して、モデル推論を実行し、テキストプロンプトに基づいて画像を生成できます。 このトピックでは、Stable Diffusion WebUIサービスをデプロイして呼び出す方法について説明します。 このトピックでは、サービスに関するよくある質問に対する回答も提供します。

背景情報

特徴と利点

EASの配置は次の特徴および利点を提供します:

  • 使いやすさ: すぐに使用できるモデルサービスをEASで展開できます。 EASでは、ビジネス要件に基づいてGPUなどの基盤となるリソースを動的に切り替えることもできます。

  • エンタープライズレベルの機能: フロントエンドおよびバックエンドサービスの個々のメカニズムは、マルチGPUのスケジューリング、ユーザーの分離、および請求書の分割のために複数のユーザーをサポートします。

  • プラグインと最適化: PAIは、Stable Diffusion WebUIのオープンソース版、PAI-Bladeツール、およびFileBrowerプラグインとModelZooプラグインを提供します。 PAI-Bladeツールは、パフォーマンスの最適化に使用されます。 FileBrowserプラグインは、モデルと画像をオンプレミスのクライアントにアップロードしたり、モデルと画像をダウンロードしたりするために使用されます。

エディション

Stable Diffusion WebUIサービスは、次のエディションを提供します。

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

  • Cluster Edition WebUI: 複数のメンバーがweb UIを使用してイメージを生成するグループ作業シナリオに適しています。 システムは、プロキシが推論サービスインスタンスに加えてウェブUIからの要求を処理することを可能にするインスタンスを作成する。 Cluster Editionには次の利点があります。

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

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

  • API Edition: 同時実行性の高いシナリオに適しています。 システムは、サービスを非同期サービスとして自動的にデプロイします。 システムは、非同期推論サービスインスタンスに加えて、キューサービスインスタンスを作成します。

  • Serverless Edition: 中国 (上海) および中国 (杭州) リージョンでのみご利用いただけます。 Serverless Editionサービスのデプロイは無料で提供されます。 サービス呼び出しの期間に基づいて課金されます。 システムは、サービス要求に基づいてサービスを自動的にスケーリングします。 Serverless Editionサービスは、web UIを使用してのみ呼び出すことができます。

手順

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

    ビジネスシナリオに基づいて展開方法を選択します。

  2. モデルサービスの呼び出し

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

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

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

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

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

  3. 拡張機能のためのプラグインのインストール

    PAIは、多様な機能を提供する様々なプラグインを提供する。 web UIページの [拡張機能] タブでプラグインを表示およびインストールできます。

前提条件

  • モデルファイルと生成されたイメージを格納するために、Apsara File Storage NAS (NAS) ファイルシステムまたはObject Storage Service (OSS) バケットが作成されます。

  • API操作を使用してサービスを呼び出す場合は、環境変数を設定する必要があります。 詳細については、「アクセス資格情報の設定」をご参照ください。

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

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

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

この方法は、Standard Edition、API Edition、Cluster Edition、およびServerless Editionに適用できます。 以下の手順を実行します。

  1. Elastic Algorithm Service (EAS) ページに移動します。

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

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

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

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

  3. AI Painting - SD Web UI Deploymentページで、次のパラメーターを設定します。

    パラメーター

    説明

    基本情報

    エディション

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

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

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

    • Cluster Edition WebUI: 複数のユーザーが同時にweb UIを使用してサービスを呼び出すのに適しています。 このエディションは、web UIを使用したサービス呼び出しのみをサポートします。 複数のユーザーが同じStable Diffusion web UIを使用して画像を生成できるようにするには、[Cluster Edition] WebUIを選択します。

    • Serverless Edition: サービスのデプロイは無料です。 サービス呼び出しの期間に基づいて課金されます。 システムは、サービス要求に基づいてサービスを自動的にスケーリングします。 Serverless Editionサービスは、web UIを使用してのみ呼び出すことができます。

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

    モデル設定

    [追加] をクリックして、モデルファイルと生成されたイメージの保存に使用するモデルの保存場所を設定します。 有効な値:

    • OSSのマウント: 既存のOSSバケットを選択します。 NASと比較して、OSSはデータのアップロードとダウンロードに便利で、生成された画像のインターネットアクセスアドレスを生成できます。 ただし、モデルの切り替えと画像の保存の速度は遅くなります。

    • NAS: より高速なモデル切り替えと画像保存をサポートします。 このオプションは、Standard Edition、API Edition、およびCluster Edition WebUIのエディションでのみサポートされています。

      • NASマウントターゲット: 既存のNASファイルシステムとマウントターゲットを選択します。

      • NASソースパス: 値を /に設定します。

    この例では、OSSが使用されています。

    リソース設定

    リソース設定

    このパラメーターは、Standard Edition、API Edition、およびCluster Edition WebUIのエディションでのみサポートされます。

    [GPU] を選択します。 表示される [インスタンスタイプ] リストで、インスタンスタイプを選択します。 コスト効率のためにml.gu7i.c16m60.1-gu30を選択することを推奨します。

    推論の加速

    推論アクセラレーション機能。 有効な値:

    • PAI-Blade: PAI-Bladeは、PAIが提供する汎用推論最適化ツールです。 PAI-Bladeを使用して、トレーニング済みモデルを最適化し、推論パフォーマンスを最適化できます。

    • xFormers: 画像生成を効果的に高速化できるTransformerベースのオープンソース高速化ツールです。

    • 加速なし: 推論アクセラレーション機能は無効です。

    VPC設定 (オプション)

    [VPC]

    [モデル設定][NASのマウント] に設定した場合、NASファイルシステムが存在するVPCに接続されている仮想プライベートクラウド (VPC) が自動的に選択されます。

    vSwitch

    セキュリティグループ名

  4. パラメーターを設定したら、[デプロイ] をクリックします。

方法2: カスタム展開

このメソッドは、Standard Edition、API Edition、およびCluster Edition WebUIのエディションに適用できます。 以下の手順を実行します。

  1. Elastic Algorithm Service (EAS) ページに移動します。

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

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

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

  2. [モデルオンラインサービス (EAS)] ページで、[サービスのデプロイ] をクリックします。 [カスタムモデルのデプロイ] セクションで、[カスタムデプロイ] をクリックします。

  3. [サービスの作成] ページで、次のパラメーターを設定します。

    パラメーター

    説明

    モデルサービス情報

    展開モード

    • Standard EditionまたはCluster Edition WebUIサービスをデプロイするには、[イメージを使用してWebアプリをデプロイ] を選択します。

    • API Editionサービスをデプロイするには、[イメージを使用してサービスをデプロイ] を選択し、[非同期推論サービス] をオンにします。

    画像の選択

    [PAIイメージ] を選択し、ドロップダウンリストからstable-diffusion-webuiと最新バージョンを選択します。

    • x.x-standard: Standard Edition

    • x.x.x-api: API Edition

    • x.x.x-cluster-webui: クラスター版WebUI

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

    • 複数のユーザーが安定拡散WebUIを使用して画像を生成できるようにする場合は、x.x.x-cluster-webuiバージョンを選択します。

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

    モデル設定の指定

    [モデル設定の指定] をクリックして、モデルファイルとモデル推論によって生成されたイメージを保存する場所を設定します。 有効な値:

    • OSSパスのマウント

      • 既存のバケットのOSSパスを選択します。

      • マウントパス: 値を /code/stable-diffusion-webui/dataに設定します。

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

      • NASマウントターゲット: 既存のNASファイルシステムとマウントターゲットを選択します。

      • NASソースパス: 値を /に設定します。

      • マウントパス: 値を /code/stable-diffusion-webui/dataに設定します。

    • マウントPAIモデル

      • PAIモデルとモデルバージョンを選択します。

      • マウントパス: 値を /code/stable-diffusion-webui/dataに設定します。

    この例では、OSSバケットがマウントされています。

    実行するコマンド

    イメージバージョンを設定すると、システムは自動的にコマンドを指定します。

    • モデル設定を構成した後、-- data-dir /code/stable-diffusion-webui/dataパラメーターをコマンドに追加して、データを特定のパスにマウントします。

    • オプションです。 コマンドに -- bladeまたは -- xformersパラメーターを追加して、推論の高速化を有効にすることもできます。 詳細については、このトピックの「サービスを作成するときに設定できるパラメーター」をご参照ください。

    リソース配置情報

    リソース設定

    [GPU] を選択します。 表示される [インスタンスタイプ] リストで、インスタンスタイプを選択します。 コスト効率のためにml.gu7i.c16m60.1-gu30を選択することを推奨します。

    VPC設定

    [VPC]

    [モデル設定][NASのマウント] に設定した場合、NASファイルシステムが存在するVPCに接続されているVPCが自動的に選択されます。

    vSwitch

    セキュリティグループ名

  4. パラメーターを設定したら、[デプロイ] をクリックします。

方法3: JSONデプロイ

JSONスクリプトを使用して、Stable Diffusion WebUIサービスをデプロイできます。 次のセクションでは、JSONを使用してStandard EditionおよびAPI Editionサービスをデプロイする方法について説明します。

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

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

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

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

  2. [Elastic Algorithm Service (EAS)] ページで、[サービスのデプロイ] をクリックします。 [構成エディター] セクションで、[JSONデプロイ] をクリックします。

  3. [JSONデプロイ] ページで、次のコンテンツをJSON形式で設定します。

    Standard Edition

    {
        "metadata": {
            "instance": 1,
            "name": "sd_v32" 、
            "enable_webservice": true
        },
        "containers": [
            {
                "image": "eas-registry-vpc.<regio n>.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:4.2" 、
                "script": "./webui.sh -- listen -- port 8000 -- skip-version-check-no-hashing-no-download-sd-model-skip-prepare-environment-api -- filebrowser -- data-dir=/code/stable-diffusion-webui/data" 、
                "port": 8000
            }
        ],
        "cloud": {
            "computing": {
                "instance_type": "ml.gu7i.c16m60.1-gu30" 、
                "instances": null
            },
            "networking": {
                "vpc_id": "vpc-t4nmd6nebhlwwexk2 ****" 、
                "vswitch_id": "vsw-t4nfue2s10q2i0ae3 ****" 、
                "security_group_id": "sg-t4n85ksesuiq3wez ****"
            }
        },
        "storage": [
            {
                "oss":{
                    "path": "oss:// examplebucket/data-oss" 、
                    "readOnly": false
                },
                "properties": {
                    "resource_type": "model"
                },
                "mount_path": "/code/stable-diffusion-webui/data"
            },
            {
                "nfs": {
                    "path": "/"、
                    "server": "726434 **** -aws0.ap-southeast-1.nas.aliyuncs.com"
                },
                "properties": {
                    "resource_type": "model"
                },
                "mount_path": "/code/stable-diffusion-webui/data"
            }
        ]
    } 

    次の表に、上記のコードのパラメーターを示します。

    パラメーター

    必須

    説明

    metadata.name

    Yes

    カスタムモデルサービスの名前。同じリージョンで一意です。

    containers.image

    Yes

    <region> を現在のリージョンのIDに置き換えます。 たとえば、サービスが中国 (上海) リージョンにデプロイされている場合は、変数をcn-shanghaiに置き換えます。 リージョンIDの詳細については、「リージョンとゾーン」をご参照ください。

    ストレージ

    No

    有効な値:

    • oss: NASと比較して、OSSはデータのアップロードとダウンロードに便利で、生成された画像のインターネットアクセスアドレスを生成できます。 ただし、モデルの切り替えと画像の保存の速度は遅くなります。 storage.oss.pathパラメーターを既存のOSSバケットのパスに設定します。

    • nas: NASは、より高速なモデル切り替えと画像保存をサポートします。 storage.nfs.serverパラメーターを既存のNASファイルシステムに設定します。

    この例では、OSSが使用されています。

    cloud.net働き

    No

    ストレージパラメーターをnasに設定した場合、VPC、vSwitch、およびセキュリティグループのIDを含むVPCを設定する必要があります。 VPCは、汎用NASファイルシステムのVPCと同じである必要があります。

    APIエディション

    {
        "metadata": {
            "name": "sd_async" 、
            "instance": 1,
            "rpc.worker_threads": 1、
            "type": "Async"
        },
        "cloud": {
            "computing": {
                "instance_type": "ml.gu7i.c16m60.1-gu30" 、
                "instances": null
            },
            "networking": {
                "vpc_id": "vpc-bp1t2wukzskw9139n ****" 、
                "vswitch_id": "vsw-bp12utkudylvp4c70 ****" 、
                "security_group_id": "sg-bp11nqxfd0iq6v5g ****"
            }
        },
        "queue": {
            "cpu": 1、
            "max_delivery": 1、
            "メモリ": 4000、
            "resource": ""
        },
        "storage": [
            {
                "oss":{
                    "path": "oss:// examplebucket/aohai-singapore/" 、
                    "readOnly": false
                },
                "properties": {
                    "resource_type": "model"
                },
                "mount_path": "/code/stable-diffusion-webui/data"
            },
            {
                "nfs": {
                    "path": "/"、
                    "server": "0c9624 **** -fgh60.cn-hangzhou.nas.aliyuncs.com"
                },
                "properties": {
                    "resource_type": "model"
                },
                "mount_path": "/code/stable-diffusion-webui/data"
            }
        ],
        "containers": [
            {
                "image": "eas-registry-vpc.<regio n>.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:4.2" 、
                "script": "./webui.sh -- listen -- port 8000-skip-version-check-no-hashing-no-download-sd-model-skip-prepare-environment-api-log-time-log-nowebui-data-dir=/code/stable-diffusion-webui/data" 、
                "port": 8000
            }
        ]
    } 

    次の表では、Standard Editionサービスの展開と構成が異なるパラメーターのみを説明します。

    パラメーター

    説明

    次のパラメータを削除します。

    metadata.enable_webservice

    webserverを無効にするには、このパラメーターを削除します。

    containers.script

    containers.scriptパラメーターに指定されている -- filebrowserオプションを削除し、サービスの起動を高速化します。

    以下のパラメーターを追加します。

    metadata.type

    値をAsyncに設定して、非同期サービスを有効にします。

    metadata.rpc.worker_スレッド

    値を1に設定すると、1つのインスタンスが一度に1つのリクエストのみを処理できるようになります。

    queue.max_delivery

    エラー発生後のリトライを無効にするには、値を1に設定します。

    containers.script

    containers.scriptパラメーターに -- nowebuiオプションと -- time-logオプションを追加して、サービスの起動を高速化し、応答時間をそれぞれ記録します。

    パラメーターの詳細については、このトピックの「Standard Edition」を参照してください。

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

モデルサービスの呼び出し

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

web UIを使用して、Standard Edition、Cluster Edition WebUI、およびServerless Editionのサービスを呼び出すことができます。 以下の手順を実行します。

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

  2. モデル推論を実行します。

    安定拡散WebUIページのtxt2imgタブで、cute dogなどのプロンプトを入力し、[生成] をクリックします。 次の図に、レスポンスのサンプルを示します。

    image

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

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

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

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

同期呼び出し

Standard EditionまたはAPI Editionサービスをデプロイした後、次の手順を実行して同期リクエストを送信できます。

  1. コール情報を取得します。

    1. サービスのデプロイ後、サービス名をクリックして [サービスの詳細] ページに移動します。

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

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

      • API Editionサービスをデプロイする場合は、[同期呼び出し] タブの [パブリックエンドポイント] タブでサービスのエンドポイントとトークンを取得します。 image

      • Standard Editionサービスをデプロイする場合は、[パブリックエンドポイント] タブでサービスのエンドポイントとトークンを取得します。 image

  2. 同期リクエストを送信するには、次のいずれかの方法を使用します。

    cURLコマンドの使用

    サンプルファイル:

    curl --location --request POST '<service_url>/sdapi/v1/txt2img' \
    --header 'Authorization: <token>' \
    --header 'Content-Type: application/json' \
    --data-raw '{
      "prompt":"cut dog ",
      "steps":20
    }'

    上記のコードで次のパラメーターを変更します。

    • <service_url>: 値をステップ1で取得したエンドポイントに置き換えます。 エンドポイントの最後に /を削除します。

    • <token>: このパラメーターを、手順1で取得したトークンに設定します。

    コマンドを実行すると、システムはBase64-encodedイメージを返します。

    Pythonコードの使用

    SD APIにリクエストを送信する方法については、『GitHub project wiki』をご参照ください。

    • 例1 (推奨): OSSバケットをEASサービスにマウントして、生成されたイメージを保存することを推奨します。 次の例では、リクエスト本文でOSSマウントパスを使用してイメージをOSSに保存し、oss2 SDKを使用してイメージをOSSからオンプレミスデバイスにダウンロードします。

      import requests
      import oss2
      from oss2.credentials import EnvironmentVariableCredentialsProvider
      
      # Step 1: Send a request. The generated image is saved to OSS. 
      url = "<service_url>"
      
      # The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations in OSS is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. To create a RAM user, log on to the RAM console. 
      auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
      
      # In this example, the endpoint of the China (Hangzhou) region is used. Specify your actual endpoint. 
      bucket = oss2.Bucket(auth, '<endpoint>', '<examplebucket>')
      
      payload = {
          "alwayson_scripts": {
              "sd_model_checkpoint": "deliberate_v2.safetensors",
              "save_dir": "/code/stable-diffusion-webui/data/outputs"
          },
          "steps": 30,
          "prompt": "girls",
          "batch_size": 1,
          "n_iter": 2,
          "width": 576,
          "height": 576,
          "negative_prompt": "ugly, out of frame"
      }
      
      session = requests.session()
      session.headers.update({"Authorization": "<token>"})
      
      response = session.post(url=f'{url}/sdapi/v1/txt2img', json=payload)
      if response.status_code != 200:
          raise Exception(response.content)
      
      data = response.json()
      
      
      # Step 2: Obtain images from OSS and download the images to your on-premises device. 
      
      # The mount_path configuration for OSS that you specified when you deployed the service. 
      mount_path = "/code/stable-diffusion-webui/data"
      
      # The OSS path that you specified when you deployed the service. 
      oss_url = "oss://examplebucket/data-oss"
      
      for idx, img_path in enumerate(data['parameters']['image_url'].split(',')):
          # Obtain the actual URL of the generated image in OSS. 
          img_oss_path = img_path.replace(mount_path, oss_url)
          print(idx, img_oss_path, url)
      
          # Download the OSS object to an on-premises file system. Replace <examplebucket> with the name of the OSS bucket that you created. 
          bucket.get_object_to_file(img_oss_path[len("oss://examplebucket/"):], f'output-{idx}.png')

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

      パラメーター

      説明

      url

      <service_url> を手順1で取得したエンドポイントに置き換えます。 エンドポイントの最後に /を削除します。

      バケット

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

      • <endpoint> をOSSへのアクセスに使用されるエンドポイントに置き換えます。 たとえば、http://oss-cn-shanghai.aliyuncs.com エンドポイントは中国 (上海) リージョンに使用されます。 サービスが別のリージョンにデプロイされている場合は、実際のエンドポイントを指定します。 詳細については、「リージョンとエンドポイント」をご参照ください。

      • <examplebucket> を、作成したOSSバケットの名前に置き換えます。

      <token>

      このパラメーターを手順1で取得したトークンに設定します。

      mount_path

      サービスのデプロイ時に設定したOSSマウントパス。

      oss_url

      サービスのデプロイ時に設定したOSSストレージパス。

      コードが正常に実行されると、次の結果が返されます。 OSSコンソールに移動し、サービスのデプロイ時にマウントした出力ディレクトリで生成されたイメージを表示できます。

      0 /code/stable-diffusion-webui/data/outputs/txt2img-grids/2024-06-26/grid-093546-9ad3f23e-a5c8-499e-8f0b-6effa75bd04f.png oss://examplebucket/data-oss/outputs/txt2img-grids/2024-06-26/grid-093546-9ad3f23e-a5c8-499e-8f0b-6effa75bd04f.png
      1 /code/stable-diffusion-webui/data/outputs/txt2img-images/2024-06-26/093536-ab4c6ab8-880d-4de6-91d5-343f8d97ea3c-3257304074.png oss://examplebucket/data-oss/outputs/txt2img-images/2024-06-26/093536-ab4c6ab8-880d-4de6-91d5-343f8d97ea3c-3257304074.png
      2 /code/stable-diffusion-webui/data/outputs/txt2img-images/2024-06-26/093545-6e6370d7-d41e-4105-960a-b4739af30c0d-3257304075.png oss://examplebucket/data-oss/outputs/txt2img-images/2024-06-26/093545-6e6370d7-d41e-4105-960a-b4739af30c0d-3257304075.png
    • 例2: イメージをオンプレミスパスに保存します。 次のPythonコードを実行してBase64-encodedイメージを取得し、イメージファイルをオンプレミスディレクトリに保存します。

      import requests
      import io
      import base64
      from PIL import Image, PngImagePlugin
      
      url = "<service_url>"
      
      payload = {
          "prompt": "puppy dog",
          "steps": 20,
          "n_iter": 2
      }
      
      session = requests.session()
      session.headers.update({"Authorization": "<token>"})
      
      
      response = session.post(url=f'{url}/sdapi/v1/txt2img', json=payload)
      if response.status_code != 200:
          raise Exception(response.content)
      
      data = response.json()
      
      # Obtain a Base64-encoded image file. We recommend that you obtain an image URL instead of the Base64-encoded image file, as shown in Example 2. 
      for idx, im in enumerate(data['images']):
          image = Image.open(io.BytesIO(base64.b64decode(im.split(",", 1)[0])))
      
          png_payload = {
              "image": "data:image/png;base64," + im
          }
          resp = session.post(url=f'{url}/sdapi/v1/png-info', json=png_payload)
      
          pnginfo = PngImagePlugin.PngInfo()
          pnginfo.add_text("parameters", resp.json().get("info"))
          image.save(f'output-{idx}.png', pnginfo=pnginfo)
      

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

      • <service_url>: 値を手順1で取得したエンドポイントに置き換えます。 エンドポイントの最後に /を削除します。

      • <token>: このパラメーターを手順1で取得したトークンに設定します。

    リクエストでLoRAおよびControlNetデータを使用して、特定の機能を有効にすることもできます。

    LoRA設定

    loraモデルを使用するには、プロンプトパラメーターに <LoRA: yaeMikoRealistic_Genshin:1000> を追加します。 詳細については、「LORAおよびalwayson_scriptsの例」をご参照ください。

    サンプル要求本文:

    {
      "prompt":"girls <lora:yaeMikoRealistic_Genshin:1>",
      "steps":20,
      "save_images":true
    }

    ControlNet構成

    リクエストにcontrolnetパラメーターを追加して、生成されたイメージに対して、イメージを水平または垂直に保つなどの一般的な操作を実行できます。 詳細については、このトピックの「Example: txt2img with ControlNet」セクションを参照してください。

非同期サービスの呼び出し

API Editionサービスをデプロイした後、非同期リクエストをサービスに送信できます。 クライアントは、出力キュー内の推論結果をサブスクライブします。 以下の手順を実行します。

  1. 呼び出し情報を取得します。

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

  2. 非同期リクエストを送信します。 SDK for PythonまたはSDK for Javaを使用できます。

    重要
    • キューサービスでは、入力キューまたは出力キューのサイズが8 KBを超えないことが必要です。 以下の点にご注意ください。

      • リクエストデータに画像が含まれている場合は、URLを使用して画像データを渡すことを推奨します。 SD WebUIは自動的に画像データをダウンロードして解析します。

      • レスポンスに元の画像データが含まれないようにするには、save_dirパラメーターを使用して、生成された画像を保存するパスを指定することをお勧めします。 詳細については、このトピックの「API操作に設定できるパラメーター」をご参照ください。

    • デフォルトでは、EASはインターネットにアクセスできません。 image_linkパラメーターをインターネットURLに設定した場合、EASが画像にアクセスできるように、必要な設定を完了する必要があります。 詳細については、「ネットワーク接続の設定」および「インターネットアクセスとホワイトリストの設定」をご参照ください。

    方法1: SDK for Python

    サンプルコード:

    import requests
    
    url = "<service_url>"
    session = requests.session()
    session.headers.update({"Authorization": "<token>"})
    
    prompts = ["cute dog", "cute cat", "cute girl"]
    
    for i in range(5):
        p = prompts[i % len(prompts)]
        payload = {
            "prompt": p,
            "steps": 20,
            "alwayson_scripts": {
                "save_dir": "/code/stable-diffusion-webui/data-oss/outputs/txt2img"
            },
        }
        response = session.post(url=f'{url}/sdapi/v1/txt2img?task_id=txt2img_{i}', json=payload)
        if response.status_code != 200:
            exit(f"send request error:{response.content}")
        else:
            print(f"send {p} success, index is {response.content}")
    
    
    for i in range(5):
        p = prompts[i % len(prompts)]
        payload = {
            "prompt": p,
            "steps": 20,
            "alwayson_scripts": {
                "save_dir": "/code/stable-diffusion-webui/data-oss/outputs/img2img",
                "image_link": "https://eas-cache-cn-hangzhou.oss-cn-hangzhou-internal.aliyuncs.com/stable-diffusion-cache/tests/boy.png",
            },
        }
        response = session.post(url=f'{url}/sdapi/v1/img2img?task_id=img2img_{i}', json=payload)
        if response.status_code != 200:
            exit(f"send request error:{response.content}")
        else:
            print(f"send {p} success, index is {response.content}")
    

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

    • <service_url>: 値を手順1で取得したエンドポイントに置き換えます。 エンドポイントの最後に /を削除します。

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

    説明
    • SDK for Pythonを使用して、SD WebUIが提供するAPIエンドポイントにPOSTリクエストを送信できます。 ビジネス要件に基づいてエンドポイントを選択します。

    • サービスにカスタム情報を渡す場合は、URLパラメーターを使用してカスタムタグを指定します。 たとえば、追加できます。? task_id=task_abcという名前のタグを指定するためのリクエストパスtask_id. タグ情報は、tagsパラメーターで指定された結果に含まれます。

    コードが正常に実行されると、次の結果が返されます。 あなたの実際の結果は異なるかもしれません。 image.png

    方法2: SDK for Java

    MavenはJavaプロジェクトの管理に使用されます。 pom.xmlファイルに依存関係としてJava用EAS SDKを追加する必要があります。 詳細については、「SDK For Java」をご参照ください。

    次のサンプルコードは、非同期リクエストの送信方法の例を示しています。

    import com.aliyun.openservices.eas.predict.http.HttpConfig;
    import com.aliyun.openservices.eas.predict.http.QueueClient;
    import com.aliyun.openservices.eas.predict.queue_client.QueueUser;
    import org.apache.commons.lang3.tuple.Pair;
    
    import java.util.HashMap;
    
    public class SDWebuiAsyncPutTest {
        public static void main(String[] args) throws Exception {
            // Create a client for the queue service. 
            String queueEndpoint = "http://166233998075****.cn-hangzhou.pai-eas.aliyuncs.com";
            String queueToken = "xxxxx==";
            // The name of the input queue consists of the service name and the request path that you want to use. 
            String inputQueueName = "<service_name>/sdapi/v1/txt2img";
    
            // Create the input queue. After you add quest data to the input queue, the inference service automatically reads the request data from the input queue. 
            QueueClient inputQueue =
                new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
            // Clear queue data. Proceed with caution. 
            // input_queue.clear();
    
            // Add request data to the input queue. 
            int count = 5;
            for (int i = 0; i < count; ++i) {
                // Create request data. 
                String data = "{\n" +
                    "    \"prompt\": \"cute dog\", \n" +
                    "    \"steps\":20,\n" +
                    "    \"alwayson_scripts\":{\n" +
                    "        \"save_dir\":\"/code/stable-diffusion-webui/data-oss/outputs/txt2img\"\n" +
                    "    }\n" +
                    "  }";
                // Create a custom tag. 
                HashMap<String, String> map = new HashMap<String, String>(1);
                map.put("task_id", "txt2img_" + i);
                Pair<Long, String> entry = inputQueue.put(data.getBytes(), map);
    
                System.out.println(String.format("send success, index is %d, request_id is %s", entry.getKey(), entry.getValue()));
                // The queue service supports multi-priority queues. You can use the put function to set the priority level of the request. The default value is 0. A value of 1 specifies a high priority. 
                //  inputQueue.put(data.getBytes(), 0L, null);
            }
            // Close the client. 
            inputQueue.shutdown();
    
    
            inputQueueName = "<service_name>/sdapi/v1/img2img";
            inputQueue =
                new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
            for (int i = 0; i < count; ++i) {
                // Create request data. 
                String data = "{\n" +
                    "    \"prompt\": \"cute dog\", \n" +
                    "    \"steps\":20,\n" +
                    "    \"alwayson_scripts\":{\n" +
                    "        \"save_dir\":\"/code/stable-diffusion-webui/data-oss/outputs/img2img\",\n" +
                    "        \"image_link\":\"https://eas-cache-cn-hangzhou.oss-cn-hangzhou-internal.aliyuncs.com/stable-diffusion-cache/tests/boy.png\"\n" +
                    "    }\n" +
                    "  }";
                HashMap<String, String> map = new HashMap<String, String>(1);
                map.put("task_id", "img2img_" + i);
                Pair<Long, String> entry = inputQueue.put(data.getBytes(), map);
    
                System.out.println(String.format("send success, index is %d, requestId is %s", entry.getKey(), entry.getValue()));
            }
    
            // Close the client. 
            inputQueue.shutdown();
        }
    }

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

    • queueEndpoint: ステップ1で取得したエンドポイントに値を設定します。 このパラメーターを設定するには、サンプルコードを参照してください。

    • queueToken: ステップ1で取得したトークンに値を設定します。

    • <service_name>: デプロイした非同期サービスの名前に値を設定します。

    説明

    サービスにカスタム情報を渡す場合は、put関数でカスタムタグを指定します。 サンプルコードを参照して、カスタムタグを設定できます。 タグ情報は、tagsパラメータ内の結果に含まれる。

    コードが正常に実行されると、次の結果が返されます。 あなたの実際の結果は異なるかもしれません。

    send success, index is 21, request_id is 05ca7786-c24e-4645-8538-83d235e791fe
    send success, index is 22, request_id is 639b257a-7902-448d-afd5-f2641ab77025
    send success, index is 23, request_id is d6b2e127-eba3-4414-8e6c-c3690e0a487c
    send success, index is 24, request_id is 8becf191-962d-4177-8a11-7e4a450e36a7
    send success, index is 25, request_id is 862b2d8e-5499-4476-b3a5-943d18614fc5
    send success, index is 26, requestId is 9774a4ff-f4c8-40b7-ba43-0b1c1d3241b0
    send success, index is 27, requestId is fa536d7a-7799-43f1-947f-71973bf7b221
    send success, index is 28, requestId is e69bdd32-5c7b-4c8f-ba3e-e69d2054bf65
    send success, index is 29, requestId is c138bd8f-be45-4a47-a330-745fd1569534
    send success, index is 30, requestId is c583d4f8-8558-4c8d-95f7-9c3981494007
    
    Process finished with exit code 0

    で終了したプロセス

  3. 非同期リクエストの結果を購読します。

    サーバーが関連する要求の処理を完了した後、サーバーは効率的な非同期通信のために結果をクライアントに自動的にプッシュします。 SDK for PythonまたはSDK for Javaを使用して、結果をサブスクライブできます。

    方法1: SDK for Python

    サンプルコード:

    import json
    import oss2
    
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    from eas_prediction import QueueClient
    
    sink_queue = QueueClient('139699392458****.cn-hangzhou.pai-eas.aliyuncs.com', 'sd_async/sink')
    sink_queue.set_token('<token>')
    sink_queue.init()
    
    mount_path = "/code/stable-diffusion-webui/data-oss"
    oss_url = "oss://<examplebucket>/aohai-singapore"
    # The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations in OSS is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. To create a RAM user, log on to the RAM console. 
    auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
    # In this example, the endpoint of the China (Hangzhou) region is used. Specify your actual endpoint. 
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<examplebucket>')
    
    
    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)
        try:
            data = json.loads(x.data.decode('utf-8'))
            for idx, path in enumerate(data['parameters']['image_url'].split(',')):
                url = path.replace(mount_path, oss_url)
                # Download the OSS object to an on-premises file system. 
                bucket.get_object_to_file(url[len("oss://<examplebucket>/"):], f'{x.index}-output-{idx}.png')
                print(f'save {url} to {x.index}-output-{idx}.png')
        except Exception as e:
            print(f'index {x.index} process data error {e}')
    

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

    パラメーター

    説明

    sink_queue

    • 139699392458 **** .cn-hangzhou.pai-eas.aliyuncs.comを、サンプルコードに示す形式で前の手順で取得したエンドポイントに置き換えます。

    • sd_asyncを、サンプルコードに示す形式でデプロイした非同期サービスの名前に置き換えます。

    <token>

    ステップ1で取得したサービストークンに値を設定します。

    oss_url

    サービスのデプロイ時に指定したOSSパスに値を設定します。

    バケット

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

    • OSSへのアクセスに使用されるエンドポイントを使用します。 この例では、http://oss-cn-hangzhou.aliyuncs.com は中国 (杭州) リージョンに使用されます。 サービスが別のリージョンにデプロイされている場合は、実際の状況に基づいてパラメーターを設定します。 詳細については、「リージョンとエンドポイント」をご参照ください。

    • <examplebucket> を、作成したOSSバケットの名前に置き換えます。

    説明
    • データを手動でコミットするか、auto_commitパラメーターをtrueに設定してデータを自動的にコミットできます。

    • キューサービスのクライアントがデータの消費を停止した場合は、クライアントを閉じてリソースを解放することを推奨します。

    • cURLコマンドを実行するか、API操作を呼び出して結果をサブスクライブすることもできます。 詳細については、「非同期推論とキューサービス」をご参照ください。

    クライアントは、watcher.ru n() メソッドを使用して、サーバーからの結果を継続的にリッスンします。 サーバーが結果を返さない場合、クライアントは待機し続けます。 サーバーが結果を返すと、クライアントは結果を印刷します。 コードが正常に実行されると、次の結果が返されます。 実際の結果は異なる場合があります。 OSSコンソールに移動し、サービスのデプロイ時に指定したOSSパスで生成されたイメージを表示できます。

    index 1 task_id is txt2img_0
    index 1 data is b'{"images":[],"parameters":{"id_task":null,"status":0,"image_url":"/code/stable-diffusion-webui/data/outputs/txt2img/txt2img-images/2024-07-01/075825-a2abd45f-3c33-43f2-96fb-****50329671-1214613912.png","seed":"1214613912","error_msg":"","image_mask_url":""},"info":"{\\"hostname\\": \\"***-8aff4771-5c86c8d656-hvdb8\\"}"}'
    save oss://examplebucket/xx/outputs/txt2img/txt2img-images/2024-07-01/075825-a2abd45f-3c33-43f2-96fb-****50329671-1214613912.png to 1-output-0.png
    index 2 task_id is txt2img_1
    index 2 data is b'{"images":[],"parameters":{"id_task":null,"status":0,"image_url":"/code/stable-diffusion-webui/data/outputs/txt2img/txt2img-images/2024-07-01/075827-c61af78c-25f2-47cc-9811-****aa51f5e4-1934284737.png","seed":"1934284737","error_msg":"","image_mask_url":""},"info":"{\\"hostname\\": \\"***-8aff4771-5c86c8d656-hvdb8\\"}"}'
    save oss://examplebucket/xx/outputs/txt2img/txt2img-images/2024-07-01/075827-c61af78c-25f2-47cc-9811-****aa51f5e4-1934284737.png to 2-output-0.png
    index 3 task_id is txt2img_2
    index 3 data is b'{"images":[],"parameters":{"id_task":null,"status":0,"image_url":"/code/stable-diffusion-webui/data/outputs/txt2img/txt2img-images/2024-07-01/075829-1add1f5c-5c61-4f43-9c2e-****9d987dfa-3332597009.png","seed":"3332597009","error_msg":"","image_mask_url":""},"info":"{\\"hostname\\": \\"***-8aff4771-5c86c8d656-hvdb8\\"}"}'
    save oss://examplebucket/xx/outputs/txt2img/txt2img-images/2024-07-01/075829-1add1f5c-5c61-4f43-9c2e-****9d987dfa-3332597009.png to 3-output-0.png
    index 4 task_id is txt2img_3
    index 4 data is b'{"images":[],"parameters":{"id_task":null,"status":0,"image_url":"/code/stable-diffusion-webui/data/outputs/txt2img/txt2img-images/2024-07-01/075832-2674c2d0-8a93-4cb5-9ff4-****46cec1aa-1250290207.png","seed":"1250290207","error_msg":"","image_mask_url":""},"info":"{\\"hostname\\": \\"***-8aff4771-5c86c8d656-hvdb8\\"}"}'
    save oss://examplebucket/xx/outputs/txt2img/txt2img-images/2024-07-01/075832-2674c2d0-8a93-4cb5-9ff4-****46cec1aa-1250290207.png to 4-output-0.png
    index 5 task_id is txt2img_4
    index 5 data is b'{"images":[],"parameters":{"id_task":null,"status":0,"image_url":"/code/stable-diffusion-webui/data/outputs/txt2img/txt2img-images/2024-07-01/075834-8bb15707-ff0d-4dd7-b2da-****27717028-1181680579.png","seed":"1181680579","error_msg":"","image_mask_url":""},"info":"{\\"hostname\\": \\"***-8aff4771-5c86c8d656-hvdb8\\"}"}'
    save oss://examplebucket/xx/outputs/txt2img/txt2img-images/2024-07-01/075834-8bb15707-ff0d-4dd7-b2da-****27717028-1181680579.png to 5-output-0.png

    に保存

    方法2: SDK for Java

    サンプルコード:

    import com.aliyun.openservices.eas.predict.http.HttpConfig;
    import com.aliyun.openservices.eas.predict.http.QueueClient;
    import com.aliyun.openservices.eas.predict.queue_client.DataFrame;
    import com.aliyun.openservices.eas.predict.queue_client.QueueUser;
    import com.aliyun.openservices.eas.predict.queue_client.WebSocketWatcher;
    
    public class SDWebuiAsyncWatchTest {
        public static void main(String[] args) throws Exception {
            // Create a client for the queue service. 
            String queueEndpoint = "http://166233998075****.cn-hangzhou.pai-eas.aliyuncs.com";
            String queueToken = "xxxxx==";
            // The name of the output queue consists of the service name and "/sink". 
            String sinkQueueName = "<service_name>/sink";
    
            // The output queue. The inference service processes the input data and writes the results to the output queue. 
            QueueClient sinkQueue =
                new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser());
    
            // Clear queue data. Proceed with caution. 
            //  sinkQueue.clear();
    
            // Subscribe to the queue and obtain the results. 
            WebSocketWatcher watcher = sinkQueue.watch(0L, 5L, false, false, null);
            try {
                while (true) {
                    DataFrame df = watcher.getDataFrame();
                    if (df.getTags().containsKey("task_id")) {
                        System.out.println(String.format("task_id = %s", df.getTags().get("task_id")));
                    }
                    System.out.println(String.format("index = %d, data = %s, requestId = %s", df.getIndex(), new String(df.getData()), df.getTags().get("requestId")));
                    sinkQueue.commit(df.getIndex());
                }
            } catch (Exception e) {
                System.out.println("watch error:" + e.getMessage());
                e.printStackTrace();
                watcher.close();
            }
    
            // Close the client. 
            sinkQueue.shutdown();
        }
    }

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

    • queueEndpoint: ステップ1で取得したエンドポイントに値を設定します。 このパラメーターを設定するには、サンプルコードを参照してください。

    • queueToken: ステップ1で取得したトークンに値を設定します。

    • <service_name>: デプロイした非同期サービスの名前に値を設定します。

    説明
    • データを手動でコミットするか、auto_commitパラメーターをtrueに設定してデータを自動的にコミットできます。

    • キューサービスのクライアントがデータの消費を停止した場合は、クライアントを閉じてリソースを解放することを推奨します。

    • cURLコマンドを実行するか、API操作を呼び出して結果をサブスクライブすることもできます。 詳細については、「非同期推論とキューサービス」をご参照ください。

    クライアントは、watcher.getDataFrame() メソッドを使用して、サーバーからの結果を継続的にリッスンします。 サーバーが結果を返さない場合、クライアントは待機し続けます。 サーバーが結果を返すと、クライアントは結果を印刷します。 コードが正常に実行されると、次の結果が返されます。 実際の結果は異なる場合があります。 OSSコンソールに移動し、サービスのデプロイ時に指定したOSSパスで生成されたイメージを表示できます。

    2023-08-04 16:17:31,497 INFO [com.aliyun.openservices.eas.predict.queue_client.WebSocketWatcher] - WebSocketClient Successfully Connects to Server: 1396993924585947.cn-hangzhou.pai-eas.aliyuncs.com/116.62.XX.XX:80
    task_id = txt2img_0
    index = 21, data = {"images":[],"parameters":{"id_task":null,"status":0,"image_url":"/code/stable-diffusion-webui/data-oss/outputs/txt2img/txt2img-images/2023-08-04/54363a9d-24a5-41b5-b038-2257d43b8e79-412510031.png","seed":"412510031","error_msg":"","total_time":2.5351321697235107},"info":""}, requestId = 05ca7786-c24e-4645-8538-83d235e791fe
    task_id = txt2img_1
    index = 22, data = {"images":[],"parameters":{"id_task":null,"status":0,"image_url":"/code/stable-diffusion-webui/data-oss/outputs/txt2img/txt2img-images/2023-08-04/0c646dda-4a53-43f4-97fd-1f507599f6ae-2287341785.png","seed":"2287341785","error_msg":"","total_time":2.6269655227661133},"info":""}, requestId = 639b257a-7902-448d-afd5-f2641ab77025
    task_id = txt2img_2
    index = 23, data = {"images":[],"parameters":{"id_task":null,"status":0,"image_url":"/code/stable-diffusion-webui/data-oss/outputs/txt2img/txt2img-images/2023-08-04/4d542f25-b9cc-4548-9db2-5addd0366d32-1158414078.png","seed":"1158414078","error_msg":"","total_time":2.6604185104370117},"info":""}, requestId = d6b2e127-eba3-4414-8e6c-c3690e0a487c
    task_id = txt2img_3

    非同期リクエストを送信して結果をサブスクライブした後、search() メソッドを使用してリクエストのステータスを照会できます。 詳細については、「SDK For Python」および「SDK for Java」をご参照ください。

EASは、SD WebUI APIの上に追加のパラメータを提供します。 これらのパラメーターを設定して、高度な機能を使用し、カスタムビジネス要件を満たすことができます。 詳細については、このトピックの「API操作に設定できるパラメーター」をご参照ください。

拡張機能のインストール

Stable Diffusion WebUIの拡張機能を設定して、さまざまな機能を有効にできます。 PAIは、プロンプトを展開および研磨するために使用されるBeautifulPrompt拡張など、さまざまなプリセット拡張機能を提供します。 次のセクションでは、BeautifulPrompt拡張機能を例として使用して、拡張機能をインストールおよび使用する方法を説明します。

Install the extension

拡張機能は、web UIページの [拡張機能] タブで表示およびインストールできます。 以下の手順を実行します。

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

  2. web UIページの [拡張機能] タブで、BeautifulPromptが選択されているかどうかを確認します。 拡張機能が選択されていない場合は、BeautifulPromptの前にあるチェックボックスをオンにし、[UIの適用と再起動] をクリックしてBeautifulPrompt拡張機能を読み込みます。 image

    拡張機能をインストールすると、web UIが自動的に再起動します。 拡張機能をリロードした後、モデル推論を実行して効果を確認できます。

推論に拡張機能を使用

  1. BeautifulPromptタブで、フィールドに簡単なプロンプトを入力し、[生成] をクリックして詳細なプロンプトを生成します。 image

    PAIは、複数のプロンプト生成モデルを提供する。 各モデルによって生成されるプロンプトは異なります。 ここで:

    • pai-bloom-1b1-text2prompt-sd-v2: 複雑なシナリオでプロンプトを生成するのに適しています。

    • pai-bloom-1b1-text2prompt-sd: 単一のオブジェクトを記述するプロンプトの生成に適しています。

    ビジネス要件に基づいてモデルを選択できます。 image

  2. 使用するプロンプトを選択し、生成されたプロンプトの横にあるtxt2imgをクリックします。

    txt2imgタブが表示され、選択したプロンプトが自動的に指定されます。 image

  3. [生成] をクリックして、web UIページの右側に画像を生成します。 image

    BeautifulPromptは、画質を向上させ、画像に詳細を追加するのに役立ちます。 次の表では、BeautifulPrompt拡張機能を使用する前後の効果を比較しています。

    入力するプロンプト

    BeautifulPromptなし

    BeautifulPrompt付き

    image.png

    image.png

    巨大な虎

    image.png

    image.png

よくある質問

モデルと出力ディレクトリの使用方法?

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

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

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

  • 推論リクエストを送信すると、APIコードのプリセット設定に基づいて、このディレクトリに結果ファイルが自動的に生成されます。

新しいモデルをロードして使用するには、オープンソースコミュニティからダウンロードした、または上記の指定したディレクトリでトレーニングしたLoRAまたはStable Diffusionモデルを保存します。 以下の手順を実行します。

  1. モデルファイルをmodelsディレクトリのサブディレクトリにアップロードします。 詳細については、OSSコンソールを使用して開始するトピックの「オブジェクトのアップロード」セクションをご参照ください。

  2. [Elastic Algorithm Service (EAS)] ページで、管理するサービスを見つけ、[操作] 列の image/> [サービスの再起動] をクリックします。 サービスの再起動後、設定が有効になります。

  3. 安定拡散web UIページで、モデルを切り替えてモデル推論を実行します。

    image

サービスが長期間フリーズした場合はどうすればよいですか?

  • Stable Diffusion webアプリケーションページを再度開くか、EASサービスを再起動できます。 以下の手順を実行します。

    • 管理するサービスを見つけ、[サービスの種類] 列の [Webアプリの表示] をクリックして、webアプリケーションページを再度開きます。

    • サービスの [操作] 列で image/> [サービスの再起動] をクリックして、EASサービスを再起動します。

  • 問題が解決しない場合、サービスはインターネットからモデルまたはプラグインをダウンロードする必要があります。 デフォルトでは、EASはインターネットに接続されていません。 イメージをロードしたり、モデルをオフラインでマウントしたりできます。 ただし、特定のプラグインをダウンロードするにはインターネット接続が必要な場合があります。 この場合、サービスログを表示してモデルまたはプラグインのダウンロードパスを見つけ、モデルをダウンロードしてから、モデルをOSSにアップロードしてマウントすることを推奨します。 詳細については、「」をご参照ください。モデルと出力ディレクトリの使用方法?. インターネット接続が必要な場合は、ネットワーク設定を行うことができます。 詳細については、「ネットワーク接続の設定」および「インターネットアクセスとホワイトリストの設定」をご参照ください。

webアプリケーションインターフェースのデフォルト言語を英語に変更するにはどうすればよいですか?

  1. web UIページで、[設定] をクリックします。

  2. 左側のナビゲーションウィンドウで、[アプリケーション] をクリックします。 本地ページの下部で、を選択します。

  3. Stable Diffusion WebUIページの上部で、[保定] をクリックし、[重] をクリックします。

    webアプリケーションインターフェイスを更新します。 ページは英語で表示されます。

ファイルシステムの管理方法?

Standard Edition、API Edition、またはCluster Edition WebUIのサービスをデプロイすると、-- filebrowserパラメーターが自動的にコマンドに追加されます。 web UIを使用して、ファイルシステムを直接管理できます。 以下の手順を実行します。

  1. サービスのデプロイ後、[サービスタイプ] 列の [Webアプリの表示] をクリックします。

  2. web UIページで、[FileBrowser] タブをクリックします。 ファイルシステムを表示したり、オンプレミスのファイルをファイルシステムにアップロードしたり、オンプレミスのコンピューターにファイルをダウンロードしたりできます。

    image

サービスを作成するときにどのようなパラメータを設定できますか?

  • 共通パラメーター

    パラメーター

    説明

    使用上の注意

    -- 刃

    PAI-Bladeを有効にしてイメージ生成を加速します。

    この機能を有効にすることを推奨します。

    -- filebrowser

    モデルまたは画像をアップロードおよびダウンロードできます。

    デフォルトでは、この機能は有効になっています。

    -- data-dir /code/stable-diffusion-webui/data-oss

    永続ストレージのマウントに使用されるパス。

    デフォルトのパスは /code/stable-diffusion-webui/ です。 相対パスを使用することもできます。

    -- api

    web UIのAPI呼び出しモード。

    デフォルトでは、この機能は有効になっています。

    -- enable-nsfw-censor

    デフォルトで、この機能は無効化されています。 セキュリティコンプライアンスが必要な場合は、コンテンツモデレーション機能を有効にできます。

    ビジネス要件に基づいて機能を有効にします。

    -常に-非表示-タブ

    特定のタブを非表示にします。

    ビジネス要件に基づいて機能を有効にします。

    -- min-ram-reserved 40 -- sd-dynamic-cache

    安定拡散モデルをメモリにキャッシュします。

    非該当

  • Cluster Editionパラメーター

    説明

    ckptおよびControlNetモデルは、パブリックディレクトリ内のファイルとカスタムファイルを自動的にロードします。

    パラメーター

    説明

    使用上の注意

    -- lora-dir

    パブリックLoRAモデルディレクトリを指定します。 例: -- lora-dir /code/stable-diffusion-webui/data-oss/models/Lora

    デフォルトでは、このパラメーターは設定されていません。 ユーザーのすべてのLoRAディレクトリが分離され、ユーザーフォルダー内のLoRAモデルのみがロードされます。 ディレクトリを指定すると、すべてのユーザーがパブリックディレクトリにLoRAモデルを読み込み、ユーザーフォルダーにLoRAモデルを読み込みます。

    -- vae-dir

    パブリックVariational Autoencoder (VAE) モデルディレクトリを指定します。 例: -- vae-dir /code/stable-diffusion-webui/data-oss/models/VAE

    デフォルトでは、このパラメーターは設定されていません。 ユーザーのすべてのVAEディレクトリは分離され、ユーザーフォルダー内のVAEモデルのみがロードされます。 ディレクトリを指定すると、すべてのユーザーがパブリックディレクトリにVAEモデルを読み込みます。

    -- gfpgan-dir

    パブリックGFPGANモデルディレクトリを指定します。 例: -- gfpgan-dir /code/stable-diffusion-webui/data-oss/models/GFPGAN

    デフォルトでは、このパラメーターは設定されていません。 ユーザーのすべてのGFPGANディレクトリが分離され、ユーザーフォルダー内のGFPGANモデルのみがロードされます。 ディレクトリを指定すると、すべてのユーザーがGFPGANモデルをパブリックディレクトリに読み込みます。

    -- embeddings-dir

    パブリック埋め込みモデルディレクトリを指定します。 例: -- embedings-dir /code/stable-diffusion-webui/data-oss /embedings

    デフォルトでは、このパラメーターは設定されていません。 ユーザーの埋め込みディレクトリはすべて分離され、ユーザーフォルダー内の埋め込みモデルのみが読み込まれます。 ディレクトリを指定すると、すべてのユーザーがパブリックディレクトリに埋め込みモデルを読み込みます。

    -- hypernetwork-dir

    パブリックハイパーネットワークモデルディレクトリを指定します。 例: -- hypernetwork-dir /code/stable-diffusion-webui/data-oss/models/hypernetworks

    デフォルトでは、このパラメーターは設定されていません。 ユーザーのすべてのハイパーネットワークディレクトリは分離され、ユーザーフォルダ内の埋め込みモデルのみがロードされます。 ディレクトリを指定すると、すべてのユーザーがパブリックディレクトリにハイパーネットワークモデルを読み込みます。

    -- root-extensions

    拡張ディレクトリをパブリックディレクトリとして使用します。 このパラメーターを設定すると、すべてのユーザーが同じ拡張機能を表示できます。

    拡張機能を集中的にインストールまたは管理する場合は、このパラメーターを使用します。

API操作にはどのようなパラメータを設定できますか?

EASは、SD WebUI APIの上に追加のパラメータを提供します。 これらのパラメーターを設定して、高度な機能を使用し、カスタムビジネス要件を満たすことができます。

  • SDモデル、VAEモデル、および生成された画像を保存するパスを設定します。

  • URLパラメーターを使用して、ステータスコードが返されるリクエストを送信します。

  • ControlNetによって処理される画像を含む、URLを使用して生成された画像にアクセスします。

サンプルコード:

例: txt2img

サンプル要求本文:

{
      "alwayson_scripts": {
          "sd_model_checkpoint": "deliberate_v2.safetensors",  
          "save_dir": "/code/stable-diffusion-webui/data-oss/outputs",
          "sd_vae": "Automatic"
      },
      "steps": 20,
      "prompt": "girls",          
      "batch_size": 1,                                            
      "n_iter": 2,                                                 
      "width": 576, 
      "height": 576,
      "negative_prompt": "ugly, out of frame"
  }

パラメーター:

  • sd_model_checkpoint: 使用するSDモデル。 SDモデルは自動的に基礎モデルに切り替えることができます。

  • sd_vae: 使用するVAEモデル。

  • save_dir: 生成されたイメージを保存するパス。

同期リクエストのサンプル:

# Sample asynchronous request: 

curl --location --request POST '<service_url>/sdapi/v1/txt2img' \
--header 'Authorization: <token>' \
--header 'Content-Type: application/json' \
--data-raw '{
      "alwayson_scripts": {
          "sd_model_checkpoint": "deliberate_v2.safetensors",
          "save_dir": "/code/stable-diffusion-webui/data-oss/outputs",
          "sd_vae": "Automatic"
      },
      "prompt": "girls",          
      "batch_size": 1,                                            
      "n_iter": 2,                                                 
      "width": 576, 
      "height": 576,
      "negative_prompt": "ugly, out of frame"
  }'

同期リクエストに対するサンプル応答:

{
  "images": [],
  "parameters": {
    "id_task": "14837",
    "status": 0,
    "image_url": "/code/stable-diffusion-webui/data-oss/outputs/txt2img-grids/2023-07-24/grid-29a67c1c-099a-4d00-8ff3-1ebe6e64931a.png,/code/stable-diffusion-webui/data-oss/outputs/txt2img-images/2023-07-24/74626268-6c81-45ff-90b7-faba579dc309-1146644551.png,/code/stable-diffusion-webui/data-oss/outputs/txt2img-images/2023-07-24/6a233060-e197-4169-86ab-1c18adf04e3f-1146644552.png",
    "seed": "1146644551,1146644552",
    "error_msg": "",
    "total_time": 32.22393465042114
  },
  "info": ""
}

非同期リクエストのサンプル:

# Send the request data to the input queue. 
curl --location --request POST '<service_url>/sdapi/v1/txt2img' \
--header 'Authorization: <token>' \
--header 'Content-Type: application/json' \
--data-raw '{
    "alwayson_scripts": {
        "sd_model_checkpoint": "deliberate_v2.safetensors",
        "id_task": "14837",
        "uid": "123",
        "save_dir": "tmp/outputs"
    },
    "prompt": "girls",
    "batch_size": 1,
    "n_iter": 2,
    "width": 576,
    "height": 576,
    "negative_prompt": "ugly, out of frame"
}'

例: img2img

サンプル要求本文:

{
    "alwayson_scripts": {
        "image_link":"https://eas-cache-cn-hangzhou.oss-cn-hangzhou-internal.aliyuncs.com/stable-diffusion-cache/tests/boy.png",
        "sd_model_checkpoint": "deliberate_v2.safetensors",
        "sd_vae": "Automatic",
        "save_dir": "/code/stable-diffusion-webui/data-oss/outputs"
    },
    "prompt": "girl",
    "batch_size": 1,                                            
    "n_iter": 2,                                                 
    "width": 576, 
    "height": 576,
    "negative_prompt": "ugly, out of frame",
    "steps": 20, # Sampling steps
    "seed": 111,   
    "subseed": 111, # Variation seed
    "subseed_strength": 0, # Variation strength
    "seed_resize_from_h": 0, # Resize seed from height
    "seed_resize_from_w": 0, # Resize seed from width
    "seed_enable_extras": false, # Extra
    "sampler_name": "DDIM", # Sampling method
    "cfg_scale": 7.5, # CFG Scale
    "restore_faces": true, # Restore faces
    "tiling": false, # Tiling
    "init_images": [], # image base64 str, default None
    "mask_blur": 4, # Mask blur
    "resize_mode": 1, # 0 just resize, 1 crop and resize, 2 resize and fill, 3 just resize
    "denoising_strength": 0.75, # Denoising strength
    "inpainting_mask_invert": 0, #int, index of ['Inpaint masked', 'Inpaint not masked'], Mask mode
    "inpainting_fill": 0, #index of ['fill', 'original', 'latent noise', 'latent nothing'], Masked content
    "inpaint_full_res": 0, # index of ["Whole picture", "Only masked"], Inpaint area
    "inpaint_full_res_padding": 32, #minimum=0, maximum=256, step=4, value=32, Only masked padding, pixels
    #"image_cfg_scale": 1, # resized by scale
    #"script_name": "Outpainting mk2", # The name of the script. Skip this field if you do not use a script.
    #"script_args": ["Outpainting", 128, 8, ["left", "right", "up", "down"], 1, 0.05] # The parameters of the script in the following order: fixed fields, pixels, mask_blur, direction, noise_q, and color_variation.
}

レスポンス例:

{
    "images":[],
    "parameters":{
        "id_task":"14837",
        "status":0,
        "image_url":"/data/api_test/img2img-grids/2023-06-05/grid-0000.png,/data/api_test/img2img-images/2023-06-05/00000-1003.png,/data/api_test/img2img-images/2023-06-05/00001-1004.png",
        "seed":"1003,1004",
        "error_msg":""
    },
    "info":""
}

例: ControlNetを使用したtxt2img

サンプル要求本文:

{
    "alwayson_scripts": {
        "sd_model_checkpoint": "deliberate_v2.safetensors", # The name of the model. 
        "save_dir": "/code/stable-diffusion-webui/data-oss/outputs",
        "controlnet":{
            "args":[
                {
                    "image_link": "https://pai-aigc-dataset.oss-cn-hangzhou.aliyuncs.com/pixabay_images/00008b87bf3ff6742b8cf81c358b9dbc.jpg",
                    "enabled": true, 
                    "module": "canny", 
                    "model": "control_v11p_sd15_canny", 
                    "weight": 1, 
                    "resize_mode": "Crop and Resize", 
                    "low_vram": false, 
                    "processor_res": 512, 
                    "threshold_a": 100, 
                    "threshold_b": 200, 
                    "guidance_start": 0, 
                    "guidance_end": 1, 
                    "pixel_perfect": true, 
                    "control_mode": "Balanced", 
                    "input_mode": "simple", 
                    "batch_images": "", 
                    "output_dir": "", 
                    "loopback": false
                }
            ]
        }
    },
    # Key parameters.
    "prompt": "girls",          
    "batch_size": 1,                                            
    "n_iter": 2,                                                 
    "width": 576, 
    "height": 576,
    "negative_prompt": "ugly, out of frame"
}

レスポンス例:

{
    "images":[],
    "parameters":{
        "id_task":"14837",
        "status":0,
        "image_url":"/data/api_test/txt2img-grids/2023-06-05/grid-0007.png,/data/api_test/txt2img-images/2023-06-05/00014-1003.png,/data/api_test/txt2img-images/2023-06-05/00015-1004.png",
        "seed":"1003,1004",
        "error_msg":"",
        "image_mask_url":"/data/api_test/controlnet_mask/2023-06-05/00000.png,/data/api_test/controlnet_mask/2023-06-05/00001.png"
    },
    "info":""
}

関連ドキュメント

EASを使用して、次のアイテムを展開することもできます。

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

  • ComfyUIおよびStable video Diffusionモデルを使用して、AIビデオ生成モデルサービスをデプロイできます。 これにより、ソーシャルメディアプラットフォームでの短いビデオ生成やアニメーションなどのタスクを完了できます。 詳細については、「ComfyUIを使用したAIビデオ生成モデルサービスのデプロイ」をご参照ください。

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

  • AIペイントシナリオでは、トレーニング済みのLoRAモデルをSDサービスで補助モデルとして使用して、ペイントパフォーマンスを向上させることができます。 詳細については、「Kohya_ssを使用したLoRA SDモデルのEASでのデプロイ」をご参照ください。

  • サービスの呼び出しに使用できるSDKの詳細については、「SDK」をご参照ください。

  • EASの課金ルールの詳細については、「EASの課金」をご参照ください。