You need to enable JavaScript to run this app.
导航
一键部署 AI 生图 Stable Diffusion WebUI
最近更新时间:2024.09.04 16:18:52首次发布时间:2024.08.28 14:53:17

AI 应用是针对大模型在线推理场景推出的一站式开发部署运维平台。本文为您介绍如何通过模板一键部署基于开源 SDWebUI 绘画的 AIGC 服务。

说明

邀测·申请试用】AI 应用当前邀测开放。如需体验,请联系您的售前经理或解决方案经理。

应用介绍

Stable Diffusion 是一种 AI 绘画生成工具,通过模拟扩散过程,将噪声图像转化为目标图像,具有较强的稳定性和可控性,可以将文本信息或者图像信息自动转换成高质量、高分辨率且视觉效果良好、多样化的图像。Stable Diffusion 可为设计师提供创意图像素材以及处理图像修复、提高图像分辨率、修改图像风格等任务,辅助实现创意落地。Stable Diffusion WebUI 则进一步提供生图的可视化 Web 操作页面,大大降低了其使用门槛,即使没有 AI 基础的人也能够快速上手。

前提条件

  • 持续交付 CP

    • 已创建工作区,具体操作请参见 创建工作区
    • 已接入部署资源。部署资源必须为容器服务 VKE 集群。具体操作请参见 接入部署资源
  • (可选)如需挂载模型文件,请完成以下准备工作,任选一种存储即可。

    • 对象存储 TOS
      • 已将模型上传至 TOS Bucket 存储。具体操作请参见 对象存储快速入门
      • 已获取当前账号的访问密钥 AK & SK。建议使用最小化授权的 IAM 用户的访问密钥,要求已授权对应文件的访问权限。具体操作请参见 AI 仓库挂载和存储加速
    • 文件存储 NAS
      • 已将模型上传至 NAS 存储,要求 NAS 与待部署的 VKE 集群处于相同的 VPC。具体操作请参见 文件存储快速入门
    • 制品仓库
      • 已将模型上传至制品仓库存储。具体操作请参见 上传和下载 AI 格式制品快速入门
      • 已获取当前账号的访问密钥 AK & SK。建议使用最小化授权的 IAM 用户的访问密钥,要求该 IAM 用户已授权仓库挂载权限。
  • (可选)如需配置外部访问方式,请完成以下准备工作,任选一种方式即可。

    • API 网关:已创建网关实例,要求网关实例与待部署的 VKE 集群处于相同的 VPC。具体操作请参见 创建实例
    • 负载均衡 CLB:已创建负载均衡实例,要求负载均衡实例与待部署的 VKE 集群处于相同的 VPC。具体操作请参见 创建负载均衡实例

操作步骤

  1. 登录应用管理页面。

    1. 登录 持续交付控制台

    2. 在左侧导航栏选择 工作区

    3. 单击目标工作区名称,进入当前工作区。

    4. 在左侧导航栏选择 应用交付 > 应用管理

  2. 在应用管理页面,单击 创建应用

  3. 在创建应用页面,选择 AI 应用

  4. 选择 AI 生图 - Stable Diffusion WebUI 模板,并单击 下一步:应用配置

  5. 按要求填写应用的相关配置信息。配置完成后单击 确定,应用将开始创建并部署。

基本信息

配置项说明
应用标识根据界面提示填写应用标识。应用标识是应用的唯一标识,创建后不可更改。
应用显示名自定义应用的显示名称。
描述填写当前应用的备注信息,可以为空。

部署集群

配置项说明

部署资源

选择前提条件中接入的 VKE 部署集群。

注意

如需以弹性容器实例方式部署,仅适用于网络模型为 VPC-CNI 的 VKE 集群,且集群中需提前安装 vci-virtual-kubelet 组件。

Namespace输入要部署的命名空间。命名空间不存在时会自动创建。
环境标识自定义当前环境的唯一标识。环境标识创建成功后不支持修改。

模型配置

配置项说明
镜像选择本模板使用预置镜像 SD WebUI

模型

支持 官方模型自持模型,请按需选择。

  • 官方模型:内置 SD 常用官方模型,帮助您快速拉起服务。

  • 自持模型:支持通过以下方式配置您自己的模型文件,请按需选择。

    • TOS 挂载:通过火山引擎对象存储 TOS 挂载模型文件。

      • 选择模型文件所在的 地域Bucket,并填写具体 路径

      • AK & SK:输入当前账号的访问密钥 AccessKey ID(AK)和 Secret Access Key(SK)。建议使用最小化授权的 IAM 用户的访问密钥,要求已授权对应文件的访问权限。

    • 制品库挂载:通过火山引擎制品仓库挂载模型文件。

      • 制品库:选择模型文件所在的 地域实例仓库命名空间模型名称版本。仅支持选择 AI 制品仓库
      • AK & SK:输入当前账号的访问密钥 AccessKey ID(AK)和 Secret Access Key(SK)。建议使用最小化授权的 IAM 用户的访问密钥,要求该 IAM 用户已授权仓库挂载权限。
    • NAS 挂载:通过火山引擎文件存储 NAS 挂载模型文件。

      • 文件系统类型:选择文件系统类型,支持 极速型容量型。要求 NAS 与待部署的 VKE 集群处于相同的 VPC。

      • 挂载点:选择要挂载的 文件系统挂载点

      • 子目录:输入待挂载的文件系统的子目录信息,默认为根目录/

  • 挂载路径:挂载到 SD WebUI 中的目标路径。 SD 模型默认的加载路径为/stable-diffusion-webui/models/Stable-diffusion/

插件

可选配置。将其他依赖资源,例如 LoRA 插件、VAE 模型、CLIP 模型等资源挂载到服务中。
支持以下挂载方式,请按需选择。一个服务可添加多个插件。

  • TOS 挂载:通过火山引擎对象存储 TOS 挂载插件。

    • 选择插件所在的 地域Bucket,并填写具体 路径

    • AK & SK:输入当前账号的访问密钥 AccessKey ID(AK)和 Secret Access Key(SK)。建议使用最小化授权的 IAM 用户的访问密钥,要求已授权对应文件的访问权限。

  • NAS 挂载:通过火山引擎文件存储 NAS 挂载插件。

    • 文件系统类型:选择文件系统类型,支持 极速型容量型。要求 NAS 与待部署的 VKE 集群处于相同的 VPC。

    • 挂载点:选择要挂载的 文件系统挂载点

    • 子目录:输入待挂载的文件系统的子目录信息,默认为根目录/

  • 挂载路径:挂载到 SD WebUI 中的目标路径。SD WebUI 项目的根目录为/stable-diffusion-webui

出图位置

如果您希望对输出物进行持久化存储,需要对出图目录进行挂载。
支持以下挂载方式,请按需选择。

  • TOS 挂载:通过火山引擎对象存储 TOS 挂载出图目录。

    • 选择出图目录所在的 地域Bucket,并填写具体 路径

    • AK & SK:输入当前账号的访问密钥 AccessKey ID(AK)和 Secret Access Key(SK)。建议使用最小化授权的 IAM 用户的访问密钥。

  • NAS 挂载:通过火山引擎文件存储 NAS 挂载出图目录。

    • 文件系统类型:选择文件系统类型,支持 极速型容量型。要求 NAS 与待部署的 VKE 集群处于相同的 VPC。

    • 挂载点:选择要挂载的 文件系统挂载点

    • 子目录:输入待挂载的文件系统的子目录信息,默认为根目录/

  • 挂载路径:挂载到 SD WebUI 中的目标路径。SD WebUI 项目的默认出图目录为/stable-diffusion-webui/outputs

启动命令

设置应用的启动命令和监听的容器端口。默认为python -u webui.py --no-download-sd-model --listen --port 7860,支持根据业务需求修改启动命令。

服务规格

  • 勾选以弹性容器实例方式部署

    配置项说明
    实例数根据业务规模,设置应用的副本数。

    弹性容器实例

    保持勾选 以弹性容器实例方式部署。使用该方式部署应用,无需管理底层云服务器等基础设施,只需提供镜像即可运行容器,并为实际消耗的资源付费。计费详情,请参见 弹性容器计费说明

    说明

    如果您在 VCI 侧申请镜像缓存 的邀测功能,AI 应用创建时将默认开启镜像缓存,加速镜像拉取。

    日志采集

    是否通过火山引擎日志服务 TLS 采集 VCI 容器日志,对日志进行持久化存储。

    • 勾选,开启日志采集。

    • 不勾选,不开启日志采集。

    注意

    开启日志采集后,请确保已在 VKE 集群的日志中心中完成相关日志采集规则的配置,保证日志可正常投递至您配置的项目和主题中。具体操作请参见 采集容器日志

    资源配置类型

    根据业务需求选择要使用的实例规格。不同计算规格提供的虚拟化能力不同,详情请参见 VCI 实例规格介绍

    • 通用型:搭配多种 vCPU、内存配比的通用型规格族。

    • GPU 计算型:基于多种 NVIDIA Tesla 显卡提供的 GPU 计算型实例规格族。

    系统盘

    设置系统盘容量。系统盘主要用于缓存镜像,容量必须大于镜像大小。

    说明

    如果您在 VCI 侧 申请 了手动指定系统盘大小的邀测功能,支持在此处自定义系统盘的容量。

  • 不勾选以弹性容器实例方式部署

    配置项说明
    实例数根据业务规模,设置应用的副本数。

    资源配置类型

    • CPU:定义每个实例的 CPU 规格。其中,CPU 请求 ≤ CPU 上限。

    • 内存:定义每个实例的内存规格。其中,内存请求 ≤ 内存上限。

    • GPU 资源类型:是否使用 GPU 资源。

      • 不开启:使用传统 CPU 计算资源。

      • 开启:使用 GPU 计算资源,当前提供 Nvdia 卡型,支持自定义 GPU 算力

访问配置(可选)

配置 AI 应用的访问方式。详细内容可参见 访问设置

结果验证

  1. 验证应用是否部署成功
    在应用的 基本信息 > 资源配置 页签,查看应用的部署进度。支持通过实例的 运行状态实时日志事件,查看应用详细的启动和运行信息。
    alt

    • 查看实时日志:单击 实时日志,可查看应用的运行信息,方便运维和排障。
    • 查看事件:单击 事件,可查看应用的启动信息。最多可查看最近 1 小时内发生的事件信息。
  2. 访问 SD WebUI
    应用部署成功后,可在 访问设置 区域复制应用的访问地址。通过该地址去访问 SD WebUI。

  3. 文生图
    在 SD WebUI 的 txt2img 页签中,输入正向和反向提示词,单击 Generate,即可生成描述提示词的图片。
    alt

常见问题

如何通过 API 访问 SD WebUI?

  1. 创建一个 client.py 的 python 脚本。
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)
  1. 执行以下命令。命令执行成功后,将生成图片并保存至本地文件。
SD_WEB_UI_URL="xxx" # 替换为您的 SD 访问地址。
python3 client.py
# save to:  api_out/txt2img/txt2img-20240726-073928-0.png