amazon prime视频(20分钟,使用Amazon SageMaker快速搭建属于自己的AIGC应用)
真火!
作为最近一段时间人工智能领域内的顶流之一 ,AIGC(AI-Generated Content)早已火爆出圈 ,频登各大互联网平台热搜 。
cite: 微软亚洲研究院官方微博
这段时间以来,基于深度学习的内容生成在图像 、视频 、语音 、音乐 、文本等生成领域都取得了令人瞩目的成果 ,也越来越多的身边人在讨论AIGC 。但你知道AIGC背后的有哪些技术支持吗?
实际上 ,最早引爆AIGC话题的是AI作图 ,它是以Stable Diffusion技术为基础实现的。以前 ,AI 作图还只是简单的风格迁移 、头像生成 、磨皮 、P图等功能应用 ,直到Stable Diffusion模型的降临 ,AI 作图发生了质的变化 ,人们第一次见识到了生产力AI的力量:画家 、设计师不用再绞尽脑汁思考色彩 、构图 ,只要告诉 Stable Diffusion 模型自己想要什么 ,就能言出法随般地生成高质量图片 。
那么我能不能自己实现一个以Stable Diffusion模型为基础的AIGC作画应用呢?
答案是可以的!最近我恰好受邀参与了亚马逊云科技【云上探索实验室】活动,利用Amazon的SageMaker平台搭建了自己的 AIGC 应用 ,整个过程只用了不到20分钟 。
使用 Amazon SageMaker 基于Stable Diffusion模型搭建的AIGC应用
总体而言 ,在Amazon SageMaker上搭建AIGC应用的体验十分出色,不仅仅是流程清晰 ,简单易实现 。使用者可以直接从Hugging Face上提取预训练的模型 ,参考Amazon提供的简明教程,使得SageMaker可以很容易地将模型转化为Web应用 。
下面是一些图像生成的结果:
感觉还不错 ,现在我们就来复盘一些怎么利用亚马逊云服务使用Amazon SageMaker在20分钟内搭建一个属于自己的AIGC应用 。
我将首先简单说明AIGC是什么以及讲解Stable Diffusion的技术原理 。然后介绍Amazon SageMaker是做什么的 。之后将基于Amazon SageMaker搭建AIGC应用的整体流程复盘一遍 。最后对该应用进行测试和功能评价 。
1. 什么是Stable Diffusion?
1.1. 人工智能自动生成内容:AIGC介绍
人工智能自动生成内容(AIGC)是一种基于人工智能(AI)技术的内容创作方法 ,旨在快速、高效地生成高质量 、有创意的文本 、图像、音频或视频等多种形式的内容。借助先进的深度学习和自然语言处理技术 ,AIGC能够理解和学习人类语言 、语境 、知识和创意 ,从而根据用户需求生成各种类型的内容 。这其中尤其以Stable Diffusion为代表性技术和应用 ,它用于从自然语言描述生成数字图像 。
1.2. Stable Diffusion原理解析
Stable Diffusion是一个基于Latent Diffusion Models(潜在扩散模型 ,LDMs)的文图生成(text-to-image)模型。
它包含三个模块:感知压缩、扩散模型和条件机制 。(1) 图像感知压缩(Perceptual Image Compression) 图像感知压缩通过VAE自编码模型对原图进行处理 ,忽略掉原图中的高频细节信息 ,只保留一些重要 、基础的特征 。该模块并非必要 ,但是它的加入能够大幅降低训练和采样的计算成本,大大降低了图文生成任务的实现门槛。
基于感知压缩的扩散模型的训练过程有两个阶段:(1)训练一个自编码器;(2)训练扩散模型 。在训练自编码器时 ,为了避免潜在表示空间出现高度的异化 ,作者使用了两种正则化方法,一种是KL-reg ,另一种是VQ-reg ,因此在官方发布的一阶段预训练模型中,会看到KL和VQ两种实现 。在Stable Diffusion中主要采用AutoencoderKL这种正则化实现 。
具体来说 ,图像感知压缩模型的训练过程如下:给定图像
x
∈
R
H
×
W
×
3
x\in \mathbb{R}^{H\times W\times 3}
x∈RH×W×3 ,我们先利用一个编码器ε
\varepsilon
ε来将图像从原图编码到潜在表示空间(即提取图像的特征)z
=
ε
(
x
)
z=\varepsilon(x)
z=ε(x) ,其中z
∈
R
h
×
w
×
c
z\in \mathbb{R}^{h\times w\times c}
z∈Rh×w×c 。然后 ,用解码器从潜在表示空间重建图片x
~
=
D
(
z
)
=
D
(
ε
(
x
)
)
\widetilde{x}=\mathcal{D}(z)=\mathcal{D}(\varepsilon(x))
x=D(z)=D(ε(x)) 。训练的目标是使x
=
x
~
x=\widetilde{x}
x=x 。(2) 隐扩散模型(Latent Diffusion Models)
扩散模型(DM)从本质上来说 ,是一个基于马尔科夫过程的去噪器 。其反向去噪过程的目标是根据输入的图像
x
t
x_t
xt去预测一个对应去噪后的图像x
t
+
1
x_{t+1}
xt+1 ,即x
t
+
1
=
ϵ
t
(
x
t
,
t
)
,
t
=
1
,
.
.
.
,
T
x_{t+1}=\epsilon_t(x_t,t),\ t=1,...,T
xt+1=ϵt(xt,t),t=1,...,T 。相应的目标函数可以写成如下形式:L
D
M
=
E
x
,
ϵ
∼
N
(
,
1
)
,
t
=
[
∣
∣
ϵ
−
ϵ
θ
(
x
t
,
t
)
∣
∣
2
2
]
L_{DM}=\mathbb{E}_{x,\epsilon\sim\mathcal{N(0,1),t}}=[||\epsilon-\epsilon_\theta(x_t,t)||_{2}^{2}]
LDM=Ex,ϵ∼N(0,1),t=[∣∣ϵ−ϵθ(xt,t)∣∣22]这里默认噪声的分布是高斯分布N
(
,
1
)
\mathcal{N(0,1)}
N(0,1) ,这是因为高斯分布可以应用重参数化技巧简化计算;此处的x
x
x指的是原图 。而在潜在扩散模型中(LDM) ,引入了预训练的感知压缩模型 ,它包括一个编码器
ε
\varepsilon
ε 和一个解码器D
\mathcal{D}
D。这样在训练时就可以利用编码器得到z
t
=
ε
(
x
t
)
z_t=\varepsilon(x_t)
zt=ε(xt),从而让模型在潜在表示空间中学习 ,相应的目标函数可以写成如下形式:L
L
D
M
=
E
ε
(
x
)
,
ϵ
∼
N
(
,
1
)
,
t
=
[
∣
∣
ϵ
−
ϵ
θ
(
z
t
,
t
)
∣
∣
2
2
]
L_{LDM}=\mathbb{E}_{\varepsilon(x),\epsilon\sim\mathcal{N(0,1),t}}=[||\epsilon-\epsilon_\theta(z_t,t)||_{2}^{2}]
LLDM=Eε(x),ϵ∼N(0,1),t=[∣∣ϵ−ϵθ(zt,t)∣∣22](3) 条件机制(Conditioning Mechanisms) 条件机制 ,指的是通过输入某些参数来控制图像的生成结果 。这主要是通过拓展得到一个条件时序去噪自编码器(Conditional Denoising Autoencoder,CDA)
ϵ
θ
(
z
t
,
t
,
y
)
\epsilon_\theta(z_t,t,y)
ϵθ(zt,t,y)来实现的 ,这样一来我们就可通过输入参数y
y
y 来控制图像生成的过程 。具体来说 ,论文通过在UNet主干网络上增加cross-attention机制来实现CDA,选用UNet网络是因为实践中Diffusion在UNet网络上效果最好。为了能够从多个不同的模态预处理参数
y
y
y ,论文引入了一个领域专用编码器(Domain Specific Encoder)τ
θ
\tau_\theta
τθ ,它将y
y
y映射为一个中间表示τ
θ
(
y
)
∈
R
M
×
d
r
\tau_\theta(y)\in\mathbb{R}^{M\times d_r}
τθ(y)∈RM×dr ,这样我们就可以很方便的将y
y
y设置为各种模态的条件(文本 、类别等等) 。最终模型就可以通过一个cross-attention层映射将控制信息融入到UNet的中间层 ,cross-attention层的实现如下:A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
⊤
d
)
⋅
V
Attention(Q,K,V)=softmax(\frac{QK^\top}{\sqrt{d}})\cdot V
Attention(Q,K,V)=softmax(dQK⊤)⋅VQ
=
W
Q
(
i
)
⋅
φ
i
(
z
t
)
,
K
=
W
K
(
i
)
⋅
τ
θ
(
y
)
,
V
=
W
V
(
i
)
⋅
τ
θ
(
y
)
Q=W_{Q}^{(i)}\cdot \varphi_i(z_t),\quad K=W_{K}^{(i)}\cdot \tau_\theta(y),\quad V=W_{V}^{(i)}\cdot \tau_\theta(y)
Q=WQ(i)⋅φi(zt),K=WK(i)⋅τθ(y),V=WV(i)⋅τθ(y)其中φ
i
(
z
t
)
∈
R
N
×
d
ϵ
i
\varphi_i(z_t)\in \mathbb{R}^{N\times d_{\epsilon}^{i}}
φi(zt)∈RN×dϵi 是UNet的一个中间表征;W
Q
(
i
)
W_{Q}^{(i)}
WQ(i) 、W
K
(
i
)
W_{K}^{(i)}
WK(i)和W
V
(
i
)
W_{V}^{(i)}
WV(i)分别是三个权重矩阵 。此时 ,带有条件机制的隐扩散模型的目标函数可以写成如下形式:
L
L
D
M
=
E
ε
(
x
)
,
y
,
ϵ
∼
N
(
,
1
)
,
t
=
[
∣
∣
ϵ
−
ϵ
θ
(
z
t
,
t
,
τ
θ
(
y
)
)
∣
∣
2
2
]
L_{LDM}=\mathbb{E}_{\varepsilon(x),\ y,\ \epsilon\sim\mathcal{N(0,1),\ t}}=[||\epsilon-\epsilon_\theta(z_t,\ t,\ \tau_\theta(y))||_{2}^{2}]
LLDM=Eε(x),y,ϵ∼N(0,1),t=[∣∣ϵ−ϵθ(zt,t,τθ(y))∣∣22]2. 什么是Amazon SageMaker?
Amazon SageMaker 是一种完全托管式的机器学习服务 ,旨在帮助开发者和数据科学家快速 、轻松地构建 、训练和部署机器学习模型。Amazon SageMaker 提供了一个集成的开发环境 ,降低了创建机器学习解决方案的复杂性和成本 。Amazon云服务提供了三层架构 ,即框架和基础架构服务-机器学习服务-人工智能服务相结合的服务架构 ,其中Amazon SageMaker是中间层服务的支撑平台,为机器学习提供自定义训练和部署服务 。
3. 通过Amazon SageMaker搭建基于Stable Diffusion模型的AIGC应用
在我们开始部署Stable Diffusion模型之前 ,先来了解一下整体的实验架构 。整体流程分为两大部分 ,首先是在Amazon SageMaker Notebook中加载并准备AIGC模型,模型已经在机器学习开源社区Hugging Face中准备好了 ,我们需要把它加载到Notebook中 。然后将模型上传并部署该模型到Endpoint上 ,创建属于自己的AIGC应用 。
3.1. 创建Notebook
为了部署和使用我们的AIGC模型,我们采用Amazon SageMaker Notebook来编写代码和训练模型 。
首先我们进入到自己的 控制台主页(AWS Management Console)
,在最上方的搜索栏中搜索“Amazon SageMaker ” ,点击进入即可 。
然后 ,我们在左侧的目录中选择“笔记本 ”-“笔记本实例 ” ,进入到笔记本实例控制页 。在这里 ,我们点击“创建笔记本实例 ”来创建一个新的实例 。
之后在创建笔记本实例详情页中配置笔记本实例的基本信息。主要配置以下4部分信息:(1)笔记本实例名称;(2)笔记本实例类型;(3)平台标识符(操作系统及Jupyter Notebook版本);(4)实例存储大小(卷大小) 。
如果遇到无“IAM 角色 ”的问题 ,那就采用默认配置创建一个新角色即可 。
以上步骤完成之后点击“创建笔记本实例 ”就可以了 ,点击之后 ,需要等待一段时间(约5分钟)才能完成创建。
这里已经为大家准备好了相关的代码 ,打开链接(https://static.us-east-1.prod.workshops.aws/public/73ea3a9f-37c8-4d01-ae4e-07cf6313adac/static/code/notebook-stable-diffusion-ssh-inference.ipynb),下载保存Notebook代码文件 。
下载好代码(ipynb)文件之后 ,我们在笔记本实例页面点击“打开Jupyter ” ,然后上传代码 。
选择好文件后,点击蓝色的“Upload ”按键 ,即可完成上传。然后我们打开刚刚上传的notebook ,可以看到该文件就是一个完整的Stable Diffusion训练代码,这里我们的run kernel选择conda_pytorch_38或conda_pytorch_39 ,因为机器学习代码是用pytorch写的 。
在这里 ,我们首先使用Shift+Enter运行1.1安装及环境配置工作中的两段代码 ,为接下来的实验配置好环境 。以下是一些使用Jupyter Notebook的快捷键汇总 。
3.2. 利用Hugging Face克隆模型
Hugging Face是一个人工智能/机器学习的开源社区和平台 ,在Hugging Face上有Stable Diffusion V1.4和Stable Diffusion V2.1两个版本 ,无论使用V1.4版本还是V2.1版本 ,我们都要把模型下载下来 。
# Clone the Stable Diffusion model from HuggingFace #### Stable Diffusion V1 SD_SPACE="CompVis/" SD_MODEL = "stable-diffusion-v1-4" #### Stable Diffusion V2 # SD_SPACE="stabilityai/" # SD_MODEL = "stable-diffusion-2-1"之后克隆模型仓库 ,等待模型下载完毕 。
3.3. 了解模型的超参数
在正式训练模型之前 ,我们来了解一下模型的超参数设置以及它们的含义 。
prompt(str or List[str]):
引导图像生成的文本提示或文本列表 height(int, optional, 默认为 V1模型可支持到512像素 ,V2模型可支持到768像素):
生成图像的高度(以像素为单位) width(int, optional, 默认为 V1模型可支持到512像素,V2模型可支持到768像素):
生成图像的宽度(以像素为单位) num_inference_steps(int, optional, defaults to 50):
降噪步数 。更多的去噪步骤通常会以较慢的推理为代价获得更高质量的图像 guidance_scale(float, optional, defaults to 7.5):
较高的指导比例会导致图像与提示密切相关 ,但会牺牲图像质量 。 如果指定 ,它必须是一个浮点数 。 guidance_scale<=1 被忽略。 negative_prompt(str or List[str], optional):
不引导图像生成的文本或文本列表 。不使用时忽略,必须与prompt类型一致(不应小于等于1.0) num_images_per_prompt(int, optional, defaults to 1):
每个提示生成的图像数量在这其中 ,height 、width和num_images_per_prompt会直接影响到GPU的内存开销 。height 、width和num_images_per_prompt越大 ,所需要的GPU开销就越大。
以上是主要要考虑的超参数,如果想进行更精细的调整 ,可以参考 pipeline_stable_diffusion.py ,539-593行 。
3.4. 配置和微调Stable Diffusion模型
在确定好超参数之后 ,我们就可以配置并使用刚才微调的模型了 。首先使用stableDiffusionPipeline加载stable-diffusion-v1-4(或stable-diffusion-v2-1) ,即SD_MODEL=stable-diffusion-v1-4
接下来 ,通过输入prompts和调整超参数 ,我们就可以用Stable Diffusion模型来生成图像了 ,例如:
# move Model to the GPU torch.cuda.empty_cache() pipe = pipe.to("cuda") # V1 Max-H:512,Max-W:512 # V2 Max-H:768,Max-W:768 print(datetime.datetime.now()) # 提示词 ,一句话或者多句话 prompts =[ "An eagle flying in the water", "A pig kite flying in the sky", ] generated_images = pipe( prompt=prompts, height=512, # 生成图像的高度 width=512, # 生成图像的宽度 num_images_per_prompt=创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!