目前人工智能模型可以分为两大类别,包括判别模型 (Discriminative Model
) 与生成模型 (Generative Model
)。判别模型根据一组输入数据,例如文本、X 射线图像或者游戏画面,经过一系列计算得到相应目标输出结果,例如单词翻译结果、X 光图像的诊断结果或游戏中下一时刻要执行的动作。判别模型可能是我们最熟悉的一类 AI 模型,其目的是在一组输入变量和目标输出之间创建映射。
而生成模型,并不会不会对输入变量计算分数或标签,而是通过学习输入和输出之间的关系生成新的数据样本,这类模型可以接受与实际值无关的向量(甚至是随机向量),生成复杂输出,例如文本、音乐或图像。人工智能生成( Artificial Intelligence Generated Content
, AIGC
) 内容泛指指利用机器学习和自然语言处理技术,让计算机生成人类可理解的文本、音频、图像等内容,主要由深度学习算法和神经网络构成,可以通过学习大量的数据来模拟人类的思维和创造力,从而产生高质量的内容。下图是使用 stable diffusion
模型生成的图像,可以看出生成的图像不仅具有很高的质量,同时能够很好的契合给定的输入描述。
AIGC
通过机器学习方法从原始数据中学习数据特征,进而生成全新的、原创的数据,这些数据与训练数据保持相似,而非简单复制原始数据。AIGC
已经取得了重大进展,并在各个领域得到广泛应用:
UI
设计等
游戏:可以生成游戏中的角色、道具等元素
视频制作:可以生成特效、动画等内容
智能客服:可以生成自然语言对话,实现智能客服等应用
AIGC
可以视为未来的战略技术,其将极大加速人工智能生成数据的速度,正在深刻改变人类社会,推动人类创作活动,包括写作、绘画、编程等,甚至也将推动科学研究,例如生成科学假设和科学现象等。AIGC
是一个快速发展的领域,将为各个行业带来革命性的变化。未来,通过学术界和工业界持续探索新的算法和技术,将进一步提高生成内容的质量和多样性。
总的来说,判别模型关注的是输入和输出之间的关系,直接预测输出结果,而生成模型则关注数据的分布,通过学习数据的统计特征来生成新的样本数据。判别模型推动了人工智能前数十年的发展,而生成模型将成为人工智能未来十年的重点发展方向。
2.2 Stable Diffusion 介绍
最近 AI
作画取得如此巨大进展的原因很大程度上可以归功于开源模型 Stable Diffusion
,Stable diffusion
是一个基于潜在扩散模型 (Latent Diffusion Models
, LDM
) 的文图生成 (text-to-image
) 模型,经过训练可以逐步对随机高斯噪声进行去噪以获得感兴趣的数据样本,该模型使用来自 LAION-5B
数据库 (LAION-5B
是目前最大、可自由访问的多模态数据集)子集的 512x512
图像进行训练,使用这个模型,可以生成包括人脸在内的任何图像。在使用 Stable Diffusion
生成高质量图像之前,我们首先介绍该模型的原理与架构,Stable Diffusion
模型架构如下图所示:
Diffusion model
相比生成对抗网络 (Generative Adversarial Network
, GAN
) 具有更好的图片生成效果,但由于该模型是一种自回归模型,需要反复迭代计算,因此训练和推理代价都很高,主要原因是它们在像素空间中运行,特别是在生成高分辨率图像时,需要消耗大量内存。Latent diffusion
通过在较低维度的潜空间上应用扩散过程而不是使用实际的像素空间来减少内存和计算成本,所以 Stable Diffusion
引入了 Latent diffusion
的方式来解决计算代价昂贵的问题,能够极大地减少计算复杂度,同时可以生成质量较高的图像,Latent Diffusion
的主要包括以下三个组成部分:
Variational autoEncoder
, VAE
)VAE
模型主要包含两个部分:编码器和解码器,其中编码器用于将图像转换为低维的潜在表示,得到的低维潜在表示将作为 U-Net
模型的输入,而解码器用于将潜在表示转换回图像。在 Latent diffusion
训练期间,编码器用于获得正向扩散过程的图像的潜在表示,正向扩散在每一步中逐步使用越来越多的噪声。在推断过程中,使用 VAE
解码器将反向扩散过程生成的去噪潜在表示转换回图像
U-Net
U-Net
同样包含编码器和解码器两部分,且都由 ResNet
块组成,编码器将图像表示压缩成较低分辨率的图像表示,解码器将较低分辨率图像表示解码回原始较高分辨率的图像表示。为了防止 U-Net
在下采样时丢失重要信息,通常在编码器的下采样 ResNet
和解码器的上采样 ResNet
之间添加捷径连接 (Short-cut Connections
),此外,U-Net
能够通过 cross-attention
层将其输出条件设置在文本嵌入上,cross-attention
层被添加到 U-Net
的编码器和解码器部分,通常用在 ResNet
块之间
Text-Encoder
Text-Encoder
负责将输入提示转换到 U-Net
可以理解的嵌入空间,它通常是一个简单的基于 Transformer
的编码器,将输入分词序列映射到潜在文本嵌入序列。受 Imagen
的启发,Stable Diffusion
在训练过程中并不会训练 Text-Encoder
,只使用 CLIP
预训练过的 Text-Encoder
——CLIPTextModel
但是,纵然由于 Latent diffusion
可以在低维潜在空间上进行操作,与像素空间扩散模型相比,它极大的降低了内存和计算需求,但如果需要生成高质量照片,模型仍然需要在 16GB
以上 GPU
上运行,具体而言,在本地计算机上搭建 Stable Diffusion
模型会遇到以下困难:
Stable Diffusion
模型的构建需要使用特定的软件和库,在本地计算机上搭建软件环境可能会遇到版本不兼容、依赖关系复杂等问题,需要花费大量时间和精力进行调试和解决
数据处理:Stable Diffusion
模型训练需要处理大量的高质量图像数据,在本地计算机上处理大量数据可能会导致内存不足、速度慢等问题
计算资源限制:Stable Diffusion
模型训练需要大量的计算资源,包括高显存 GPU
和大量内存,如果本地计算机的计算资源不足,将无法训练模型
超参数:Stable Diffusion
模型需要设置大量参数,如扩散系数、边界条件、学习率等,这些超参数的选择需要经过大量调试,否则可能会导致模型不收敛或者收敛速度过慢
模型验证:Stable Diffusion
模型需要进行大量模型验证和测试,以确保模型的正确性和可靠性
综上所述,搭建 Stable Diffusion
模型需要克服计算资源限制、软件兼容问题、数据处理和超参数选择等困难。因此,选择云计算平台来简化这些工作便成为自然的选择,而 Amazon SageMaker
作为完全托管的机器学习服务成为构建、训练与部署复杂模型(例如 Stable Diffusion
)的首选。
3. 使用 Amazon SageMaker 创建 Stable Diffusion 模型
在本节中,我们将介绍基于 Amazon SageMaker
使用 Amazon SageMaker Notebook
实例测试、验证 AIGC
模型并
部署 AIGC
模型至 Amazon SageMaker Inference Endpoint
。
3.1 准备工作
为了确保能够将 AIGC
模型部署至 Amazon SageMaker Inference Endpoint
,需要确保有足够的限额。为此,我们首先需要通过服务配额页面检查配额,在搜索框中输入 ml.g4dn.xlarge for endpoint usage
,若此配额的第二列为 0
,则需要提高配额:
提高限额,需首先选中 ml.g4dn.xlarge for endpoint usage
,点击“请求增加配额”按钮:
在输入框中输入所需的限额,例如 “1
”,填写完毕后,点击“请求”按钮提交请求:
等待配额请求通过后,就可以继续该实验过程。
3.2 创建 Amazon SageMaker Notebook 实例
Amazon SageMaker Notebook
实例是运行 Jupyter Notebook
应用程序的机器学习计算实例。Amazon SageMaker
用于管理实例和相关资源的创建,我们可以在 Notetbook
实例中使用 Jupyter Notebook
准备和处理数据、编写代码来训练模型、或将模型部署到 Amazon SageMaker
中,并测试或验证模型。接下来,我们将创建 Amazon SageMaker Notebook
示例,用于运行相关 Jupyter Notebook
代码。
(1) 登录 Amazon 云科技控制台,并将当前区域修改为 Tokyo
区域:
(2) 在搜索框中搜索 Amazon SageMaker
,并点击进入 Amazon SageMaker
服务:
(3) 在左侧菜单栏,首先点击“笔记本”按钮,然后点击“笔记本实例”,进入笔记本 (Notebook
) 实例控制面板,并点击右上角”创建笔记本实例“按钮:
(4) 配置笔记本实例设置,在创建笔记本实例详情页中,配置笔记本实例的基本信息,包括笔记本实例名称(例如 stable-diffusion
)、笔记本实例类型(选择 ml.g4dn.xlarge
实例类型,该类型实例搭载 NVIDIA T4 Tensor Core GPU
显卡,提供了模型所需执行浮点数计算的能力)、平台标识符( Amazon Linux 2, Jupyter Lab 3
)和在“其他配置”下的卷大小(推荐至少 75GB
磁盘大小,用于存储机器学习模型):
(5) 配置笔记本实例权限,为笔记本实例创建一个 IAM
角色,用于调用包括 Amazon SageMaker
和 S3
在内的服务,例如上传模型,部署模型等。在“权限和加密”下的 IAM
角色中,点击下拉列表,单击“创建新角色”:
在配置页面中,保持默认配置,并点击“创建角色”按钮:
成功创建 IAM
角色后,可以得到类似下图的提示信息:
(6) 检查配置的信息,确认无误后点击“创建笔记本实例”按钮,等待实例创建完成。
(7) 当笔记本状态变为 InService
后,点击“打开Jupyter”进入 Jupyter Notebook
:
3.3 端到端体验 AIGC
接下来,我们可以下载保存 Notebook
代码文件,并将其上传到 Jupyter Notebook
,然后直接运行代码,但亲手编写代码的体验是无与伦比,我们将介绍代码文件的主要内容,从头开始端到端体验 AIGC
!需要注意的是,需要确保 Kernel
以 conda_pytorch
开头。
(1) 安装相关库并进行环境配置工作:
# 检查环境版本
!nvcc --version
!pip list | grep torch
# 安装Notebook运行模型所需的库文件
!sudo yum -y install pigz
!pip install -U pip
!pip install -U transformers==4.26.1 diffusers==0.13.1 ftfy accelerate
!pip install -U torch==1.13.1+cu117 -f https://download.pytorch.org/whl/torch_stable.html
!pip install -U sagemaker
!pip list | grep torch
(2) 下载模型文件,我们将使用 Stable Diffusion V2
版本,其包含一个具有鲁棒性的文本生成图像模型,能够极大的提高了图像生成质量,模型相关介绍参见 Github:
# 安装git lfs以克隆模型仓库
!curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash
!sudo yum install git-lfs -y
# 设定模型版本的环境变量,使用 Stable Diffusion V2
SD_SPACE="stabilityai/"
SD_MODEL = "stable-diffusion-2-1"
# 克隆代码仓库
# Estimated time to spend 3min(V1), 8min(V2)
%cd ~/SageMaker
!printf "=======Current Path========%s\n"
!rm -rf $SD_MODEL
# !git lfs clone https://huggingface.co/$SD\_SPACE$SD\_MODEL -X "\*.safetensors"
!mkdir $SD_MODEL
%cd $SD_MODEL
!git init
!git config core.sparseCheckout true
!echo "/\*" >> .git/info/sparse-checkout
!echo "!\*\*/\*.safetensors" >> .git/info/sparse-checkout
!git remote add -f master https://huggingface.co/$SD_SPACE$SD_MODEL
!git pull master main
%cd ~/SageMaker
!printf "=======Folder========%s\n$(ls)\n"
(3) 在 Notebook
中配置并使用模型,首先加载相关库与模型:
import torch
import datetime
from diffusers import StableDiffusionPipeline
# Load stable diffusion
pipe = StableDiffusionPipeline.from_pretrained(SD_MODEL, torch_dtype=torch.float16)
使用 GPU
进行运算并设定超参数,部分超参数如下:
768
像素):生成图像的高度(以像素为单位)
width (int, *optional, V2 默认模型可支持到 768
像素):生成图像的宽度(以像素为单位)
num_inference_steps (int, *optional, 默认降噪步数为 50
):降噪步数,更多的降噪步数通常会以较慢的推理为代价获得更高质量的图像
guidance_scale (float, *optional, 默认指导比例为 7.5
):较高的指导比例会导致图像与提示密切相关,但会牺牲图像质量,当 guidance_scale<=1
时会被忽略
negative_prompt (str or List[str], *optional):不引导图像生成的文本或文本列表
num_images_per_prompt (int, *optional, 默认每个提示生成 1
张图像):每个提示生成的图像数量
# move Model to the GPU
torch.cuda.empty_cache()
pipe = pipe.to("cuda")
print(datetime.datetime.now())
prompts =[
"Eiffel tower landing on the Mars",
"a photograph of an astronaut riding a horse,van Gogh style",
]
generated_images = pipe(
prompt=prompts,
height=512,
width=512,
num_images_per_prompt=1
).images # image here is in [PIL format](https://bbs.csdn.net/topics/618545628)
print(f"Prompts: {prompts}\n")
print(datetime.datetime.now())
for image in generated_images:
display(image)
(4) 将模型部署至 Sagemaker Inference Endpoint
,构建和训练模型后,可以将模型部署至终端节点,以获取预测推理结果:
import sagemaker
import boto3
sess = sagemaker.Session()
# sagemaker session bucket -> used for uploading data, models and logs
# sagemaker will automatically create this bucket if it not exists
sagemaker_session_bucket=None
if sagemaker_session_bucket is None and sess is not None:
# set to default bucket if a bucket name is not given
sagemaker_session_bucket = sess.default_bucket()
try:
role = sagemaker.get_execution_role()
except ValueError:
iam = boto3.client('iam')
role = iam.get_role(RoleName='sagemaker\_execution\_role')['Role']['Arn']
sess = sagemaker.Session(default_bucket=sagemaker_session_bucket)
print(f"sagemaker role arn: {role}")
print(f"sagemaker bucket: {sess.default\_bucket()}")
print(f"sagemaker session region: {sess.boto\_region\_name}")
创建自定义推理脚本 inference.py
:
!mkdir ./$SD_MODEL/code
# 为模型创建所需依赖声明的文件
%%writefile ./$SD_MODEL/code/requirements.txt
diffusers==0.13.1
transformers==4.26.1
# 编写 inference.py 脚本
%%writefile ./$SD_MODEL/code/inference.py
import base64
import torch
from io import BytesIO
from diffusers import StableDiffusionPipeline
def model\_fn(model_dir):
# Load stable diffusion and move it to the GPU
pipe = StableDiffusionPipeline.from_pretrained(model_dir, torch_dtype=torch.float16)
pipe = pipe.to("cuda")
return pipe
def predict\_fn(data, pipe):
# get prompt & parameters
prompt = data.pop("prompt", "")
# set valid HP for stable diffusion
height = data.pop("height", 512)
width = data.pop("width", 512)
num_inference_steps = data.pop("num\_inference\_steps", 50)
guidance_scale = data.pop("guidance\_scale", 7.5)
num_images_per_prompt = data.pop("num\_images\_per\_prompt", 1)
# run generation with parameters
generated_images = pipe(
prompt=prompt,
height=height,
width=width,
num_inference_steps=num_inference_steps,
guidance_scale=guidance_scale,
num_images_per_prompt=num_images_per_prompt,
)["images"]
# create response
encoded_images = []
for image in generated_images:
buffered = BytesIO()
image.save(buffered, format="JPEG")
encoded_images.append(base64.b64encode(buffered.getvalue()).decode())
# create response
return {"generated\_images": encoded_images}
打包模型并上传至 S3
桶:
#Package model, Estimated time to spend 2min(V1),5min(V2)
!echo $(date)
!tar --exclude .git --use-compress-program=pigz -pcvf ./$SD_MODEL'.tar.gz' -C ./$SD_MODEL/ .
!echo $(date)
from sagemaker.s3 import S3Uploader
print(datetime.datetime.now())
# upload model.tar.gz to s3, Estimated time to spend 30s(V1), 1min(V2)
sd_model_uri=S3Uploader.upload(local_path=f"{SD\_MODEL}.tar.gz", desired_s3_uri=f"s3://{sess.default\_bucket()}/stable-diffusion")
print(f"=======S3 File Location========\nmodel uploaded to:\n{sd\_model\_uri}")
![img](https://img-blog.csdnimg.cn/img_convert/baeae6f19b580cf99d9c295ca8b44015.png)
![img](https://img-blog.csdnimg.cn/img_convert/f0d1980dedb15a8b6be3fc4be1cc3904.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
aded to:\n{sd\_model\_uri}")
[外链图片转存中...(img-JOyPsQ3W-1714465985099)]
[外链图片转存中...(img-yZ8ddUix-1714465985099)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**