使用Amazon SageMaker构建高质量AI作画模子Stable Diffusion_sagemaker ai ...

打印 上一主题 下一主题

主题 538|帖子 538|积分 1614

现在人工智能模子可以分为两大种别,包括辨别模子 (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) 安装相关库并举行情况配置工作:
  1. # 检查环境版本
  2. !nvcc --version
  3. !pip list | grep torch
  4. # 安装Notebook运行模型所需的库文件
  5. !sudo yum -y install pigz
  6. !pip install -U pip
  7. !pip install -U transformers==4.26.1 diffusers==0.13.1 ftfy accelerate
  8. !pip install -U torch==1.13.1+cu117 -f https://download.pytorch.org/whl/torch_stable.html
  9. !pip install -U sagemaker
  10. !pip list | grep torch
复制代码
(2) 下载模子文件,我们将使用 Stable Diffusion V2 版本,其包含一个具有鲁棒性的文本生成图像模子,可以或许极大的进步了图像生成质量,模子相关先容拜见 Github:
  1. # 安装git lfs以克隆模型仓库
  2. !curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash
  3. !sudo yum install git-lfs -y
  4. # 设定模型版本的环境变量,使用 Stable Diffusion V2
  5. SD_SPACE="stabilityai/"
  6. SD_MODEL = "stable-diffusion-2-1"
  7. # 克隆代码仓库
  8. # Estimated time to spend 3min(V1), 8min(V2)
  9. %cd ~/SageMaker
  10. !printf "=======Current Path========%s\n"
  11. !rm -rf $SD_MODEL
  12. # !git lfs clone https://huggingface.co/$SD\_SPACE$SD\_MODEL -X "\*.safetensors"
  13. !mkdir $SD_MODEL
  14. %cd $SD_MODEL
  15. !git init
  16. !git config core.sparseCheckout true
  17. !echo "/\*" >> .git/info/sparse-checkout
  18. !echo "!\*\*/\*.safetensors" >> .git/info/sparse-checkout
  19. !git remote add -f master https://huggingface.co/$SD_SPACE$SD_MODEL
  20. !git pull master main
  21. %cd ~/SageMaker
  22. !printf "=======Folder========%s\n$(ls)\n"
复制代码
(3) 在 Notebook 中配置并使用模子,首先加载相关库与模子:
  1. import torch
  2. import datetime
  3. from diffusers import StableDiffusionPipeline
  4. # Load stable diffusion
  5. pipe = StableDiffusionPipeline.from_pretrained(SD_MODEL, torch_dtype=torch.float16)
复制代码
使用 GPU 举行运算并设定超参数,部门超参数如下:


  • prompt (str 或 List[str]):引导图像生成的文本提示或文本列表
  • height (int, *optional, V2 默认模子可支持到 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 张图像):每个提示生成的图像数量
  1. # move Model to the GPU
  2. torch.cuda.empty_cache()
  3. pipe = pipe.to("cuda")
  4. print(datetime.datetime.now())
  5. prompts =[
  6.     "Eiffel tower landing on the Mars",
  7.     "a photograph of an astronaut riding a horse,van Gogh style",
  8. ]
  9. generated_images = pipe(
  10.     prompt=prompts,
  11.     height=512,
  12.     width=512,
  13.     num_images_per_prompt=1
  14. ).images  # image here is in [PIL format](https://bbs.csdn.net/topics/618545628)
  15. print(f"Prompts: {prompts}\n")
  16. print(datetime.datetime.now())
  17. for image in generated_images:
  18.     display(image)
复制代码
(4) 将模子摆设至 Sagemaker Inference Endpoint,构建和训练模子后,可以将模子摆设至终端节点,以获取预测推理结果:
  1. import sagemaker
  2. import boto3
  3. sess = sagemaker.Session()
  4. # sagemaker session bucket -> used for uploading data, models and logs
  5. # sagemaker will automatically create this bucket if it not exists
  6. sagemaker_session_bucket=None
  7. if sagemaker_session_bucket is None and sess is not None:
  8.     # set to default bucket if a bucket name is not given
  9.     sagemaker_session_bucket = sess.default_bucket()
  10. try:
  11.     role = sagemaker.get_execution_role()
  12. except ValueError:
  13.     iam = boto3.client('iam')
  14.     role = iam.get_role(RoleName='sagemaker\_execution\_role')['Role']['Arn']
  15. sess = sagemaker.Session(default_bucket=sagemaker_session_bucket)
  16. print(f"sagemaker role arn: {role}")
  17. print(f"sagemaker bucket: {sess.default\_bucket()}")
  18. print(f"sagemaker session region: {sess.boto\_region\_name}")
复制代码
创建自定义推理脚本 inference.py:
  1. !mkdir ./$SD_MODEL/code
  2. # 为模型创建所需依赖声明的文件
  3. %%writefile ./$SD_MODEL/code/requirements.txt
  4. diffusers==0.13.1
  5. transformers==4.26.1
  6. # 编写 inference.py 脚本
  7. %%writefile ./$SD_MODEL/code/inference.py
  8. import base64
  9. import torch
  10. from io import BytesIO
  11. from diffusers import StableDiffusionPipeline
  12. def model\_fn(model_dir):
  13.     # Load stable diffusion and move it to the GPU
  14.     pipe = StableDiffusionPipeline.from_pretrained(model_dir, torch_dtype=torch.float16)
  15.     pipe = pipe.to("cuda")
  16.     return pipe
  17. def predict\_fn(data, pipe):
  18.     # get prompt & parameters
  19.     prompt = data.pop("prompt", "")
  20.     # set valid HP for stable diffusion
  21.     height = data.pop("height", 512)
  22.     width = data.pop("width", 512)
  23.     num_inference_steps = data.pop("num\_inference\_steps", 50)
  24.     guidance_scale = data.pop("guidance\_scale", 7.5)
  25.     num_images_per_prompt = data.pop("num\_images\_per\_prompt", 1)
  26.     # run generation with parameters
  27.     generated_images = pipe(
  28.         prompt=prompt,
  29.         height=height,
  30.         width=width,
  31.         num_inference_steps=num_inference_steps,
  32.         guidance_scale=guidance_scale,
  33.         num_images_per_prompt=num_images_per_prompt,
  34.     )["images"]
  35.     # create response
  36.     encoded_images = []
  37.     for image in generated_images:
  38.         buffered = BytesIO()
  39.         image.save(buffered, format="JPEG")
  40.         encoded_images.append(base64.b64encode(buffered.getvalue()).decode())
  41.     # create response
  42.     return {"generated\_images": encoded_images}
复制代码
打包模子并上传至 S3 桶:
  1. #Package model, Estimated time to spend 2min(V1),5min(V2)
  2. !echo $(date)
  3. !tar --exclude .git --use-compress-program=pigz -pcvf ./$SD_MODEL'.tar.gz' -C ./$SD_MODEL/ .
  4. !echo $(date)
  5. from sagemaker.s3 import S3Uploader
  6. print(datetime.datetime.now())
  7. # upload model.tar.gz to s3, Estimated time to spend 30s(V1), 1min(V2)
  8. sd_model_uri=S3Uploader.upload(local_path=f"{SD\_MODEL}.tar.gz", desired_s3_uri=f"s3://{sess.default\_bucket()}/stable-diffusion")
  9. print(f"=======S3 File Location========\nmodel uploaded to:\n{sd\_model\_uri}")
  10. ![img](https://img-blog.csdnimg.cn/img_convert/baeae6f19b580cf99d9c295ca8b44015.png)
  11. ![img](https://img-blog.csdnimg.cn/img_convert/f0d1980dedb15a8b6be3fc4be1cc3904.png)
  12. **网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
  13. **[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
  14. **一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  15. aded to:\n{sd\_model\_uri}")
  16. [外链图片转存中...(img-JOyPsQ3W-1714465985099)]
  17. [外链图片转存中...(img-yZ8ddUix-1714465985099)]
  18. **网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
  19. **[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
  20. **一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表