Implante a WebUI do Stable Diffusion no EAS para gerar imagens com IA usando modelos de implantação com um clique e dimensionamento automático de GPU.
Recursos e benefícios
Vantagens do PAI-EAS em relação a serviços autoconstruídos:
Implantação com um clique: Imagens pré-configuradas incluem todas as dependências.
Dimensionamento automático de GPU: Ajusta dinamicamente os recursos de GPU conforme a demanda.
Recursos de nível empresarial: Isolamento multiusuário, compartilhamento de GPU e alocação de custos.
Gerenciamento integrado de arquivos: A extensão FileBrowser integrada simplifica o upload de modelos.
Selecione uma versão
|
Versão |
Cenários |
Método de invocação |
Faturamento |
|
Edição Standard |
Testes pessoais, desenvolvimento de protótipos |
WebUI, invocação de API (síncrona) |
Faturamento baseado na configuração da implantação. Para mais detalhes, consulte Visão geral do faturamento do EAS. |
|
Edição API |
API para ambiente de produção, cenários de alta concorrência |
Invocação de API (síncrona e assíncrona) |
|
|
WebUI em cluster |
Colaboração em equipe, equipes de design |
WebUI |
|
|
Edição Serverless Nota
Suportado apenas nas regiões China (Shanghai) e China (Hangzhou). |
Carga elástica, otimização de custos |
WebUI |
A implantação do serviço é gratuita. O faturamento baseia-se apenas na duração da geração de imagens. |
Início rápido
Faça login no PAI console. Selecione uma região na parte superior da página. Em seguida, selecione o workspace desejado e clique em Elastic Algorithm Service (EAS).
Na página Elastic Algorithm Service (EAS), clique em Deploy Service. Na área Scenario-based Model Deployment, clique em AI Painting - SD Web UI Deployment.
-
Configure os parâmetros principais:
Version: Selecione Standard edition.
Model Settings: Armazena arquivos de modelo e imagens geradas por inferência. Selecione OSS e escolha um caminho de bucket.
Instance Type: Selecione o tipo GPU. O tipo de instância recomendado é
ml.gu7i.c16m60.1-gu30(melhor custo-benefício).
Clique em Deploy. Aguarde de 5 a 10 minutos até que o status do serviço mude para Running.
Invocar o serviço
WebUI
Acesse os serviços das edições Standard, WebUI em cluster e Serverless pela WebUI:
Clique no nome do serviço desejado para abrir a página Overview e clique em Web applications no canto superior direito.
-
Verifique a inferência do modelo.
Na página da WebUI do Stable Diffusion, na aba Text-to-Image, insira um prompt positivo como
cute dog. Clique em Generate para concluir a geração de arte por IA. Resultado:
API síncrona
Após implantar serviços da edição Standard ou da edição API, envie solicitações de API síncronas.
Obter endpoint
Após implantar o serviço, clique no nome do serviço para acessar a página Overview.
Em Basic Information, clique em View Endpoint Information.
Em Invocation Information, obtenha o endpoint público do serviço e o Token.
Exemplos
Salvar imagens localmente
import requests
import base64
from PIL import Image
import io
# Important: Remove the trailing / from the service URL.
SERVICE_URL = "<service_url>"
TOKEN = "<Token>"
def generate_image(prompt: str) -> Image.Image:
"""Generate an image from a text prompt."""
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()
# Decode the first image
img_data = response.json()["images"][0]
return Image.open(io.BytesIO(base64.b64decode(img_data)))
# Generate and save
image = generate_image("a serene mountain landscape at sunset")
image.save("output.png")
Salvar imagens no OSS
import requests
# Important: Remove the trailing / from the service 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}
)
# Get the saved image paths
data = response.json()
# This corresponds to the mount_path of the OSS folder mounted when deploying as an EAS Service.
mount_path = "/code/stable-diffusion-webui/data"
# This corresponds to the OSS bucket URL selected when deploying as an EAS Service.
oss_url = "oss://examplebucket/data-oss"
for idx, img_path in enumerate(data['parameters']['image_url'].split(',')):
# Get the actual OSS path of the generated image.
img_oss_path = img_path.replace(mount_path, oss_url)
print(img_oss_path)
Para recursos avançados, use LoRA e ControlNet nas solicitações de API.
Usar modelos LoRA nas solicitações
Adicione <lora:yaeMikoRealistic_Genshin:1000> ao campo prompt no corpo da solicitação para aplicar um modelo LoRA. Consulte LoRA.
Exemplo de corpo de solicitação:
{
"prompt":"girls <lora:yaeMikoRealistic_Genshin:1>",
"steps":20,
"save_images":true
}
Usar ControlNet nas solicitações
Utilize o ControlNet nas solicitações de API para transformações de imagem, como manter a orientação horizontal ou vertical. Para detalhes de configuração, consulte txt2img usando formato de dados do ControlNet.
API assíncrona
Após implantar serviços da edição API, envie solicitações de API assíncronas. Os clientes enviam solicitações e inscrevem-se em uma fila de resultados para receber respostas enviadas pelo servidor.
Obter endpoint
Após implantar o serviço, clique no nome do serviço para acessar a página Overview.
Em Basic Information, clique em View Endpoint Information.
Em Invocation Information, alterne para Asynchronous Invocation para obter o endpoint de entrada de rede pública e o Token.
Enviar solicitações
Envie solicitações ao servidor pela API assíncrona.
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()}")
-
A fila assíncrona possui limites de tamanho tanto para solicitações de entrada quanto para resultados de saída (geralmente 8 KB). Ao enviar solicitações:
Se os dados da solicitação incluírem imagens, use URLs para passar as informações da imagem. A WebUI do Stable Diffusion baixa e analisa os dados da imagem automaticamente.
Para excluir dados da imagem original dos resultados, use save_dir para especificar o caminho de salvamento. Para mais detalhes, consulte Parâmetros adicionais suportados pelas operações de API.
Inscrever-se nos resultados
Inscreva-se em uma fila de resultados para receber respostas enviadas pelo servidor após o processamento.
from eas_prediction import QueueClient
# Adjust the service URL format to the example: 112231234124214.cn-hangzhou.pai-eas.aliyuncs.com
SERVICE_URL = "<service_url>"
TOKEN = "<Token>"
# Service name configured during service creation.
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}")
O EAS estende a API nativa da WebUI do Stable Diffusion com parâmetros adicionais. Consulte Parâmetros adicionais suportados pelas operações de API.
Opções avançadas de implantação
Implantação personalizada
Implantação autônoma via JSON
Instalar plugins
Estenda a WebUI do Stable Diffusion com plugins. O PAI pré-instala o BeautifulPrompt, que expande e refina prompts.
Instalar plugin
Visualize e instale plugins na aba Extensions da página da WebUI:
Clique no nome do serviço desejado para abrir a página Overview e clique em Web applications no canto superior direito.
-
Na página da WebUI, sob a aba Extensions, verifique se BeautifulPrompt está selecionado. Caso contrário, selecione o plugin e clique em Apply changes and reload UI para recarregar o plugin BeautifulPrompt.

A página da WebUI reinicia automaticamente quando um plugin é instalado. Após o recarregamento, verifique se a inferência funciona corretamente.
Verificar inferência
-
Alterne para a aba BeautifulPrompt. Na caixa de texto, insira um prompt simples. Clique em Generate para criar um prompt mais detalhado.

O PAI fornece vários modelos de geração de prompts. Cada modelo gera prompts ligeiramente diferentes:
pai-bloom-1b1-text2prompt-sd-v2: Destaca-se na geração de prompts para cenários complexos.
pai-bloom-1b1-text2prompt-sd: Gera prompts que descrevem objetos únicos.
Selecione o modelo apropriado para gerar prompts conforme necessário.

-
Selecione o prompt a ser usado. Clique em to txt2img à direita do prompt.
A página redireciona automaticamente para a aba Text-to-Image e preenche automaticamente a área de prompt.

-
Clique em Generate para gerar uma imagem no lado direito da página da WebUI.

O BeautifulPrompt melhora a estética da imagem e adiciona mais detalhes em comparação com prompts básicos:
Prompt de entrada
Efeito sem BeautifulPrompt
Efeito com BeautifulPrompt
a cat


a giant tiger


Perguntas frequentes
P: Como monto meus diretórios de modelos e de saída?
P: Plugins baixados e arquivos enviados são salvos na instância se a configuração permanecer inalterada?
P: O que fazer se o serviço ficar travado por muito tempo?
P: Como altero o idioma padrão da página da WebUI para inglês?
P: Como gerencio meu sistema de arquivos?
P: Erro: No such file or directory: 'data-oss/data-.png'
P: Não consigo acessar a página da WebUI.
Apêndice
Parâmetros suportados durante a inicialização do serviço
-
Parâmetros comuns
Parâmetro
Descrição
Recomendação
--bladeAtiva a aceleração PAI-Blade para melhorar a velocidade de geração de imagens.
Recomendado.
--filebrowserHabilita upload e download de arquivos para modelos e imagens.
Ativado por padrão.
--data-dir /code/stable-diffusion-webui/data-ossCaminho para montagem de armazenamento persistente.
Use ao montar armazenamento persistente. O caminho inicial padrão é
/code/stable-diffusion-webui/. Caminhos relativos também são suportados.--apiHabilita o acesso à API da WebUI.
Ativado por padrão.
--enable-nsfw-censorDesativado por padrão. Ative para filtragem de conteúdo NSFW se necessário para conformidade.
Ajuste conforme necessário.
--always-hide-tabsOculta abas especificadas da WebUI.
Ajuste conforme necessário.
--min-ram-reserved 40 --sd-dynamic-cacheArmazena o modelo Stable Diffusion em cache na memória para troca mais rápida de modelos.
Opcional.
-
Parâmetros da edição em cluster
NotaModelos grandes de Checkpoint e ControlNet carregam automaticamente arquivos da pasta pública e arquivos personalizados.
Parâmetro
Descrição
Recomendação
--lora-dirEspecifique o diretório público de modelos LoRA, por exemplo:
--lora-dir /code/stable-diffusion-webui/data-oss/models/Lora.Não configurado por padrão. Todos os diretórios LoRA do usuário são isolados, e apenas modelos LoRA nas pastas do usuário são carregados. Quando um diretório específico é especificado, todos os usuários carregam simultaneamente modelos LoRA tanto do diretório público quanto de suas pastas de usuário.
--vae-dirEspecifique o diretório público de modelos VAE, por exemplo:
--vae-dir /code/stable-diffusion-webui/data-oss/models/VAE.Não configurado por padrão. Todos os diretórios VAE do usuário são isolados, e apenas modelos VAE nas pastas do usuário são carregados. Quando um diretório específico é especificado, todos os usuários carregam apenas modelos VAE desse diretório público.
--gfpgan-dirEspecifique o diretório público de modelos GFPGAN, por exemplo:
--gfpgan-dir /code/stable-diffusion-webui/data-oss/models/GFPGAN.Não configurado por padrão. Todos os diretórios GFPGAN do usuário são isolados, e apenas modelos GFPGAN nas pastas do usuário são carregados. Quando um diretório específico é especificado, todos os usuários carregam apenas modelos GFPGAN desse diretório público.
--embeddings-dirEspecifique o diretório público de modelos de embeddings, por exemplo:
--embeddings-dir /code/stable-diffusion-webui/data-oss/embeddings.Não configurado por padrão. Todos os diretórios de embeddings do usuário são isolados, e apenas modelos de embeddings nas pastas do usuário são carregados. Quando um diretório específico é especificado, todos os usuários carregam apenas modelos de embeddings desse diretório público.
--hypernetwork-dirEspecifique o diretório público de modelos hypernetwork, por exemplo:
--hypernetwork-dir /code/stable-diffusion-webui/data-oss/models/hypernetworks.Não configurado por padrão. Todos os diretórios hypernetwork do usuário são isolados, e apenas modelos hypernetwork nas pastas do usuário são carregados. Quando um diretório específico é especificado, todos os usuários carregam apenas modelos hypernetwork desse diretório público.
--root-extensionsO diretório de plugins usa um diretório compartilhado. Após usar este parâmetro, todos os usuários veem plugins idênticos.
Use este parâmetro ao centralizar a instalação ou gerenciamento de plugins.
Parâmetros adicionais para operações de API
EAS estende a API nativa da WebUI do Stable Diffusion com parâmetros opcionais adicionais:
Especifique modelos Stable Diffusion, modelos VAE e diretórios de saída.
Passe parâmetros de entrada via URL e receba códigos de status correspondentes.
Acesse imagens geradas e imagens do ControlNet via URL.
Exemplos:
Exemplos de solicitação e resposta txt2img
Exemplo de solicitação:
{
"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"
}
Parâmetros principais:
sd_model_checkpoint: Especifica o modelo Stable Diffusion e habilita a troca automática de modelos.
sd_vae: Especifica o modelo VAE.
save_dir: Especifica o caminho de salvamento para imagens geradas.
O exemplo de solicitação de API síncrona é o seguinte:
# Invoke the synchronous API to verify model effects.
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"
}'
O exemplo de formato de dados de resposta é o seguinte:
{
"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": ""
}
O exemplo de solicitação de API assíncrona é o seguinte:
# Send data directly to the asynchronous 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"
}'
Exemplo de formato de dados de solicitação img2img
Exemplo de formato de dados de solicitação:
{
"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 script name to use. Do not add this field if not used.
#"script_args": ["Outpainting", 128, 8, ["left", "right", "up", "down"], 1, 0.05] # The parameters corresponding to the script. Here, they correspond to: fixed field, pixels, mask_blur, direction, noise_q, color_variation
}
Exemplo de formato de dados de resposta:
{
"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 usando formato de dados do ControlNet
Formato de dados de solicitação:
{
"alwayson_scripts": {
"sd_model_checkpoint": "deliberate_v2.safetensors", # Model name, required
"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
}
]
}
},
# Main parameters
"prompt": "girls",
"batch_size": 1,
"n_iter": 2,
"width": 576,
"height": 576,
"negative_prompt": "ugly, out of frame"
}
Exemplo de formato de dados de resposta:
{
"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":""
}
Referências
Para detalhes sobre o faturamento do Elastic Algorithm Service, consulte Faturamento do Elastic Algorithm Service.



