一、背景介绍
伴随着chat gpt的爆火,AI的浪潮席卷全球。在这之中,对于设计师而言无疑也面临着巨大的变革。这个变革如此之快,如此之深,让我们每一个身在其中的设计师就像站在露天演唱会的喇叭前一样,虽不可视却感受的无比真实。AI绘画是一种利用深度学习算法进行创作的绘图方式。广泛应用于数字媒体、游戏、动画、电影、广告等领域。
Stable Diffusion和Midjourney这两款软件和ChatGPT一起,作为几乎是第一批AIGC的代名词收割了全球千行百业的目光。SD和MJ都属于能够通过prompt(提示词)来完成文字生成图片,或是以图生图的方式来生成想要的图片,但在很多具体的部分有很大的差异。
但是如果想在服务器上搭建一个AI作画模型,要面临的问题有许多,最大的问题如下所示:
- GPU卡型多样,算力、显存差异大,选型困难
- 环境配置复杂、模型安装和调试门槛高
- 各类插件迭代频繁,难以在进行环境管理
Stable Diffusion的来源
Stable Diffusion是一个基于Latent Diffusion Model(LDM)的文转图AI模型,其使用了CLIP ViT-L/14文本编码器,能够通过文本提示调整图像模型。它在运行时将成像过程分离成“扩散 (diffusion)”的过程——从有噪声的情况开始,逐渐改善图像,直到完全没有噪声,逐步接近所提供的文本描述。
Midjourney 的来源
Midjourney是一款基于Discord社区上的AI绘图创作工具,通过 Discord 的机器人指令进行操作,你只需输入英文文本,它便可通过强大的AI算法给你产出相应的图案,效果让人首屈一指。
共同点
- Midjourney 和 Stable Diffusion都是AI绘图工具
- 二者均为深度学习图像领域中用于改进梯度下降算法的模型;模型的共同目标都是为了让模型更快、更稳定地收敛到最优解。
- 二者均支持在线生成。
- 二者均支持:以文生图、以图生图。
区别
模型算法方面的区别
这一块比较晦涩,不感兴趣的同学可跳过阅读。
- 目标不同
- Midjourney的主要目标是在训练的初期阶段快速收敛到一个相对不错的局部最优解;
- Stable Diffusion的主要目标则是通过减少梯度的抖动,使模型更加稳定地收敛到全局最优解。
- 方法不同:
- Midjourney是通过逐渐增大学习率来实现的;
- Stable Diffusion是通过对梯度进行平滑处理来实现的。
- 适用范围不同
- Midjourney通常适用于模型比较复杂、训练过程比较长的情况下;
- Stable Diffusion适用于模型在训练过程中存在梯度抖动、训练过程不太稳定的情况下。
Midjourney的特点
优点
- 模型层面:可以帮助模型更快地收敛到局部最优解。
Midjourney的思想是在模型的训练过程中,把初始的学习率调低,然后逐渐调高,最后再调低。 这个过程可以让模型在训练的初期阶段更快地收敛到一个相对不错的局部最优解。
- 模型层面:有助于防止陷入模型的局部最优解。
由于Midjourney可以让模型在训练过程中不断地探索更广泛的搜索空间。因此,可以一定程度上避免模型陷入局部最优解。
- 提示词门槛:低
缺点
- 需要梯子(访问国外网站)
- 禁用词:高(多)
- 例如:bare、nude
- 画面受控度:低
- 闭源
Stable Diffusion的特点
优点
- 模型层面:可以让模型更加稳定地收敛到最优解:
Stable Diffusion通过对梯度进行平滑处理,从而减少了梯度的抖动,进而可以让模型更加稳定地收敛到最优解。
- 模型层面:可以加速训练过程。
由于Stable Diffusion可以使梯度变得更加平滑,因此可以减少梯度更新的次数,从而加速训练过程。
- 开源且免费
- 开源决定了其质量和生态圈会愈发强大、成长速度会非常快。
- 支持本地部署
- 最低配置:10系显卡 + 6G内存
- 支持离线不联网部署:数据安全性高
- 禁用词:少(百无禁忌)
- 画面受控度:高
- 可控性极强:插件极多,LORA极多
- 上限/下限差距极大:无特殊操作的情况下,SD可能跑出古神。需要有一定的学习过程才能跑出好看的图片,但是图片如果好看,又可以做到非常精致。难上手,难精通,但是精通之后上限极高。
缺点
- 提示词门槛:高
- 搭建部署的硬件要求、技术门槛相对高
- 仅仅是普通非技术人员相对高;对IT技术人员而言,此私有化部署的硬件要求已比较低了
- 纯CPU也能跑,但速度会非常慢
- 部署相对麻烦:需要搭建几个依赖的环境、且需略懂Git、Python等基础知识
二、腾讯云HAI背景介绍
高性能应用服务 HAI:澎湃算力,即开即用。以应用为中心,匹配GPU云算力资源,助力中小企业及开发者快速部署LLM、AI作画、数据科学等高性能应用。是为开发者量身打造的澎湃算力平台。无需复杂配置,便可享受即开即用的GPU云服务体验。在 HAI 中,根据应用智能匹配并推选出最适合的GPU算力资源,以确保您在数据科学、LLM、AI作画等高性能应用中获得最佳性价比。
HAI 服务优势
智能选型 :根据应用匹配推选GPU算力资源,实现最高性价比。同时,打通必备云服务组件,大幅简化云服务配置流程。
一键部署 :分钟级自动构建LLM、AI作画等应用环境。提供多种预装模型环境,包含如StableDiffusion、ChatGLM等热门模型。
可视化界面 :友好的图形界面,AI调试更为简单
即插即用 · 轻松上手
基于腾讯云GPU云服务器底层算力,提供即插即用的高性能云服务。
智能选型
根据应用匹配推选GPU算力资源,实现最高性价比。同时,打通必备云服务组件,大幅简化云服务配置流程。
一键部署
分钟级自动构建LLM、AI作画等应用环境。提供多种预装模型环境,包含如StableDiffusion、ChatGLM等热门模型。
可视化界面
提供开发者友好的图形界面,支持jupyterlab、webui等多种算力连接方式,AI研究调试超低门槛。
横向对比 · 青出于蓝
大幅降低GPU云服务器使用门槛,多角度优化产品使用体验,开箱即用
应用场景
AI作画(视觉设计、游戏)
基于StableDiffusion开源模型进行AI绘画
场景介绍
AI绘画是一种利用深度学习算法进行创作的绘图方式。广泛应用于数字媒体、游戏、动画、电影、广告等领域。
业务痛点
- GPU卡型多样,算力、显存差异大,选型困难
- 环境配置复杂、模型安装和调试门槛高
- 各类插件迭代频繁,难以在进行环境管理
产品优势
- 智能匹配算力,多种算力套餐满足不同需求的绘图性能。
- 预置主流AI作画模型及常用插件,无需手动部署,支持即开即用。
- 动态更新模型版本,确保模型版本与时俱进,无需频繁操作。
AI对话/写作(Agent、企业知识库)大语言模型
基于开源大语言模型,创作属于自己的Agent、企业知识库
场景介绍
大语言模型在广泛的文本数据上进行训练,可以执行广泛的任务,包括文本总结、翻译、情感分析等等。
业务痛点
- 环境配置复杂,部署难度大。
- 模型效果调试难,无可视化界面。
- 模型、数据集储存流程繁琐,难以快捷保存
业务痛点
- 预置国内外主流LLM大语言模型。
- 支持可视化界面一键登录,方便调优
- 打通云上存储组件,支持模型、数据集快捷存储
AI开发/测试(学术研究、论文)算法研发
学术研究、论文
场景介绍
面向高校、研究所等大量科研场景,需针对深度学习、机器学习等前沿算法进行开发探索。
业务痛点
- 需要大量的计算资源进行验证和优化。
- 涉及多种框架、模型及开发库,环境配置复杂。
业务痛点
- 提供多种高性能GPU云服务器,满足算法验证和测试的需求。
- 提供公共模型、数据集文件存储桶,优化资源拉取效率。
三、动手实操
本次我们使用 腾讯云高性能应用服务 HAI 体验快速搭建并使用AI模型 StableDiffusion ,实现思路如下:
1、体验 高性能应用服务HAI 一键部署 StableDiffusion AIGC
2、启动 StableDiffusionWebUI 进行文生图模型推理
3、开发者体验 JupyterLab 进行 StableDiffusion API 的部署
4、开发者使用 Cloud Studio 快速开发调用 StableDiffusion API 的前端Web页面
3.1 效果展示
文生图(text2img)
高性能应用服务 HAI 快速为开发者提供API调用服务(StableDiffusionAPI)
高性能应用服务HAI 搭建的 StableDiffusion API 作为服务端,Cloud Studio 助力快速开发一个简单的Web应用
3.2 开始实验
1、申请高性能应用服务 HAI
① . 点击链接进入 高性能应用服务 HAI 申请体验资格
② . 等待审核通过后,进入 高性能应用服务 HAI
③ . 点击前往体验HAI,登录 高性能应用服务 HAI 控制台
④ . 点击 新建 选择 AI模型,参照下图进行配置
⑤ . 等待创建完成
⑥ . 创建完成,查看相关状态
⑦ . 查看详细的配置信息
2、启动 高性能应用服务HAI 配置的 StableDiffusionWebUI 进行文生图模型推理
① .进入 StableDiffusionWebUI ,以下可选择两种方式进入
或者从服务器详情页进入
② .使用 高性能应用服务HAI 部署的 StableDiffusionWebUI 配置简体中文语言包
(1)进入 StableDiffusionWebUI
(2)此扩展可以在 Extension 选项卡里面通过加载官方插件列表直接安装
点击 Extension 选项卡,选择 Avaliable 子选项卡
取消勾选 localization ,再把其他勾上,然后点击 Load form,如下图,加载插件时,请耐心等待
(3)在输入框中查找插件关键字: zh_CN
(4)确认插件安装完成后,重启服务
(5)重启后,选择 Settings 中 User Interface 选项,下拉选择语言 zh_CN ,点击 Apply settings 保存设置 ,并 Reload UI 重启服务。
(6)重启(Reload UI)后,重新认识界面。
③ .使用 高性能应用服务HAI 部署的 StableDiffusionWebUI 快速进行AI绘画
注意:提示词(Prompt)越多,AI 绘图结果会更加精准。另外,目前中文提示词的效果不好,还得使用英文提示词。
接下来我们使用 StableDiffusionWebUI 生成一张猫咪图片,配置以下参数后,点击 "生成" 即可
参数名 | 描述 | 值 |
---|---|---|
提示词 | 主要描述图像,包括内容风格等信息,原始的webui会对这个地方有字数的限制,可以安装一些插件突破字数的限制 | a pretty cat,cyberpunk art,kerem beyit,very cute robot zen,Playful,Independent,beeple |
反向提示词 | 为了提供给模型,我们不需要的风格 | (deformed,distorted,disfigured:1.0),poorly drawn,bad anatomy,wrong anatomy,extra limb,missing limb,floating limbs,(mutated hands and fingers:1.5),disconnected limbs,mutation,mutated,ugly,disgusting,blurry,amputation,flowers,human,man,woman |
提示词相关性(CFG scale) | 分类器自由引导尺度——图像与提示符的一致程度——越低的值产生的结果越有创意,数值越大成图越贴近描述文本。一般设置为7 | 7 |
采样方法(Sampling method) | 采样模式,即扩散算法的去噪声采样模式会影响其效果,不同的采样模式的结果会有很大差异,一般是默认选择euler,具体效果我也在逐步尝试中。 | Euler a |
采样迭代步数(Sampling steps) | 在使用扩散模型生成图片时所进行的迭代步骤。每经过一次迭代,AI就有更多的机会去比对prompt和当前结果,并作出相应的调整。需要注意的是,更高的迭代步数会消耗更多的计算时间和成本,但并不意味着一定会得到更好的结果。然而,如果迭代步数过少,一般不少于50,则图像质量肯定会下降 | 80 |
随机种子(Seed) | 随机数种子,生成每张图片时的随机种子,这个种子是用来作为确定扩散初始状态的基础。不懂的话,用随机的即可 | 1791574510 |
配置并生成如下图:
3、 高性能应用服务HAI 快速为开发者提供 StableDiffusion API 服务
① .进入 jupyter_lab 操作界面
在算力管理页面选择
初步认识并操作 jupyter_lab
选择使用 终端命令行 操作
输入代码:
cd /root/stable-diffusion-webui
python launch.py --nowebui --xformers --opt-split-attention --listen --port 7862
命令参数描述:
命令 | 描述 |
---|---|
--nowebui | 以 API 模式启动 |
--xformers | 使用xformers库。极大地改善了内存消耗和速度。 |
--opt-split-attention | Cross attention layer optimization 优化显着减少了内存使用,几乎没有成本(一些报告改进了性能)。黑魔法。默认情况下torch.cuda,包括 NVidia 和 AMD 卡。 |
--listen | 默认启动绑定的 ip 是 127.0.0.1,只能是你自己电脑可以访问 webui,如果你想让同个局域网的人都可以访问的话,可以配置该参数(会自动绑定 0.0.0.0 ip)。 |
--port | 默认端口是 7860,如果想换个端口,可以配置该参数,例如:--port 7862 |
--gradio-auth username:password | 如果你希望给 webui 设置登录密码,可以配置该参数,例如:--gradio-auth GitLqr:123456。 |
操作截图:
添加 高性能应用服务HAI 的端口配置,使外部网络能够顺利地访问该服务器提供的API服务
添加入站规则:
配置参考如下:
来源:0.0.0.0/0
协议端口:TCP:7862 (根据您配置的端口填写)
② .启用 StableDiffusion API 接口使用指南
配置完成后输入 服务器IP地址:端口号/docs 可查看相关的 API 接口 swagger 使用指南
官方提供的api常用的有几个:
/sdapi/v1/txt2img 文字生图 POST
/sdapi/v1/img2img 图片生图 POST
/sdapi/v1/options 获取设置 GET | 更新设置 POST(可用来更新远端的模型)
/sdapi/v1/sd-models 获取所有的模型 GET
查看相关接口示例 ( /sdapi/v1/txt2img ) :
常用输入如下
{
"denoising_strength": 0,
"prompt": "puppy dogs",
"negative_prompt": "",
"seed": -1,
"batch_size": 2,
"n_iter": 1,
"steps": 50,
"cfg_scale": 7,
"width": 512,
"height": 512,
"restore_faces": false,
"tiling": false,
"sampler_index": "Euler"
}
可复制以上参数到 Request body 中
名称 | 说明 |
---|---|
prompt | 提示词 |
negative_prompt | 反向提示词 |
seed | 种子,随机数 |
batch_size | 每次张数 |
n_iter | 生成批次 |
steps | 生成步数 |
cfg_scale | 关键词相关性 |
width | 宽度 |
height | 高度 |
restore_faces | 脸部修复 |
tiling | 可平铺 |
sampler_index | 采样方法 |
请求API接口成功截图如下:
返回的格式如下:
{
"images": [...],// 这里是一个base64格式的字符串数组,根据你请求的图片数量而定
"parameters": { ... },//此处为你输入的body
"info": "{...}"// 返回的图片的信息
}
当你看到这样的消息时,说明我们已经成功与远端的服务器进行连接!
如果你想验证结果的图片是怎么样的,你可以复制images中的其中一张图片的base64格式的字符串,到相关的网站下转换为jpg格式。
③ .使用 python 向 高性能应用服务HAI 提供的 StableDiffusion API 发送请求
以下演示使用 python 如何向 StableDiffusion API 发出请求。 我们希望向应用程序的 txt2img(即“文本到图像”)API 发送 POST 请求以简单地生成图像。
我们将使用 requests 包,所以如果你还没有安装它,请使用安装脚本:
pip install requests
我们可以发送一个包含提示的请求作为一个简单的字符串。 服务器将返回一个图像作为 base64 编码的 PNG 文件,我们需要对其进行解码。 要解码 base64 图像,我们只需使用base64.b64decode(b64_image)。 以下使用python作为脚本代码测试:
import json
import base64
import requests
your_ip = '0.0.0.0' # HAI服务器IP地址
your_port = 7862 # SD api 监听的端口
def submit_post(url: str,data: dict):
"""
Submit a POST request to the given URL with the given data.
"""
return requests.post(url,data=json.dumps(data))
def save_encoded_image(b64_image: str,output_path: str):
"""
Save the given image to the given output path.
"""
with open(output_path,"wb") as image_file:
image_file.write(base64.b64decode(b64_image))
if __name__ == '__main__':
# /sdapi/v1/txt2img
txt2img_url = f'http://{your_ip}:{your_port}/sdapi/v1/txt2img'
data = {
'prompt': 'a pretty cat,cyberpunk art,kerem beyit,very cute robot zen,Playful,Independent,beeple |',
'negative_prompt':'(deformed,distorted,disfigured:1.0),poorly drawn,bad anatomy,wrong anatomy,extra limb,missing limb,floating limbs,(mutated hands and fingers:1.5),disconnected limbs,mutation,mutated,ugly,disgusting,blurry,amputation,flowers,human,man,woman',
'Steps':50,
'Seed':1791574510
}
response = submit_post(txt2img_url,data)
save_encoded_image(response.json()['images'][0],'cat.png')
请记住,你的结果会与我的不同。 如果遇到问题,请仔细检查运行 StableDiffusion API 应用程序的终端的输出。 可能是服务器尚未完成。 如果您遇到“404 Not Found”之类的问题,请仔细检查 URL 是否输入正确并指向正确的地址(例如 127.0.0.1)。
调用代码及图片生成截图:
服务端可查看每一次接口调用详情:
4、使用 高性能应用服务 HAI 搭建的 StableDiffusion API 作为服务端快速动手开发一个基于 Cloud Studio构建的Web应用
①. 点击链接进入 腾讯云 腾讯云链接 登录
②. 在搜索框输入 Cloud Studio ,点击搜索
③. 点击立即使用
④. 选择 开发空间 下的 手动创建 并 立即创建
⑤. 新建自定义模版配置如下:
⑥. 创建成功,并进入工作空间,1分钟内快速完成空间创建
空间(workspace)创建成功:
⑦. 为了您有更高效的产品体验,前端界面已完成,请下载压缩包后上传至工作空间并解压压缩包
点击下载压缩包 : sd_api.zip
上传压缩包示意图:
上传压缩包成功:
终端操作解压压缩包:
输入解压命令 :
unzip sd_api.zip
解压成功:
⑧. 开启web服务并查看需调试的页面
解压完成后,在终端窗口输入命令
cd sd_api #进入文件夹
npm install #安装依赖包
等待依赖完成安装后就可以启动Web项目了,输入命令:
npm run dev #启动web
进入项目内(sd_api)并安装依赖后启动Web项目截图:
查看端口用于查看Web页面:
以下是选择两种查看页面方式的截图:
⑨. 快速开发核心功能
下面我们来开发项目的核心功能 :
在Vue项目下的 model 文件夹中创建一个名为 Txt2ImgModel.ts 的文件,这个文件主要用于调用相关接口参数配置
// 文生图api /sdapi/v1/txt2img 请求参数
export interface Txt2ImgReq {
prompt: string,
negative_prompt: string,
width: number,
height: number,
steps: number,
cfg_scale: number,
sampler_name: string,
batch_size: number,
seed: number,
save_images: boolean,
alwayson_scripts: object | {}
}
// 文生图api /sdapi/v1/txt2img 响应结果
export interface Txt2ImgRes {
images: [],
parameters: string,
info: string
}
// 采样方法api /sdapi/v1/samplers 响应结果
export interface Txt2ImgSamplers {
name: string,
aliases: string[],
options: {}
}
// ControleNet 请求参数
export interface ControlNetReq {
input_image: string,
module: string,
model: string,
lowvram: boolean,
pixel_perfect: boolean,
weight: number,
guidance_start: number,
guidance_end: number,
control_mode: number,
resize_mode: number,
processor_res: number,
threshold_a: number,
threshold_b: number
}
import { useStorage } from '@vueuse/core'
// 将所有组件的输入保存在浏览器的 localStorage 中,key为 txt2imgReqStorage
export const txt2imgReqStorage = useStorage<Txt2ImgReq>('txt2imgReq', {})
// 将文生图调用结果图片保存在浏览器的 localStorage 中,key为 txt2img_imgs
export const txt2imgResultStorage = useStorage<string[]>('txt2img_imgs', [])
创建 model 文件夹中 Txt2ImgModel.ts 的截图:
同样,在Vue项目下的 model 文件夹中创建一个名为 ControlNetModel.ts 的文件,这个文件主要用于添加 ControlNet 组件
// ControlNet的api /controlnet/module_list 的响应结果
export interface ControleNetModuleRes {
module_list: []
}
// ControlNet的api /controlnet/model_list 的响应结果
export interface ControlNetModelRes {
model_list: []
}
创建 model 文件夹中 ControlNetModel.ts 的截图
由于手动创建的环境中没有安装Vue插件,我们快速配置一个Vue的语言环境,等待安装完成
安装完成后,下载附件 main.zip 解压后将 main.vue 文件覆盖至您项目下的 views 文件夹中的 main.vue 并保存,这个文件将用于数据绑定、图片渲染功能:
下载代码文件:main.vue.zip
view文件夹中的main.vue文件修改后截图:
同时修改vue项目下的 vite.config 文件,配置信息修改为您部署在 高性能应用HAI服务器API 的相关信息:
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
// 服务端代理
server: {
// 监听主机 127.0.0.1,如果是 0.0.0.0 则代表所有ip都可以访问该前端项目
host: "127.0.0.1", //这里可不用管
// 将 /sdapi、 /controlnet 开头的请求都代理到服务端地址 http://127.0.0.1:7862
proxy: {
'/sdapi': {
target: 'http://your_ip:7862', //这里配置为您的服务端地址+端口
changeOrigin: true
},
'/controlnet': {
target: 'http://your_ip:7862', //这里配置为您的服务端地址+端口
changeOrigin: true
}
}
}
})
修改vite.config文件:
保存文件后Web服务将自动重启:
⑩ .搭建完成,快速启动Web页面并测试
重新加载Web页面,并在相对应的输入框中填写对应的参数:
参数名 | 值 |
---|---|
提示词 | |
反向提示词 | a pretty cat,cyberpunk art,kerem beyit,very cute robot zen,Playful,Independent,beeple |
提示词相关性(CFG scale) | (deformed,distorted,disfigured:1.0),poorly drawn,bad anatomy,wrong anatomy,extra limb,missing limb,floating limbs,(mutated hands and fingers:1.5),disconnected limbs,mutation,mutated,ugly,disgusting,blurry,amputation,flowers,human,man,woman |
提示词相关性(CFG scale) | 7 |
采样方法(Sampling method) | Euler a |
采样步数(Sampling steps) | 50 |
随机种子(Seed) | -1 |
每批次数量 | 3 |
前端页面展示效果-1(在浏览器中调试查看):
前端页面展示效果-2(在标签页中调试查看):
高性能服务HAI 预装的 JupyterLab 上查看接口被调用的信息:
5、清理资源
1、清理 Cloud Studio 中创建的工作空间
返回 Cloud Studio 的配置界面,选择开发空间,停止当前正在运行的空间后删除即可
2、销毁 高性能应用服务HAI 创建的 StableDiffusion 服务
进入算力管理页面,点击销毁,选择确认即可销毁
6、总结
本次实验主要是引导大家如何使用 高性能应用服务 HAI 部署 StableDiffusion 运行环境轻松拿捏AI作画,开箱即用,可以快速上手;同时,也使用了 Cloud Studio 快速开发并部署一个简单的应用程序。最后也欢迎大家一起探索 高性能应用服务 HAI 更多的功能,为工作中赋能增效降本!