O Stable Diffusion (SD) é um modelo avançado de geração de imagens, capaz de criar imagens de alta qualidade e resolução. O Stable Diffusion WebUI oferece uma interface visual baseada no Gradio, com um conjunto abrangente de ferramentas para geração de imagens. O Elastic Algorithm Service (EAS) oferece suporte à implantação baseada em cenários. Você pode implantar um serviço do SD WebUI com apenas um clique, configurando poucos parâmetros.
Recursos e vantagens
Em comparação com os serviços autogerenciados, o PAI-EAS oferece as seguintes vantagens:
Implantação com um clique: as imagens de tempo de execução pré-configuradas contêm todas as dependências.
Auto Scaling de GPU: ajusta dinamicamente os recursos de GPU com base na demanda.
Recursos de nível corporativo: isolamento multiusuário, compartilhamento de GPU e alocação de custos.
Gerenciamento integrado de arquivos: a extensão FileBrowser facilita o upload de modelos.
Escolha a versão adequada
Versão | Cenários | Método de invocação | Faturamento |
Edição Standard | Testes pessoais e desenvolvimento de protótipos | WebUI, chamadas de API (síncronas) | A cobrança baseia-se na configuração da implantação. Para mais informações, consulte Billing of EAS. |
Edição de API | APIs de ambiente de produção, cenários de alta concorrência | Chamadas de API (síncronas e assíncronas) | |
Edição Cluster WebUI | Colaboração em equipe, equipes de design | WebUI | |
Edição Serverless Nota Esta edição está disponível apenas nas regiões China (Shanghai) e China (Hangzhou). | Cargas de trabalho elásticas, otimização de custos | WebUI | A implantação do serviço é gratuita. A cobrança ocorre apenas pela duração da geração de imagens. |
Início rápido: implante serviços de geração de arte com IA usando um modelo baseado em cenários
Acesse o PAI console. Selecione uma região na parte superior da página. Em seguida, selecione o workspace desejado e clique em Enter Elastic Algorithm Service (EAS).
Na página Elastic Algorithm Service (EAS), clique em Deploy Service. Em seguida, na área Scenario-based Model Deployment, clique em AI Painting - SD Web UI Deployment.
-
Configure os seguintes parâmetros principais:
Version: selecione a Edição Standard.
Model Settings: selecione OSS e o caminho de um bucket para armazenar os arquivos de modelo e as imagens geradas pela inferência.
Instance Type: selecione um tipo de GPU. A especificação recomendada é
ml.gu7i.c16m60.1-gu30, pois oferece o melhor custo-benefício.
Após configurar os parâmetros, clique em Deploy. Aguarde de 5 a 10 minutos até que o status do serviço mude para Running.
Invoque o serviço
Invoque pelo WebUI
Use o WebUI para invocar serviços das edições Standard, Cluster WebUI e Serverless. Siga estas etapas:
Clique no nome do serviço de destino para acessar a página Overview e, em seguida, clique em Web applications no canto superior direito.
-
Execute a validação de inferência do modelo.
Na página do Stable Diffusion WebUI, na aba Text-to-Image, insira um prompt positivo, como
cute dog. Em seguida, clique em Generate para criar a arte com IA.
Invoque por chamadas de API síncronas
Após implantar um serviço da Edição Standard ou da Edição de API, envie requisições de API síncronas.
Consulte as informações do endpoint
Após a implantação do serviço, clique no nome do serviço para abrir a página Overview.
Na área Basic Information, clique em View Endpoint Information.
Na página Invocation Information, obtenha o endpoint público do serviço e o token.
Exemplos de chamada
Salve imagens em um dispositivo local
import requests
import base64
from PIL import Image
import io
# IMPORTANT: Remove the trailing slash (/) from the endpoint URL.
SERVICE_URL = "<your_endpoint_url>"
TOKEN = "<your_token>"
def generate_image(prompt: str) -> Image.Image:
"""Generates an image based on 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 the image
image = generate_image("a serene mountain landscape at sunset")
image.save("output.png")
Salve imagens no OSS
import requests
# IMPORTANT: Remove the trailing slash (/) from the endpoint URL.
SERVICE_URL = "<your_endpoint_url>"
TOKEN = "<your_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 path of the saved image
data = response.json()
# This is the mount_path corresponding to the default mounted OSS folder when you deploy the EAS service.
mount_path = "/code/stable-diffusion-webui/data"
# This is the OSS bucket address you selected when you deployed the EAS service.
oss_url = "oss://examplebucket/data-oss"
for idx, img_path in enumerate(data['parameters']['image_url'].split(',')):
# Get the actual address of the generated image in OSS.
img_oss_path = img_path.replace(mount_path, oss_url)
print(img_oss_path)
Use também os formatos de dados LoRA e ControlNet no corpo da requisição.
Use uma configuração de modelo LoRA nos dados da requisição
Ao enviar uma requisição de serviço, adicione <lora:yaeMikoRealistic_Genshin:1000> ao corpo da requisição para incluir um modelo LoRA. Para mais informações, consulte Lora.
O exemplo a seguir mostra a configuração do corpo da requisição.
{
"prompt":"girls <lora:yaeMikoRealistic_Genshin:1>",
"steps":20,
"save_images":true
}
Use o formato de dados ControlNet nos dados da requisição
Usar o formato de dados ControlNet nas requisições de API permite realizar transformações comuns em imagens. Para mais informações sobre como configurar isso, consulte ControlNet data format for text-to-image.
Invoque por chamadas de API assíncronas
Após implantar um serviço da Edição de API, envie requisições de API assíncronas. No modo assíncrono, o cliente não precisa aguardar o resultado; em vez disso, recebe os resultados enviados pelo servidor por meio de uma assinatura. Siga estas etapas:
Consulte as informações de invocação
Após a implantação bem-sucedida do serviço, clique no nome do serviço para acessar a página Overview.
Na área Basic Information, clique em View Endpoint Information.
Na página Invocation Information, clique na aba Asynchronous Invocation para obter o endereço de invocação público e o token.
Envie uma requisição
O cliente envia uma requisição ao servidor por meio de uma operação de API assíncrona.
import requests
SERVICE_URL = "<your_public_input_endpoint>"
TOKEN = "<your_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"Task enqueued: {response.json()}")
-
A fila assíncrona tem limites para o tamanho das requisições de entrada e dos resultados de saída, que normalmente não devem exceder 8 KB. Portanto, ao enviar requisições, atenda às seguintes condições:
Se os dados da requisição contiverem imagens, use URLs para passar as informações da imagem. O Stable Diffusion WebUI baixa e analisa esses dados automaticamente.
Para garantir que o resultado retornado não contenha os dados da imagem original, use
save_dirpara especificar o caminho de salvamento das imagens geradas. Para mais informações, consulte Additional parameters configurable for API operations.
Resultados da assinatura
O cliente recebe os resultados por meio de uma assinatura. Após o servidor processar a requisição, o resultado é enviado automaticamente para o cliente.
from eas_prediction import QueueClient
# You must adjust the endpoint URL format to match the example: 112231234124214.cn-hangzhou.pai-eas.aliyuncs.com
SERVICE_URL = "<your_endpoint_url>"
TOKEN = "<your_token>"
# The service name configured when the service was created
SERVICE_NAME = "<your_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 oferece suporte a novos recursos com base nas operações nativas da API do Stable Diffusion WebUI. Adicione parâmetros opcionais aos dados da requisição para implementar mais recursos. Para mais informações, consulte Additional parameters configurable for API operations.
Opções avançadas de implantação
Implantação personalizada
Implantação baseada em json
Instale plug-ins para recursos aprimorados
Instale plug-ins no Stable Diffusion WebUI para estender sua funcionalidade. O PAI fornece vários plug-ins pré-instalados, como o BeautifulPrompt, que expande e refina prompts. A seção a seguir usa o BeautifulPrompt como exemplo para mostrar como instalar e usar um plug-in.
Instale um plug-in
Visualize e instale plug-ins na aba Extensions da página do WebUI. Siga estas etapas:
Clique no nome do serviço de destino para acessar a página Overview e, em seguida, clique em Web applications no canto superior direito.
-
Na página do WebUI, na aba Extensions, verifique se o BeautifulPrompt está selecionado. Caso não esteja, selecione o plug-in e clique em Apply and restart UI para recarregar o plug-in BeautifulPrompt.
Ao instalar o plug-in, a página do WebUI reinicia automaticamente. Após o recarregamento, execute a validação de inferência.
Use o plug-in para validação de inferência
-
Mude para a aba BeautifulPrompt, insira um prompt simples na caixa de texto e clique em Generate para gerar um prompt mais detalhado.
Configure os seguintes parâmetros de geração:
Top K: 50
Top P: 0.9
Temperature: 0.9
Repetition penalty: 1.05
Max new tokens: 384
Num prompts: 5
Após clicar em Generate, o painel de resultados à direita exibe vários prompts expandidos do Stable Diffusion. À direita de cada resultado, os botões to txt2img e to img2img permitem enviar o prompt diretamente para a página do recurso correspondente.
O PAI fornece vários modelos de geração de prompts, e cada um gera prompts ligeiramente diferentes. Os modelos são:
pai-bloom-1b1-text2prompt-sd-v2: destaca-se na geração de prompts para cenas complexas.
pai-bloom-1b1-text2prompt-sd: gera prompts que descrevem um único objeto.
Escolha o modelo adequado para gerar prompts conforme a necessidade. Marque também a caixa de seleção Negative prompt para gerar prompts negativos ao mesmo tempo.
-
Selecione o prompt que deseja usar e clique em to txt2img à direita do prompt.
A página muda automaticamente para a aba Text-to-Image e preenche a área do prompt.
-
Clique em Generate para gerar uma imagem no lado direito da página do WebUI.
O prompt aprimorado inclui descritores ricos de qualidade de imagem e composição, como masterpiece, best quality e ultra-detailed, que ajudam a gerar imagens de alta qualidade no estilo anime.
O uso do plug-in BeautifulPrompt melhora a qualidade estética das imagens geradas e ajuda a adicionar mais detalhes em comparação com a não utilização do plug-in. A tabela a seguir compara os resultados com e sem o BeautifulPrompt para outros cenários.
Prompt de entrada
Resultado sem o BeautifulPrompt
Resultado com o BeautifulPrompt
a cat


a giant tiger


Perguntas frequentes
P: Como monto meus próprios modelos e diretórios de saída?
P: Os plug-ins baixados e os arquivos enviados são salvos na instância se a configuração não for alterada?
P: O que faço se o serviço ficar travado por muito tempo?
P: Como altero o idioma padrão da página do 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 do WebUI
Apêndice
Parâmetros configuráveis na inicialização do serviço
-
Parâmetros comuns
Parâmetro comum
Descrição do recurso
Recomendação
--bladeAtiva a aceleração do PAI-Blade para acelerar a geração de imagens.
É recomendável ativar este recurso.
--filebrowserUm plug-in que permite fazer upload e download de modelos ou imagens.
Ativado por padrão.
--data-dir /code/stable-diffusion-webui/data-ossO caminho usado para montagens de armazenamento persistente.
Use ao montar armazenamento persistente. O caminho inicial padrão é
/code/stable-diffusion-webui/. Você também pode usar um caminho relativo.--apiO modo de chamada de API para o WebUI.
Ativado por padrão.
--enable-nsfw-censorDesativado por padrão. Se houver requisitos de segurança e conformidade, ative o recurso de detecção de pornografia.
Ajuste conforme a necessidade.
--always-hide-tabsEspecifica que algumas abas fiquem ocultas.
Ajuste conforme a necessidade.
--min-ram-reserved 40 --sd-dynamic-cacheArmazena em cache o modelo grande do Stable Diffusion na memória.
Nenhuma.
-
Parâmetros da edição Cluster
NotaOs LLMs de checkpoint (ckpt) e os LLMs do ControlNet carregam automaticamente arquivos do diretório público e os arquivos personalizados.
Parâmetro da edição Cluster
Descrição do recurso
Recomendação
--lora-dirEspecifica 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 os modelos LoRA na pasta do usuário são carregados. Ao especificar um diretório específico, todos os usuários carregarão tanto os modelos LoRA desse diretório público quanto os modelos LoRA em suas próprias pastas.
--vae-dirEspecifica 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 os modelos VAE na pasta do usuário são carregados. Ao especificar um diretório específico, todos os usuários carregarão apenas os modelos VAE desse diretório público.
--gfpgan-dirEspecifica 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 os modelos GFPGAN na pasta do usuário são carregados. Ao especificar um diretório específico, todos os usuários carregarão apenas os modelos GFPGAN desse diretório público.
--embeddings-dirEspecifica 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 os modelos de embeddings na pasta do usuário são carregados. Ao especificar um diretório específico, todos os usuários carregarão apenas os modelos de embeddings desse diretório público.
--hypernetwork-dirEspecifica o diretório público de modelos de hypernetwork. Por exemplo,
--hypernetwork-dir /code/stable-diffusion-webui/data-oss/models/hypernetworks.Não configurado por padrão. Todos os diretórios de hypernetwork do usuário são isolados, e apenas os modelos de hypernetwork na pasta do usuário são carregados. Ao especificar um diretório específico, todos os usuários carregarão apenas os modelos de hypernetwork desse diretório público.
--root-extensionsO diretório de plug-ins usa um diretório compartilhado. Com este parâmetro, todos os usuários veem exatamente os mesmos plug-ins.
Use este parâmetro quando precisar instalar ou gerenciar plug-ins de forma centralizada.
Parâmetros adicionais configuráveis para operações de API
EAS oferece suporte a novos recursos com base na API nativa do Stable Diffusion WebUI. Além dos parâmetros obrigatórios, adicione parâmetros opcionais à operação de API para implementar mais recursos ou requisitos personalizados.
Especifique o modelo do Stable Diffusion, o modelo VAE e o diretório de salvamento.
Insira parâmetros usando uma URL e receba os códigos de status correspondentes.
Acesse as imagens geradas e suas imagens correspondentes do ControlNet usando uma URL.
A seguir, exemplos de uso.
Exemplos de requisição e resposta de texto para imagem
O exemplo a seguir mostra o formato dos dados da requisiçã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"
}
A lista a seguir descreve os parâmetros principais.
sd_model_checkpoint: especifica o checkpoint do modelo Stable Diffusion, o que permite a troca automática para um modelo grande.
sd_vae: especifica o modelo VAE.
save_dir: especifica o caminho de salvamento para as imagens geradas.
O exemplo a seguir mostra uma requisição de API síncrona.
# Call the synchronous API operation to validate the model effect.
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 a seguir mostra o formato dos dados de resposta:
{
"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 a seguir mostra uma requisição de API assíncrona:
# 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 requisição de imagem para imagem
O exemplo a seguir mostra o formato dos dados da requisiçã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", # Name of the script to use. Do not add this field if not using a script.
#"script_args": ["Outpainting", 128, 8, ["left", "right", "up", "down"], 1, 0.05] # Parameters for the script, corresponding to: fixed field, pixels, mask_blur, direction, noise_q, color_variation
}
O exemplo a seguir mostra o formato dos 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":""
}
Formato de dados do ControlNet para texto para imagem
O formato dos dados da requisição é o seguinte.
{
"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"
}
O exemplo a seguir mostra o formato dos 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 mais informações sobre o faturamento do EAS, consulte Billing of Elastic Algorithm Service (EAS).