Stable Diffusion (SD) は、高品質、高解像度の画像を高い安定性と制御性で生成する、強力な画像生成モデルです。オープンソースの Stable Diffusion WebUI プロジェクトは、このモデルを Gradio で構築されたビジュアルインターフェイスでラップし、ユーザーに豊富な画像生成ツールを提供します。Elastic Algorithm Service (EAS) は、シナリオベースのデプロイを可能にし、いくつかのパラメーターを設定するだけで、ワンクリックで Stable Diffusion WebUI サービスをデプロイできます。
特徴と利点
PAI-EAS は、セルフビルドのサービスに比べて次の利点があります:
ワンクリックデプロイ:事前設定済みのイメージにすべての依存関係が含まれています。
GPU Auto Scaling:必要に応じて GPU リソースを動的に調整します。
エンタープライズグレードの機能:マルチユーザーの隔離、GPU 共有、コスト配分。
統合されたファイル管理:FileBrowser 拡張機能により、モデルのアップロードが簡素化されます。
バージョンの選択
バージョン | シナリオ | 呼び出しメソッド | 課金 |
Standard Edition | 個人でのテスト、プロトタイプ開発 | WebUI、API 呼び出し (同期) | 課金はデプロイメント設定に基づきます。詳細については、「EAS 課金の概要」をご参照ください。 |
API edition | 本番環境 API、高い同時実行性シナリオ | API 呼び出し (同期 & 非同期) | |
Clustered WebUI | チームコラボレーション、デザインチーム | WebUI | |
Serverless Edition 説明 中国 (上海) および中国 (杭州) リージョンでのみサポートされています。 | 弾力的な負荷、コスト最適化 | WebUI | サービスのデプロイは無料です。課金は画像生成の時間にのみ基づきます。 |
クイックスタート:シナリオベースの方法を使用した AI Art のデプロイ
-
PAI コンソールにログインします。ページ上部でリージョンを選択します。次に、目的のワークスペースを選択し、[Elastic Algorithm Service (EAS)] をクリックします。
Elastic Algorithm Service (EAS) ページで、Deploy Service をクリックします。Scenario-based Model Deployment エリアで、AI Painting - SD Web UI Deployment をクリックします。
次の主要なパラメーターを設定します:
Version:Standard Edition を選択します。
Model Settings:モデルファイルと推論で生成された画像を保存します。OSS を選択し、バケットパスを選択します。
Instance Type:GPU タイプを選択します。推奨されるインスタンスタイプは
ml.gu7i.c16m60.1-gu30(コストパフォーマンスが最も高い) です。
パラメーターを設定した後、Deploy をクリックします。サービスステータスが Running に変わるまで 5〜10 分待ちます。
サービスの呼び出し
WebUI を使用した呼び出し
Standard Edition、Clustered WebUI、および Serverless Edition サービスは、次のように WebUI を使用して呼び出すことができます:
モデルの推論を検証します。
Stable Diffusion WebUI ページの [Text-to-Image] タブで、「
cute dog」などのポジティブプロンプトを入力します。次に、[生成] をクリックして AI Art の生成を完了します。結果は次のようになります:
同期 API を使用した呼び出し
Standard Edition および API edition サービスをデプロイした後、次のように同期 API リクエストを送信できます。
クエリの呼び出し情報
サービスがデプロイされた後、サービス名をクリックして Overview ページに移動します。
Basic Information エリアで、View Endpoint Information をクリックします。
Invocation Information ページで、パブリックサービスエンドポイントとトークンを取得します。
呼び出し例
画像をローカルに保存
import requests
import base64
from PIL import Image
import io
# 注意 !!!!:サービス URL の末尾のスラッシュ (/) を削除してください。
SERVICE_URL = "<service_url>"
TOKEN = "<Token>"
def generate_image(prompt: str) -> Image.Image:
"""テキストプロンプトから画像を生成します。"""
payload = {
"prompt": prompt,
"negative_prompt": "blurry, low quality, deformed",
"steps": 25,
"width": 512,
"height": 512,
"cfg_scale": 7.5,
}
response = requests.post(
f"{SERVICE_URL}/sdapi/v1/txt2img",
json=payload,
headers={"Authorization": TOKEN}
)
response.raise_for_status()
# 最初の画像をデコードします
img_data = response.json()["images"][0]
return Image.open(io.BytesIO(base64.b64decode(img_data)))
# 生成して保存
image = generate_image("a serene mountain landscape at sunset")
image.save("output.png")
画像を OSS に保存
import requests
# 注意 !!!!:サービス URL の末尾のスラッシュ (/) を削除してください。
SERVICE_URL = "<service_url>"
TOKEN = "<Token>"
payload = {
"prompt": "professional portrait photography",
"steps": 30,
"alwayson_scripts": {
"sd_model_checkpoint": "v1-5-pruned-emaonly.safetensors",
"save_dir": "/code/stable-diffusion-webui/data/outputs"
}
}
response = requests.post(
f"{SERVICE_URL}/sdapi/v1/txt2img",
json=payload,
headers={"Authorization": TOKEN}
)
# 保存された画像のパスを取得します
data = response.json()
# これは、EAS サービスとしてデプロイする際にマウントされた OSS フォルダの mount_path に対応します。
mount_path = "/code/stable-diffusion-webui/data"
# これは、EAS サービスとしてデプロイする際に選択された OSS バケット URL に対応します。
oss_url = "oss://examplebucket/data-oss"
for idx, img_path in enumerate(data['parameters']['image_url'].split(',')):
# 生成された画像の実際の OSS パスを取得します。
img_oss_path = img_path.replace(mount_path, oss_url)
print(img_oss_path)さらに、リクエストデータで LoRA および ControlNet データ形式を使用して、特定の機能を実現します。
リクエストデータでの LoRA モデルの設定
サービスリクエストを送信する際、リクエストボディに直接 <lora:yaeMikoRealistic_Genshin:1000> を追加して LoRA を含めます。詳細については、「LoRA」をご参照ください。
リクエストボディの設定例は次のとおりです:
{
"prompt":"girls <lora:yaeMikoRealistic_Genshin:1>",
"steps":20,
"save_images":true
}リクエストデータでの ControlNet データ形式の使用
API リクエストデータで ControlNet データ形式を使用すると、水平または垂直方向の維持など、一般的な画像変換が簡素化されます。具体的な設定方法については、「ControlNet データ形式を使用した txt2img」をご参照ください。
非同期 API を使用した呼び出し
API edition サービスをデプロイした後、非同期 API リクエストを送信できます。クライアントは同期的に結果を待つのではなく、リクエストの計算が完了した後にサーバーが結果をプッシュするのをサブスクライブして待ちます。次の手順を実行します:
クエリ呼び出し情報
サービスがデプロイされた後、サービス名をクリックして Overview ページに移動します。
Basic Information エリアで、View Endpoint Information をクリックします。
Invocation Information ページで、Asynchronous Invocation タブに切り替えて、パブリックネットワーク入力エンドポイントとトークンを取得します。
リクエストの送信
クライアントは非同期 API を介してサーバーにリクエストを送信します。
import requests
SERVICE_URL = "<Public service URL>"
TOKEN = "<Token>"
response = requests.post(
f"{SERVICE_URL}/sdapi/v1/txt2img?task_id=job_001",
json={
"prompt": "futuristic city skyline",
"steps": 30,
"alwayson_scripts": {
"save_dir": "/code/stable-diffusion-webui/data/outputs"
}
},
headers={"Authorization": TOKEN}
)
print(f"Job enqueued: {response.json()}")
非同期キューには、入力リクエストと出力結果の両方にサイズ制限があり、通常は 8 KB を超えません。したがって、リクエストを送信する際には、次の 2 つの条件を満たす必要があります:
リクエストデータに画像が含まれる場合は、URL を使用して画像情報を渡します。Stable Diffusion WebUI は、この画像データを内部で自動的にダウンロードして解析します。
返される結果に元の画像データが含まれないようにするには、save_dir を使用して生成された画像の保存パスを指定します。詳細については、「API 操作でサポートされる追加パラメーター」をご参照ください。
サブスクリプション結果
クライアントはサブスクリプション方式を使用します。サーバーがリクエストの処理を完了すると、結果を自動的にクライアントにプッシュし、効率的な非同期通信を可能にします。
from eas_prediction import QueueClient
# サービス URL の形式を例に合わせて調整します:112231234124214.cn-hangzhou.pai-eas.aliyuncs.com
SERVICE_URL = "<service_url>"
TOKEN = "<Token>"
# サービス作成時に設定したサービス名。
SERVICE_NAME = "<service_name>"
sink = QueueClient(SERVICE_URL, SERVICE_NAME + '/sink')
sink.set_token(TOKEN)
sink.init()
for result in sink.watch(0, 5, auto_commit=True).run():
print(f"Task {result.tags.get('task_id')} completed")
print(f"Image URL: {result.data}")EAS は、ネイティブの Stable Diffusion WebUI API に基づく新機能をサポートしています。リクエストデータにオプションパラメーターを追加して、より豊富な機能やカスタマイズされたニーズに対応します。詳細については、「API 操作でサポートされる追加パラメーター」をご参照ください。
高度なデプロイオプション
カスタムデプロイ
JSON スタンドアロンデプロイ
機能拡張のためのプラグインのインストール
Stable Diffusion WebUI のプラグインを設定して、より多様な機能を実現します。PAI は、プロンプトの拡張と美化を試すために使用される、PAI 開発の BeautifulPrompt プラグインなど、豊富なプラグインをプリインストールしています。このセクションでは、BeautifulPrompt プラグインを例に、プラグインのインストールと使用方法を紹介します。
プラグインのインストール
WebUI ページの [拡張機能] タブでプラグインを表示およびインストールするには、次の手順を実行します:
WebUI ページの [拡張機能] タブで、[BeautifulPrompt] が選択されているかどうかを確認します。選択されていない場合は、プラグインを選択し、[変更を適用して UI を再読み込み] をクリックして BeautifulPrompt プラグインを再読み込みします。

プラグインをインストールすると、WebUI ページが自動的に再起動します。再読み込み後、推論を検証します。
プラグインを使用した推論の検証
[BeautifulPrompt] タブに切り替えます。テキストボックスに簡単なプロンプトを入力します。次に、[生成] をクリックして、より詳細なプロンプトを作成します。

PAI は複数のプロンプト生成モデルを提供します。各モデルはわずかに異なるプロンプトを生成します。これらには以下が含まれます:
pai-bloom-1b1-text2prompt-sd-v2:複雑なシナリオのプロンプト生成に優れています。
pai-bloom-1b1-text2prompt-sd:単一のオブジェクトを説明するプロンプトを生成します。
必要に応じて適切なモデルを選択してプロンプトを生成します。

使用するプロンプトを選択します。プロンプトの右側にある [to txt2img] をクリックします。
ページは自動的に [Text-to-Image] タブにリダイレクトされ、プロンプトエリアが自動入力されます。

[生成] をクリックして、WebUI ページの右側に画像を生成します。

BeautifulPrompt プラグインを使用しない場合と比較して、使用すると生成される画像の美的品質が向上し、より多くの詳細を追加するのに役立ちます。次の表は、他のシナリオで BeautifulPrompt プラグインを使用した効果を比較したものです:
入力プロンプト
BeautifulPrompt なしの効果
BeautifulPrompt ありの効果
a cat


a giant tiger


よくある質問
Q:モデルと出力ディレクトリをマウントする方法は?
Q:設定を変更しない場合、ダウンロードしたプラグインやアップロードしたファイルはインスタンスに保存されますか?
Q:サービスが長時間スタックしたままの場合はどうすればよいですか?
Q:WebUI ページのデフォルト言語を英語に切り替える方法は?
Q:ファイルシステムを管理する方法は?
Q:エラー:No such file or directory: 'data-oss/data-********.png'
Q:WebUI ページにアクセスできません。
付録
サービス起動時にサポートされるパラメーター
共通パラメーター
共通パラメーター
機能説明
使用推奨
--bladePAI-blade アクセラレーションを有効にして、画像生成速度を向上させます。
有効にしてください。
--filebrowserモデルや画像をアップロードおよびダウンロードできるプラグインです。
デフォルトで有効です。
--data-dir /code/stable-diffusion-webui/data-oss永続ストレージマウントに使用されるパスです。
永続ストレージをマウントする際に使用します。デフォルトの開始パスは
/code/stable-diffusion-webui/です。相対パスも使用できます。--apiWebUI API 呼び出しモードです。
デフォルトで有効です。
--enable-nsfw-censorデフォルトでは無効です。セキュリティおよびコンプライアンス要件がある場合は、ポルノ検出機能を有効にしてください。
必要に応じて調整してください。
--always-hide-tabs特定のタブを非表示に指定します。
必要に応じて調整してください。
--min-ram-reserved 40 --sd-dynamic-cacheStable Diffusion の大規模モデルをメモリにキャッシュできます。
なし。
Clustered Edition パラメーター
説明ckpt および ControlNet の大規模モデルは、パブリックフォルダとカスタムファイルからファイルを自動的にロードします。
Clustered Edition パラメーター
機能説明
使用推奨
--lora-dirパブリック LoRA モデルディレクトリを指定します。例:
--lora-dir /code/stable-diffusion-webui/data-oss/models/Lora。デフォルトでは設定されていません。すべてのユーザーの LoRA ディレクトリは隔離されており、ユーザーフォルダ内の LoRA モデルのみがロードされます。特定のディレクトリが指定されると、すべてのユーザーはパブリックディレクトリとユーザーフォルダの両方から LoRA モデルを同時にロードします。
--vae-dirパブリック 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パブリック embeddings モデルディレクトリを指定します。例:
--embeddings-dir /code/stable-diffusion-webui/data-oss/embeddings。デフォルトでは設定されていません。すべてのユーザーの embeddings ディレクトリは隔離されており、ユーザーフォルダ内の embeddings モデルのみがロードされます。特定のディレクトリが指定されると、すべてのユーザーはそのパブリックディレクトリからのみ embeddings モデルをロードします。
--hypernetwork-dirパブリック hypernetwork モデルディレクトリを指定します。例:
--hypernetwork-dir /code/stable-diffusion-webui/data-oss/models/hypernetworks。デフォルトでは設定されていません。すべてのユーザーの hypernetwork ディレクトリは隔離されており、ユーザーフォルダ内の hypernetwork モデルのみがロードされます。特定のディレクトリが指定されると、すべてのユーザーはそのパブリックディレクトリからのみ hypernetwork モデルをロードします。
--root-extensionsプラグインディレクトリは共有ディレクトリを使用します。このパラメーターを使用すると、すべてのユーザーがまったく同じプラグインを表示します。
プラグインのインストールや管理を一元化する場合にこのパラメーターを使用します。
API 操作でサポートされる追加パラメーター
EAS は、ネイティブの Stable Diffusion WebUI API に基づく新機能をサポートしています。必須パラメーターに加えて、API 操作にオプションパラメーターを追加して、より豊富な機能やカスタマイズされたニーズに対応します:
Stable Diffusion モデル、VAE モデル、および保存ディレクトリを指定します。
URL 経由での入力パラメーターをサポートし、対応するステータスコードを返します。
URL 経由で生成された画像および ControlNet 対応の画像にアクセスします。
具体的な使用例は次のとおりです:
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:Stable Diffusion モデルパラメーターを指定し、大規模モデルへの自動切り替えを有効にします。
sd_vae:VAE モデルを指定します。
save_dir:生成された画像の保存パスを指定します。
同期 API リクエストの例は次のとおりです:
# 同期 API を呼び出してモデルの効果を検証します。
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": ""
}非同期 API リクエストの例は次のとおりです:
# データを非同期キューに直接送信します。
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, # サンプリングステップ
"seed": 111,
"subseed": 111, # バリエーションシード
"subseed_strength": 0, # バリエーション強度
"seed_resize_from_h": 0, # 高さからシードをリサイズ
"seed_resize_from_w": 0, # 幅からシードをリサイズ
"seed_enable_extras": false, # エクストラ
"sampler_name": "DDIM", # サンプリングメソッド
"cfg_scale": 7.5, # CFG スケール
"restore_faces": true, # 顔の復元
"tiling": false, # タイリング
"init_images": [], # image base64 str, デフォルトは None
"mask_blur": 4, # マスクのぼかし
"resize_mode": 1, # 0 リサイズのみ, 1 切り取りとリサイズ, 2 リサイズと塗りつぶし, 3 リサイズのみ
"denoising_strength": 0.75, # ノイズ除去強度
"inpainting_mask_invert": 0, #int, ['Inpaint masked', 'Inpaint not masked'] のインデックス, マスクモード
"inpainting_fill": 0, #['fill', 'original', 'latent noise', 'latent nothing'] のインデックス, マスクされたコンテンツ
"inpaint_full_res": 0, # ["Whole picture", "Only masked"] のインデックス, Inpaint エリア
"inpaint_full_res_padding": 32, #minimum=0, maximum=256, step=4, value=32, マスクされた部分のみのパディング (ピクセル単位)
#"image_cfg_scale": 1, # スケールによるリサイズ
#"script_name": "Outpainting mk2", # 使用するスクリプト名。使用しない場合はこのフィールドを追加しないでください。
#"script_args": ["Outpainting", 128, 8, ["left", "right", "up", "down"], 1, 0.05] # スクリプトに対応するパラメーター。ここでは、固定フィールド、ピクセル、mask_blur、方向、noise_q、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", # モデル名、必須
"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
}
]
}
},
# 主要パラメーター
"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":""
}リファレンス
Elastic Algorithm Service の課金の詳細については、「Elastic Algorithm Service の課金」をご参照ください。



