Stable Diffusion(SD)是强大的图像生成模型,能够生成高质量、高分辨率的图像,并具有良好的稳定性和可控性。Stable Diffusion WebUI开源项目在模型的基础上进行封装,基于Gradio开发了可视化图形界面,为用户提供了丰富的生图工具。EAS提供了场景化部署方式,您只需配置几个参数,即可一键部署基于Stable Diffusion WebUI的服务。
功能与优势
PAI-EAS 相比自建服务具有以下优势:
一键部署:预配置镜像,包含所有依赖项。
GPU 弹性伸缩:根据需求动态调整 GPU 资源。
企业级功能:多用户隔离、GPU 共享、成本分摊。
集成文件管理:FileBrowser 扩展便于上传模型。
选择适合版本
版本 | 适用场景 | 调用方式 | 计费 |
标准版 | 个人测试、原型开发 | WebUI、API调用(同步) | 根据部署配置进行计费,详情请参见EAS计费说明。 |
API版 | 生产环境 API、高并发场景 | API调用(同步 & 异步) | |
集群版WebUI | 团队协作、设计团队 | WebUI | |
Serverless版 说明 仅支持华东2(上海)、华东1(杭州)地域。 | 弹性负载、成本优化 | WebUI | 服务部署完全免费,只根据使用出图的时长进行计费。 |
快速入门:使用场景化方式部署AI绘画
登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS。
在模型在线服务(EAS)页面,单击部署服务,然后在场景化模型部署区域,单击AI绘画-SDWebUI部署。
配置以下关键参数:
版本选择:选择标准版。
模型配置:用来存放模型文件和推理生成的图片,选择对象存储(OSS)并选择Bucket路径。
实例规格:选择GPU类型,规格推荐
ml.gu7i.c16m60.1-gu30(性价比最高)。
参数配置完成后,单击部署。等待 5-10 分钟,直到服务状态变为运行中。
调用服务
使用WebUI调用
通过WebUI,您可以调用标准版、集群版WebUI和Serverless版的服务。具体操作步骤如下:
单击目标服务名称进入概览页面,在右上角单击Web应用。
进行模型推理验证。
在Stable Diffusion WebUI页面文生图页签中,输入正向提示词Prompt,例如
cute dog,然后单击生成,即可完成AI绘图,效果图如下:
使用API同步调用
标准版和API版服务部署成功后,您可以参照以下操作步骤发送同步接口请求。
查询调用信息
服务部署成功后,单击服务名称,进入概览页面。
在基本信息区域中,单击查看调用信息。
在调用信息页面,获取服务公共调用地址和Token。
调用示例
图片保存至本地
import requests
import base64
from PIL import Image
import io
# 注意 !!!!:请删除调用地址末尾的 /。
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
# 注意 !!!!:请删除调用地址末尾的 /。
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地址bucket
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数据格式可以方便地对图像进行一些常见的变换操作,比如使图像保持水平或垂直等。具体配置方法,请参见txt2img使用controlnet的数据格式。
使用API异步调用
API版服务部署成功后,您可以向该服务发送异步接口请求,即客户端不再同步等待结果,通过订阅的方式在请求计算完成后等待服务端的结果推送。具体操作步骤如下:
查询调用信息
服务部署成功后,单击服务名称,进入概览页面。
在基本信息区域中,单击查看调用信息。
在调用信息页面,单击切换至异步调用页签,获取公网输入调用地址和Token。
发送请求
客户端通过异步接口向服务端发送请求
import requests
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"任务已入队: {response.json()}")
异步队列对输入请求和输出结果的大小都有限制,通常不建议超过8 KB。因此,在发送请求时,需要满足以下两个条件:
如果请求数据中包含图片,建议使用URL来传递图片信息。Stable Diffusion WebUI内部会自动下载并解析这些图片数据。
为了确保返回结果中没有原始图片数据,建议您使用save_dir来指定生成图片的保存路径。具体操作,请参见API接口额外支持配置的参数。
订阅结果
客户端采用订阅方式,一旦服务端完成相关请求的处理,便会自动推送结果至客户端,实现高效异步通信。
from eas_prediction import QueueClient
# 请必须将调用地址的格式调整为示例格式:112231234124214.cn-hangzhou.pai-eas.aliyuncs.com
SERVICE_URL = "<调用地址>"
TOKEN = "<Token>"
# 创建服务时配置的服务名称
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"任务 {result.tags.get('task_id')} 已完成")
print(f"图片地址: {result.data}")EAS基于原生Stable Diffusion WebUI接口支持了一些新特性,您可以在请求数据中添加一些可选参数用于实现更加丰富的功能或定制化需求。具体操作,请参见API接口额外支持配置的参数。
高级部署选项
自定义部署
JSON独立部署
安装插件实现增强功能
您可以为Stable Diffusion WebUI配置插件,以实现更加多样化的功能。PAI预置了丰富的插件,例如PAI自主研发的BeautifulPrompt插件,用来实验Prompt的扩写和美化。下文将以BeautifulPrompt插件为例,为您介绍插件的安装和使用方法。
安装插件
您可以在WebUI页面的扩展页签中,查看并安装插件。具体操作步骤如下:
单击目标服务名称进入概览页面,在右上角单击Web应用。
在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


常见问题
Q:如何挂载自己的模型及输出目录等内容
Q:下载的插件、上传的文件等,在配置不变的情况下,会保存在实例中么?
Q:服务长时间卡住怎么办?
Q:如何将WebUI页面的默认语言切换为英文?
Q:如何管理自己的文件系统?
Q:报错:No such file or directory: 'data-oss/data-********.png'
Q:无法访问WebUI页面
附录
服务启动时支持配置的参数
公共参数
公共参数
功能说明
使用建议
--blade启用PAI-blade加速,提升出图速度。
建议开启。
--filebrowser支持您自主上传、下载模型或图片的插件。
默认启用。
--data-dir /code/stable-diffusion-webui/data-oss持久化存储挂载使用的路径。
挂载持久化存储时使用,默认起始路径为
/code/stable-diffusion-webui/,也可以使用相对路径。--apiWebUI的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产品的计费详情,请参见模型在线服务(EAS)计费说明。



