AI 应用是针对大模型在线推理场景推出的一站式开发部署运维平台。本文为您介绍如何通过模板一键部署基于开源 SDWebUI 绘画的 AIGC 服务。
说明
【邀测·申请试用】AI 应用当前邀测开放。如需体验,请联系您的售前经理或解决方案经理。
Stable Diffusion 是一种 AI 绘画生成工具,通过模拟扩散过程,将噪声图像转化为目标图像,具有较强的稳定性和可控性,可以将文本信息或者图像信息自动转换成高质量、高分辨率且视觉效果良好、多样化的图像。Stable Diffusion 可为设计师提供创意图像素材以及处理图像修复、提高图像分辨率、修改图像风格等任务,辅助实现创意落地。Stable Diffusion WebUI 则进一步提供生图的可视化 Web 操作页面,大大降低了其使用门槛,即使没有 AI 基础的人也能够快速上手。
容器服务 VKE
持续交付 CP
(可选)如需挂载模型文件,请完成以下准备工作,任选一种存储即可。
(可选)如需配置外部访问方式,请完成以下准备工作,任选一种方式即可。
登录应用管理页面。
登录 持续交付控制台。
在左侧导航栏选择 工作区。
单击目标工作区名称,进入当前工作区。
在左侧导航栏选择 应用交付 > 应用管理。
在应用管理页面,单击 创建应用。
在创建应用页面,选择 AI 应用。
选择 AI 生图 - Stable Diffusion WebUI 模板,并单击 下一步:应用配置。
按要求填写应用的相关配置信息。配置完成后单击 确定,应用将开始创建并部署。
配置项 | 说明 |
---|---|
应用标识 | 根据界面提示填写应用标识。应用标识是应用的唯一标识,创建后不可更改。 |
应用显示名 | 自定义应用的显示名称。 |
描述 | 填写当前应用的备注信息,可以为空。 |
配置项 | 说明 |
---|---|
部署资源 | 选择前提条件中接入的 VKE 部署集群。 注意 如需以弹性容器实例方式部署,仅适用于网络模型为 VPC-CNI 的 VKE 集群,且集群中需提前安装 vci-virtual-kubelet 组件。 |
命名空间 | 选择或输入要部署的命名空间。输入的命名空间不存在时会自动创建。 |
环境标识 | 自定义当前环境的唯一标识。环境标识创建成功后不支持修改。 |
配置项 | 说明 |
---|---|
镜像选择 | 本模板使用预置镜像 SD WebUI。 |
模型 | 支持 官方模型 和 自持模型,请按需选择。
|
插件 | 可选配置。将其他依赖资源,例如 LoRA 插件、VAE 模型、CLIP 模型等资源挂载到服务中。
|
出图位置 | 如果您希望对输出物进行持久化存储,需要对出图目录进行挂载。
|
启动命令 | 设置应用的启动命令和监听的容器端口。默认为 |
勾选以弹性容器实例方式部署
配置项 | 说明 |
---|---|
实例数 | 根据业务规模,设置应用的副本数。 |
弹性容器实例 | 保持勾选 以弹性容器实例方式部署。使用该方式部署应用,无需管理底层云服务器等基础设施,只需提供镜像即可运行容器,并为实际消耗的资源付费。计费详情,请参见 弹性容器计费说明。 |
日志采集 | 是否通过火山引擎日志服务 TLS 采集 VCI 容器日志,对日志进行持久化存储。
注意 开启日志采集后,请确保已在 VKE 集群的日志中心中完成相关日志采集规则的配置,保证日志可正常投递至您配置的项目和主题中。具体操作请参见 采集容器日志。 |
资源配置类型 | 根据业务需求选择要使用的实例规格。不同计算规格提供的虚拟化能力不同,详情请参见 VCI 实例规格介绍。
|
系统盘 | 设置系统盘容量。系统盘主要用于缓存镜像,容量必须大于镜像大小。 说明 如果您在 VCI 侧 申请 了手动指定系统盘大小的邀测功能,支持在此处自定义系统盘的容量。 |
不勾选以弹性容器实例方式部署
配置项 | 说明 |
---|---|
实例数 | 根据业务规模,设置应用的副本数。 |
资源配置类型 |
|
配置 AI 应用的访问方式。详细内容可参见 访问设置。
验证应用是否部署成功
在应用的 基本信息 > 资源配置 页签,查看应用的部署进度。支持通过实例的 运行状态、实时日志 和 事件,查看应用详细的启动和运行信息。
访问 SD WebUI
应用部署成功后,可在 访问设置 区域复制应用的访问地址。通过该地址去访问 SD WebUI。
文生图
在 SD WebUI 的 txt2img 页签中,输入正向和反向提示词,单击 Generate,即可生成描述提示词的图片。
from datetime import datetime import urllib.request import base64 import json import time import os import requests webui_server_url = os.environ.get('SD_WEB_UI_URL', 'http://127.0.0.1:7860') out_dir = os.environ.get('API_OUT_DIR', 'api_out') out_dir_t2i = os.path.join(out_dir, 'txt2img') out_dir_i2i = os.path.join(out_dir, 'img2img') os.makedirs(out_dir_t2i, exist_ok=True) os.makedirs(out_dir_i2i, exist_ok=True) def timestamp(): return datetime.fromtimestamp(time.time()).strftime("%Y%m%d-%H%M%S") def encode_file_to_base64(path): with open(path, 'rb') as file: return base64.b64encode(file.read()).decode('utf-8') def decode_and_save_base64(base64_str, save_path): with open(save_path, "wb") as file: file.write(base64.b64decode(base64_str)) def call_api(api_endpoint, **payload): data = json.dumps(payload).encode('utf-8') request = urllib.request.Request( f'{webui_server_url}/{api_endpoint}', headers={'Content-Type': 'application/json'}, data=data, ) response = requests.post( f'{webui_server_url}/{api_endpoint}', data=data, headers={'Content-Type': 'application/json'}, timeout= 30, ) return response.json() def call_txt2img_api(**payload): response = call_api('sdapi/v1/txt2img', **payload) for index, image in enumerate(response.get('images')): save_path = os.path.join(out_dir_t2i, f'txt2img-{timestamp()}-{index}.png') print("save to: ", save_path) decode_and_save_base64(image, save_path) def call_img2img_api(**payload): response = call_api('sdapi/v1/img2img', **payload) for index, image in enumerate(response.get('images')): save_path = os.path.join(out_dir_i2i, f'img2img-{timestamp()}-{index}.png') decode_and_save_base64(image, save_path) if __name__ == '__main__': payload = { "prompt": "masterpiece, (best quality:1.1), 1girl <lora:lora_model:1>", # extra networks also in prompts "negative_prompt": "", "seed": 1, "steps": 20, "width": 512, "height": 512, "cfg_scale": 7, "sampler_name": "DPM++ 2M", "n_iter": 1, "batch_size": 1, } call_txt2img_api(**payload)
SD_WEB_UI_URL="xxx" # 替换为您的 SD 访问地址。 python3 client.py # save to: api_out/txt2img/txt2img-20240726-073928-0.png