Stable Diffusion是強大的圖像生成模型,能夠生成高質量、高分辨率的圖像,并具有良好的穩定性和可控性。Stable Diffusion WebUI開源項目在模型的基礎上進行封裝,基于Gradio開發了可視化圖形界面,為用戶提供了豐富的生圖工具。EAS提供了場景化部署方式,您只需配置幾個參數,即可一鍵部署基于Stable Diffusion WebUI的服務。您可以使用該服務進行模型推理,實現基于給定文本生成相應圖像的功能。本文為您介紹如何部署和調用Stable Diffusion WebUI服務,以及常見問題的解決方法。
背景信息
功能與優勢
通過EAS實現Stable Diffusion WebUI的云端快速部署與應用,具體功能與優勢如下:
使用便捷:快捷部署,開箱即用;可根據需求動態切換GPU等底層資源。
企業級功能:前后端分離改造,支持多用戶對多GPU的集群調度;支持用戶隔離;支持賬單拆分。
插件及優化:在Stable Diffusion WebUI開源版本的基礎上,提供了PAI-Blade性能優化工具;提供FileBrowser插件,允許用戶在桌面端上傳和下載云端模型、圖片;提供自研的ModelZoo插件,支持開源模型下載加速。
部署形態
Stable Diffusion WebUI服務提供了以下四種部署版本,部署流程基本相同:
標準版:推薦單用戶測試驗證時使用。支持WebUI界面使用和API調用,只適用于部署單個實例。
集群版WebUI:適合多人共同使用WebUI的場景。如果企業內設計團隊需要多人協同使用,推薦選擇集群版。由于集群版需要Proxy負責處理WebUI請求,因此需要額外的CPU實例。該版本優勢如下:
系統為每個用戶分配獨立的工作目錄,便于管理和存儲模型、輸出圖像或視頻等文件。
系統為每個用戶提供獨立的后端環境。當開啟了多個實例時,單個用戶的任務會按順序執行,而多用戶環境下的任務則在不同實例之間分配,實現高效的GPU共享。
API版:API版建議結合EAS異步隊列使用,適用于高并發場景。基于其異步特性,系統會創建隊列服務實例,因此需要分配額外的CPU實例。
Serverless版:目前,僅華東2(上海)、華東1(杭州)地域支持部署Serverless版服務。Serverless版服務的部署完全免費,費用僅基于生成圖像所需的時間來計算,并且服務會根據您的請求量自動進行彈性伸縮。僅支持通過WebUI進行調用。
使用流程
根據您的具體使用場景,選擇合適的部署方式,來部署標準版、API版、集群版或Serverless版的服務。
支持以下兩種調用方式:
使用WebUI發送服務請求,僅標準版、集群版和Serverless服務支持使用該方式。
僅標準版和API版服務支持通過API發送服務請求。其中標準版服務僅支持同步調用,而API版服務支持同步調用和異步調用。
PAI預置了非常豐富的插件,可以實現更加多樣化的功能。您可以在WebUI頁面的擴展頁簽中,查看并安裝插件。
前提條件
請提前準備NAS或OSS存儲空間,用來存放模型文件和生成的圖片。
當您通過API調用服務時,需要配置環境變量。詳情請參見Python配置訪問憑證。
部署服務
支持以下三種部署方式:
方式一:場景化模型部署(推薦)
支持部署標準版、API版、集群版WebUI和Serverless版的服務。具體操作步驟如下:
進入模型在線服務(EAS)頁面。
登錄PAI控制臺。
在左側導航欄單擊工作空間列表,在工作空間列表頁面中單擊待操作的工作空間名稱,進入對應工作空間內。
在工作空間頁面的左側導航欄選擇模型部署>模型在線服務(EAS),進入模型在線服務(EAS)頁面。
在模型在線服務(EAS)頁面,單擊部署服務,然后在場景化模型部署區域,單擊AI繪畫-SDWebUI部署。
在AI繪畫-SDWebUI部署頁面,配置以下關鍵參數。
參數
描述
基本信息
版本選擇
支持選擇以下版本:
標準版:推薦單用戶測試驗證時使用,只適用于部署單個實例。支持通過WebUI生成圖像,也可通過API進行調用。
API版:系統將自動轉換服務為異步模式,適用于高并發場景。僅支持通過API進行調用。
集群版WebUI:適合多用戶同時在WebUI頁面進行操作。僅支持通過WebUI進行調用,不提供API服務。當需要實現多人同時使用一個Stable Diffusion WebUI出圖時,您可以使用集群版WebUI服務。
Serverless版:Serverless版服務的部署完全免費,費用僅基于生成圖像所需的時間來計算。僅支持通過WebUI進行使用。
更多關于每個版本的使用場景說明,請參見背景信息。
模型配置
單擊添加按鈕,進行模型配置,用來存放模型文件和推理生成的圖片。支持以下兩種配置類型:
按對象存儲OSS:使用OSS上傳和下載數據更方便,能夠為生成后的圖像生成公網訪問地址,但切換模型和保存圖像的速度比NAS慢。配置OSS為已創建的OSS存儲空間(Bucket)路徑。
按文件存儲(NAS):切換模型和保存圖像的速度更快。僅標準版、API版和集群版WebUI支持該配置類型。
NAS掛載點:選擇已創建的NAS文件系統和掛載點。
NAS源路徑:配置為
/
。
本文以掛載OSS為例來說明。
資源配置
資源配置選擇
僅標準版、API版和集群版WebUI需要進行資源配置。
選擇GPU類型,實例規格推薦使用ml.gu7i.c16m60.1-gu30(性價比最高)。
推理加速
支持啟用推理加速功能,取值如下:
PAI-Blade推理加速:PAI-Blade是PAI推出的通用推理優化工具,對訓練完成的模型進行優化,從而達到最優的推理性能。
開源框架xFormers推理加速:xFormers是基于Transformer的開源加速工具,能夠有效縮短圖片生成時長。
無加速:表示不啟用推理加速功能。
專有網絡配置
VPC
當模型配置選擇按文件存儲(NAS)時,系統會自動匹配與NAS所在VPC相連通的專有網絡,無需進行額外的修改。
交換機
安全組
參數配置完成后,單擊部署。
方式二:自定義部署
支持部署標準版、API版和集群版WebUI服務。具體操作步驟如下:
進入模型在線服務(EAS)頁面。
登錄PAI控制臺。
在左側導航欄單擊工作空間列表,在工作空間列表頁面中單擊待操作的工作空間名稱,進入對應工作空間內。
在工作空間頁面的左側導航欄選擇模型部署>模型在線服務(EAS),進入模型在線服務(EAS)頁面。
在模型在線服務(EAS)頁面,單擊部署服務,然后在自定義模型部署區域,單擊自定義部署。
在新建服務頁面,配置以下關鍵參數。
參數
描述
模型服務信息
部署方式
部署標準版和集群版WebUI服務時,選擇鏡像部署AI-Web應用。
部署API版服務時,選擇鏡像部署服務,同時打開異步服務開關。
鏡像選擇
在PAI平臺鏡像列表中選擇stable-diffusion-webui,鏡像版本選擇最高版本,其中:
x.x-standard:表示標準版。
x.x-api:表示API版。
x.x-cluster-webui:表示集群版WebUI。
說明由于版本迭代迅速,部署時鏡像版本選擇最高版本即可。
當需要實現多人同時使用一個Stable Diffusion WebUI出圖時,您可以選擇x.x-cluster-webui版本。
更多關于每個版本的使用場景說明,請參見背景信息。
填寫模型配置
單擊填寫模型配置,進行模型配置,用來存放模型文件和推理生成的圖片。支持以下三種配置類型:
OSS掛載
OSS存儲路徑:將OSS路徑配置為已創建的OSS Bucket路徑。
掛載路徑:配置為
/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
當模型配置選擇按文件存儲(NAS)時,系統會自動匹配與NAS所在VPC相連通的專有網絡,無需進行額外的修改。
交換機
安全組
參數配置完成后,單擊部署。
方式三:JSON獨立部署
您可以使用JSON獨立部署方式,來部署Stable Diffusion WebUI服務,以下以標準版和API版為例,具體操作步驟如下:
進入模型在線服務頁面。
登錄PAI控制臺。
在左側導航欄單擊工作空間列表,在工作空間列表頁面中單擊待操作的工作空間名稱,進入對應工作空間內。
在工作空間頁面的左側導航欄選擇模型部署>模型在線服務(EAS),進入模型在線服務(EAS)頁面。
在模型在線服務(EAS)頁面,單擊部署服務,在自定義模型部署區域,單擊JSON獨立部署。
在JSON獨立部署頁面編輯框中,配置以下JSON格式的內容。
部署標準版服務
{ "metadata": { "instance": 1, "name": "sd_v32", "enable_webservice": true }, "containers": [ { "image": "eas-registry-vpc.<region>.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
是
自定義模型服務名稱,同地域唯一。
containers.image
是
其中<region>需要替換為當前地域ID,例如華東2(上海)為cn-shanghai。關于如何查詢地域ID,請參見地域和可用區。
storage
否
支持以下兩種掛載方式,任意選擇一種即可:
OSS:使用OSS上傳和下載數據更方便,能夠為生成后的圖像生成公網訪問地址,但切換模型和保存圖像的速度比NAS慢。您需要將storage.oss.path配置為已創建的OSS存儲空間路徑。
NAS:使用NAS掛載方式,切換模型和保存圖像的速度更快。您需要將storage.nfs.server配置為已創建的NAS文件系統。
本文以掛載OSS為例來說明。
cloud.networking
否
當storage使用NAS掛載時,您需要配置專有網絡,包括vpc_id(專有網絡ID)、vswitch_id(交換機ID)和security_group_id(安全組ID),且配置的專有網絡需要與通用型NAS文件系統保持一致。
部署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, "memory": 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.<region>.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 } ] }
相較于標準版服務的配置,以下是API版服務的配置變更,其他參數配置與標準版服務相同。
參數
描述
刪除以下參數:
metadata.enable_webservice
刪除該參數,表示不開啟webserver。
containers.script
刪除containers.script中配置的--filebrowser,加快服務啟動速度。
新增以下參數:
metadata.type
配置為Async,表示打開異步服務。
metadata.rpc.worker_threads
配置為1,單個實例只允許并發處理一個請求。
queue.max_delivery
配置為1,消息處理錯誤后不允許重試。
containers.script
containers.script配置中新增--nowebui(加快啟動速度)和--time-log(記錄接口響應時間)。
更多參數配置說明,請參見部署標準版服務。
單擊部署。
調用服務
通過WebUI頁面調用服務
通過WebUI,您可以調用標準版、集群版WebUI和Serverless版的服務。具體操作步驟如下:
服務部署成功后,單擊目標服務的服務方式列下的查看Web應用。
進行模型推理驗證。
在Stable Diffusion WebUI頁面文生圖頁簽中,輸入正向提示詞Prompt,例如
cute dog
,然后單擊生成,即可完成AI繪圖,效果圖如下:
通過API調用服務
標準版和API版服務支持API調用。API調用支持同步調用和異步調用兩種方式,其中標準版服務僅支持同步調用,API版服務支持同步調用和異步調用方式。
同步調用:即客戶端發送一個請求,同步等待結果返回。
異步調用:即客戶端使用EAS的隊列服務向輸入隊列發送請求,并通過訂閱的方式從輸出隊列查詢結果。
調用同步服務
標準版和API版服務部署成功后,您可以參照以下操作步驟發送同步接口請求。
查詢調用信息。
服務部署成功后,單擊服務名稱,進入服務詳情頁面。
在基本信息區域中,單擊查看調用信息。
在調用信息對話框中,查詢服務訪問地址和Token。
如果該服務是API版服務,您需要在同步調用頁簽的公網地址調用頁簽中,查詢服務訪問地址和Token。
如果該服務是標準版服務,您需要在公網地址調用頁簽中,查詢服務訪問地址和Token。
使用以下幾種方式發送同步接口請求。
使用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 }'
其中:
命令執行成功后,系統會返回圖像的Base64位編碼。
使用Python發送服務請求
參考API發送服務請求。
示例1(推薦):建議您為EAS服務掛載OSS來保存生成后的圖像。以下示例在請求體中設置保存地址為OSS掛載路徑,實現了將圖像直接保存至OSS,并且使用了oss2 SDK獲取OSS中的圖像下載到本地。
import requests import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 第一步:發送請求,生成的圖像會保存至OSS。 url = "<service_url>" # 阿里云賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建并使用RAM賬號進行API訪問或日常運維,請登錄RAM控制臺創建RAM賬號。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # Endpoint以杭州為例,其它Region請按實際情況填寫。 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() # 第二步:獲取OSS中的圖像下載到本地。 # 對應部署EAS服務時,storage掛載OSS文件夾對應的mount_path。 mount_path = "/code/stable-diffusion-webui/data" # 對應部署EAS服務時,storage中選擇的OSS地址。 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(idx, img_oss_path, url) # 下載OSS文件到本地文件。其中<examplebucket>需要替換為已創建的OSS存儲空間(Bucket)名稱。 bucket.get_object_to_file(img_oss_path[len("oss://examplebucket/"):], f'output-{idx}.png')
其中關鍵配置說明如下:
配置
描述
url
將<service_url>替換為步驟1中查詢到的服務訪問地址。您需要將訪問地址末尾的
/
刪除。bucket
其中:
<endpoint>表示配置的OSS的Endpoint。例如:華東2(上海)地域的Endpoint為
http://oss-cn-shanghai.aliyuncs.com
。如果您在其他地域部署的服務,需要根據實際情況進行配置。詳情請參見訪問域名和數據中心。<examplebucket>需要替換為已創建的OSS存儲空間(Bucket)名稱。
<token>
替換為步驟1中查詢到的服務Token。
mount_path
配置為部署服務時配置的OSS掛載路徑。
oss_url
配置為部署服務時配置的OSS存儲路徑。
代碼執行成功后,系統返回如下結果。您可以前往OSS控制臺,在部署服務時掛載存儲的
outputs
目錄中查看已生成的圖片。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位編碼,并將圖像文件保存至本地目錄。
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() # 同步接口可直接返回圖片的base64,但推薦使用返回圖片地址。 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中查詢到的服務Token。
此外,您還可以在請求數據中使用LoRA和Controlnet數據格式,以實現特定的功能。
請求數據中使用LoRA模型配置
發送服務請求時,您可以直接在請求體上加入
<lora:yaeMikoRealistic_Genshin:1000>
來增加Lora。更多詳細內容,請參見Lora。請求體配置示例如下:
{ "prompt":"girls <lora:yaeMikoRealistic_Genshin:1>", "steps":20, "save_images":true }
請求數據中使用ControlNet數據格式
API請求數據中使用Controlnet數據格式可以方便地對圖像進行一些常見的變換操作,比如使圖像保持水平或垂直等。具體配置方法,請參見txt2img使用controlnet的數據格式。
調用異步服務
API版服務部署成功后,您可以向該服務發送異步接口請求,即客戶端不再同步等待結果,通過訂閱的方式在請求計算完成后等待服務端的結果推送。具體操作步驟如下:
查詢調用信息。
服務部署成功后,單擊服務方式列下的調用信息,在異步調用頁簽的公網輸入請求地址頁簽中,查詢服務訪問地址和Token。
客戶端通過異步接口向服務端發送請求,支持使用Python SDK和Java SDK兩種方式。
重要異步隊列對輸入請求和輸出結果的大小都有限制,通常不建議超過8 KB。因此,在發送請求時,需要滿足以下兩個條件:
如果請求數據中包含圖片,建議使用URL來傳遞圖片信息。Stable Diffusion WebUI內部會自動下載并解析這些圖片數據。
為了確保返回結果中沒有原始圖片數據,建議您使用save_dir來指定生成圖片的保存路徑。具體操作,請參見API接口額外支持配置的參數有哪些?。
默認情況下,EAS無法連接互聯網。如果您使用image_link參數配置的圖片鏈接是互聯網圖片地址,為了能夠正常訪問這些圖片,您需要參考配置網絡連通和公網連接及白名單配置進行公網鏈接配置。
方式一:使用Python SDK
示例代碼如下:
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中查詢到的服務Token。
說明可以支持WebUI服務的所有POST接口,按照需求請求對應路徑。
如果您需要在該服務中透傳業務屬性,可以使用url參數的方式指定屬性標簽。例如,您可以在response的url參數中添加參數
?task_id=task_abc
來指定標簽為task_id,并且該信息會在服務的輸出結果中的tags字段中體現。
代碼執行成功后,系統輸出如下結果。您的結果以實際為準。
方式二:使用Java SDK
使用Java編寫客戶端代碼時,需要使用Maven管理項目。因此,您必須在pom.xml文件中添加客戶端所需的依賴包。具體操作,請參見Java SDK使用說明。
示例代碼如下。
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 { // 創建隊列服務客戶端。 String queueEndpoint = "http://166233998075****.cn-hangzhou.pai-eas.aliyuncs.com"; String queueToken = "xxxxx=="; // 輸入隊列為服務名+自定義請求path。 String inputQueueName = "<service_name>/sdapi/v1/txt2img"; // 輸入隊列,往輸入隊列添加數據,推理服務會自動從輸入隊列中讀取請求數據。 QueueClient inputQueue = new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser()); // 清除隊列數據!!! 請謹慎使用。 // input_queue.clear(); // 往輸入隊列添加數據。 int count = 5; for (int i = 0; i < count; ++i) { // 請求數據。 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" + " }"; // 自定義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())); // 隊列服務支持多優先級隊列,可通過put函數設置數據優先級,默認優先級為0, 高優先數據可設置優先級為1。 // inputQueue.put(data.getBytes(), 0L, null); } // 關閉客戶端。 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) { // 請求數據。 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())); } // 關閉客戶端。 inputQueue.shutdown(); } }
其中:
queueEndpoint:配置為步驟1中獲取的服務訪問地址。請參考示例代碼進行相應的配置。
queueToken:配置為步驟1中獲取的服務Token信息。
<service_name>:替換為已部署的異步服務名稱。
說明如果您需要在服務中透傳業務屬性,可以在put函數中設置tag參數。在示例中,您可以參考自定義tag的用法。這些信息會在輸出結果的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
異步訂閱結果。
客戶端采用訂閱方式,一旦服務端完成相關請求的處理,便會自動推送結果至客戶端,實現高效異步通信。支持使用PyThon SDK和Java SDK兩種方式異步訂閱結果。
方式一:使用Python SDK
示例代碼如下:
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" # 阿里云賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建并使用RAM賬號進行API訪問或日常運維,請登錄RAM控制臺創建RAM賬號。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # Endpoint以杭州為例,其它Region請按實際情況填寫。 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) # 下載OSS文件到本地。 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
替換為上述步驟已獲取的服務訪問地址中的服務Endpoint。參考示例代碼格式,將sd_async替換為已部署的異步服務名稱。
<token>
需要配置為步驟1中獲取的服務Token信息。
oss_url
替換為部署服務時配置的OSS存儲路徑。
bucket
其中:
http://oss-cn-hangzhou.aliyuncs.com
表示以華東1(杭州)地域為例,配置的OSS的Endpoint。如果您在其他地域部署的服務,需要根據實際情況進行配置。詳情請參見訪問域名和數據中心。<examplebucket>需要替換為已創建的OSS存儲空間(Bucket)名稱。
說明需要主動進行commit操作,也可以設置
auto_commit=True
來自動進行commit操作。如果consumer不再消費數據,需要及時關閉以釋放資源。
您也可以使用curl命令或者調用同步接口來獲取訂閱接口,詳情請參見部署異步推理服務。
客戶端通過
watcher.run()
方法持續偵聽服務端的結果。如果服務端一直沒有結果,客戶端將持續等待,如果服務端有結果返回,則打印輸出結果。示例結果如下,您的結果以實際為準。您可以前往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
方式二:使用Java SDK
示例代碼如下:
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 { // 創建隊列服務客戶端。 String queueEndpoint = "http://166233998075****.cn-hangzhou.pai-eas.aliyuncs.com"; String queueToken = "xxxxx=="; // 輸出隊列名為 服務名+"/sink"。 String sinkQueueName = "<service_name>/sink"; // 輸出隊列,推理服務處理輸入數據后會將結果寫入輸出隊列。 QueueClient sinkQueue = new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser()); // 清除隊列數據!!! 請謹慎使用。 // sinkQueue.clear(); // 訂閱隊列,獲取隊列數據。 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(); } // 關閉客戶端。 sinkQueue.shutdown(); } }
其中:
queueEndpoint:配置為步驟1中獲取的服務訪問地址。請參考示例代碼進行相應的配置。
queueToken:配置為步驟1中獲取的服務Token信息。
<service_name>:替換為已部署的異步服務名稱。
說明需要主動進行commit操作,也可以設置
auto_commit=True
來自動進行commit操作。如果consumer不再消費數據,需要及時關閉以釋放資源。
您也可以使用curl命令或者調用同步接口來獲取訂閱接口,詳情請參見部署異步推理服務。
客戶端通過
watcher.getDataFrame()
方法持續偵聽服務端的結果。如果服務端一直沒有結果,客戶端將持續等待,如果服務端有結果返回,則打印輸出結果。示例結果如下,您的結果以實際為準。您可以前往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()
方法主動查詢該請求的處理狀態,以確定是否已完成。詳情請參見Python SDK使用說明和Java SDK使用說明。
EAS基于原生Stable Diffusion WebUI接口支持了一些新特性,您可以在請求數據中添加一些可選參數用于實現更加豐富的功能或定制化需求。具體操作,請參見API接口額外支持配置的參數有哪些?。
安裝插件實現增強功能
您可以為Stable Diffusion WebUI配置插件,以實現更加多樣化的功能。PAI預置了豐富的插件,例如PAI自主研發的BeautifulPrompt插件,用來實驗Prompt的擴寫和美化。下文將以BeautifulPrompt插件為例,為您介紹插件的安裝和使用方法。
安裝插件
您可以在WebUI頁面的擴展頁簽中,查看并安裝插件。具體操作步驟如下:
在服務列表中,單擊目標服務的服務方式列下的查看Web應用,來啟動WebUI。
在WebUI頁面中的擴展頁簽下,檢查是否已選中BeautifulPrompt。如果未選中,您需要選中該插件,并單擊應用更改并重載前端,來重新加載BeautifulPrompt插件。
在安裝插件時,WebUI頁面將會自動重啟,待重新加載完成后即可進行推理驗證。
使用插件進行推理驗證
切換到BeautifulPrompt頁簽,在文本框中輸入一個比較簡單的Prompt,然后單擊生成,即可生成更詳細的Prompt。
PAI提供了多個Prompt生成模型,每個模型生成的Prompt略有不同。其中:
pai-bloom-1b1-text2prompt-sd-v2:擅長生成復雜場景下的Prompt。
pai-bloom-1b1-text2prompt-sd:生成描述單個物體的Prompt。
您可以根據場景需要選擇合適的模型來生成Prompt。
選擇需要使用的Prompt,單擊Prompt右側的to txt2img。
頁面自動跳轉至文生圖頁簽,并自動填充了提示詞(Prompt)區域。
單擊生成,即可在WebUI頁面右側生成圖片。
與不使用BeautifulPrompt插件相比,使用BeautifulPrompt插件可以提升生成圖像的美觀度,并且幫助您補充更多細節。其他場景使用BeautifulPrompt插件前后效果對比如下:
輸入Prompt
不使用BeautifulPrompt的效果
使用BeautifulPrompt的效果
a cat
a giant tiger
常見問題
如何掛載自己的模型及輸出目錄等內容
服務部署成功后,系統會自動在已掛載的OSS或NAS存儲空間中創建以下目錄結構:
其中:
models:該目錄用來存放模型文件。
發起推理請求后,系統將按照API代碼中預設的配置,自動將結果文件輸出至該目錄中。
您可以將從開源社區下載的模型或自己訓練得到的LoRA或Stable Diffusion等模型存放于上述指定目錄中,以便加載使用新的模型。具體操作步驟如下:
請將模型文件上傳至掛載存儲的
models
目錄下的相應子目錄中,具體操作,請參見步驟三:上傳文件。在模型在線服務(EAS)頁面,單擊目標服務操作列下的>重啟服務,服務重啟成功后,即可生效。
在Stable Diffusion WebUI頁面切換模型,進行模型推理驗證。
服務長時間卡住怎么辦?
您可以先嘗試重新打開Stable Diffusion WebUI界面或重啟EAS服務來解決:
單擊目標服務服務方式列下的查看Web應用,重新打開Stable Diffusion WebUI。
單擊目標服務操作列下的>重啟服務,重啟EAS服務。
如果重啟后長時間無法解決,則大概率是因為服務需要從外網下載模型或插件等內容導致。EAS默認不開公網,鏡像可以離線啟動,掛載模型也無需網絡。但部分插件的使用,需要依賴從互聯網下載相關內容。此時推薦您根據日志,找到模型或插件的下載路徑,手動下載模型并上傳到OSS進行掛載,詳情請參見如何掛載自己的模型及輸出目錄等內容。如果仍需要連接互聯網,請參見配置網絡連通和公網連接及白名單配置進行公網連接配置。
如何將WebUI頁面的默認語言切換為英文?
在Stable Diffusion WebUI頁面單擊設置。
在左側導航欄單擊用戶界面,在右側頁面本地化區域,選擇無。
在Stable Diffusion WebUI頁面上方,單擊保存設置,保存成功后單擊重載前端。
重新刷新WebUI頁面,即可切換為英文。
如何更方便地管理自己的文件系統?
在部署標準版、集群版WebUI服務時,系統已默認在運行命令中增加了--filebrowser參數,您可以直接通過WebUI界面管理您的文件系統。具體操作步驟如下:
服務部署完成后,單擊服務方式列下的查看Web應用。
在Stable Diffusion WebUI頁面,單擊FileBrowser頁簽。您可以直接查看文件系統,或進行上傳、下載操作。
服務啟動時支持配置哪些參數?
公共參數
公共參數
功能說明
使用建議
--blade
啟用PAI-blade加速,提升出圖速度。
建議開啟。
--filebrowser
支持您自主上傳、下載模型或圖片的插件。
默認啟用。
--data-dir /code/stable-diffusion-webui/data-oss
持久化存儲掛載使用的路徑。
掛載持久化存儲時使用,默認起始路徑為
/code/stable-diffusion-webui/
,也可以使用相對路徑。--api
WebUI的API調用模式。
默認啟用。
--enable-nsfw-censor
默認關閉。如果您有安全合規需求,則可以選擇開啟鑒黃過濾功能。
根據業務需要進行調整。
--always-hide-tabs
指定部分Tab頁處于隱藏狀態。
根據業務需要進行調整。
--min-ram-reserved 40 --sd-dynamic-cache
緩存Stable Diffusion大模型到內存中。
無。
集群版參數
說明ckpt的大模型和ControlNet的大模型會自動加載公共目錄下的文件和您自定義的文件。
集群版參數
功能說明
使用建議
--lora-dir
指定公共LoRA模型目錄,例如:
--lora-dir /code/stable-diffusion-webui/data-oss/models/Lora
。默認不配置,用戶的所有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接口中除了必填參數以外,還可以添加一些可選參數用于實現更加豐富的功能或定制化需求:
可以指定Stable Diffusion模型、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:指定Stable Diffusion模型參數,并且可以自動切換到大模型。
sd_vae:指定VAE模型。
save_dir:指定生成圖片的保存路徑。
發送同步接口請求示例如下:
# 調用同步接口驗證模型效果。
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": ""
}
發送異步接口請求示例如下:
# 將數據直接送入異步隊列。
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", # 使用的script名字,不使用的話不要加這個字段
#"script_args": ["Outpainting", 128, 8, ["left", "right", "up", "down"], 1, 0.05] # 對應script腳本的參數,此處依次對應: 固定字段, pixels, mask_blur, direction, 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":""
}
txt2img使用controlnet的數據格式
請求數據格式如下:
{
"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":""
}
相關文檔
通過EAS,您還可以完成以下場景化部署:
部署支持WebUI和API調用的LLM大語言模型,并在部署LLM應用后,利用LangChain框架集成企業知識庫,實現智能問答和自動化功能。詳情請參見5分鐘使用EAS一鍵部署LLM大語言模型應用。
部署基于ComfyUI和Stable Video Diffusion模型的AI視頻生成服務,幫助您完成社交平臺短視頻內容生成、動畫制作等任務。詳情請參見AI視頻生成-ComfyUI鏡像部署。
部署集成了大語言模型(LLM)和檢索增強生成(RAG)技術的對話系統服務,適用于問答、摘要生成和依賴外部知識的自然語言處理任務。詳情請參見大模型RAG對話系統。
在AI繪畫場景中,您可以將經過訓練的LoRa模型應用于StableDiffusion(SD)服務,作為輔助模型,以提升SD繪畫的效果,詳情請參見5分鐘使用EAS一鍵部署Kohya SD模型微調應用。
更多關于服務調用時支持使用的接口列表和使用示例,請參見服務調用SDK。
更多關于EAS產品的計費詳情,請參見模型在線服務(EAS)計費說明。