You need to enable JavaScript to run this app.
持续交付

持续交付

复制全文
Stable Diffusion WebUI
一键部署 AI 生图 Stable Diffusion WebUI
复制全文
一键部署 AI 生图 Stable Diffusion WebUI

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

应用介绍

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

使用说明

下文主要介绍测试并验证通过的实践内容,为了获得符合预期的结果,同时符合使用限制,请按照本文方案(或在本文推荐的资源上)操作。如需替换方案,您可以联系对应的客户经理咨询。

前提条件

  • 容器服务 VKE

    • 已创建 VKE 集群,具体操作可参见 创建集群
    • (可选)如需挂载对象存储 TOS,请提前安装 csi-tos 组件。具体操作请参见 安装组件
    • (可选)如需以弹性容器实例方式部署,仅适用于网络模型为 VPC-CNI 的 VKE 集群,且集群中需提前安装 vci-virtual-kubelet 组件。具体操作请参见 安装组件
    • (可选)如需使用 GPU 资源,请提前安装 nvidia-device-plugin 组件。具体操作请参见 安装组件
  • 持续交付 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. 在左侧导航栏选择 AI 应用
  2. 在 AI 应用页面,单击 创建应用

  3. 选择 基于框架创建 > AI 生图 - Stable Diffusion WebUI 模板,并单击 部署
    alt

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

    基本信息

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

    部署集群

    配置项说明

    部署资源

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

    注意

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

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

    模型配置

    配置项说明
    镜像选择本模板使用预置镜像 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
最近更新时间:2025.06.04 10:39:01
这个页面对您有帮助吗?
有用
有用
无用
无用