当前位置: 代码网 > it编程>游戏开发>ar > 使用Amazon SageMaker构建高质量AI作画模型Stable Diffusion_sagemaker ai绘图

使用Amazon SageMaker构建高质量AI作画模型Stable Diffusion_sagemaker ai绘图

2024年08月05日 ar 我要评论
在输入框中输入所需的限额,例如 “1”,填写完毕后,点击“请求”按钮提交请求:等待配额请求通过后,就可以继续该实验过程。

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

在输入框中输入所需的限额,例如 “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 服务:

进入amazon sagemake服务

(3) 在左侧菜单栏,首先点击“笔记本”按钮,然后点击“笔记本实例”,进入笔记本 (notebook) 实例控制面板,并点击右上角”创建笔记本实例“按钮:

创建笔记本实例

(4) 配置笔记本实例设置,在创建笔记本实例详情页中,配置笔记本实例的基本信息,包括笔记本实例名称(例如 stable-diffusion)、笔记本实例类型(选择 ml.g4dn.xlarge 实例类型,该类型实例搭载 nvidia t4 tensor core gpu 显卡,提供了模型所需执行浮点数计算的能力)、平台标识符( amazon linux 2, jupyter lab 3 )和在“其他配置”下的卷大小(推荐至少 75gb 磁盘大小,用于存储机器学习模型):

配置笔记本实例

(5) 配置笔记本实例权限,为笔记本实例创建一个 iam 角色,用于调用包括 amazon sagemakers3 在内的服务,例如上传模型,部署模型等。在“权限和加密”下的 iam 角色中,点击下拉列表,单击“创建新角色”:

创建新角色

在配置页面中,保持默认配置,并点击“创建角色”按钮:

创建角色

成功创建 iam 角色后,可以得到类似下图的提示信息:

成功创建角色

(6) 检查配置的信息,确认无误后点击“创建笔记本实例”按钮,等待实例创建完成。

创建笔记本实例

(7) 当笔记本状态变为 inservice 后,点击“打开jupyter”进入 jupyter notebook

进入jupyter notebook

3.3 端到端体验 aigc

接下来,我们可以保存 notebook 代码文件,并将其上传到 jupyter notebook,然后直接运行代码,但亲手编写代码的体验是无与伦比,我们将介绍代码文件的主要内容,从头开始端到端体验 aigc!需要注意的是,需要确保 kernelconda_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 进行运算并设定超参数,部分超参数如下:

  • 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 张图像):每个提示生成的图像数量
# 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/forums/4f45ff00ff254613a03fab5e56a57acb)

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}")

print(datetime.datetime.now())

使用 huggingface 将模型部署至 amazon sagemaker

#init variables
huggingface_model = {}
predictor = {}

from sagemaker.huggingface.model import huggingfacemodel
# create hugging face model class
huggingface_model[sd_model] = huggingfacemodel(
    model_data=sd_model_uri, # path to your model and script
    role=role, # iam role with permissions to create an endpoint
    transformers_version="4.17", # transformers version used
    pytorch_version="1.10", # pytorch version used
    py_version='py38', # python version used
)

# deploy the endpoint endpoint, estimated time to spend 8min(v2)
print(datetime.datetime.now())

predictor[sd_model] = huggingface_model[sd_model].deploy(
    initial_instance_count=1,
    instance_type="ml.g4dn.xlarge",
    endpoint_name=f"{sd\_model}-endpoint"
)

print(f"\n{datetime.datetime.now()}")

基于推理终端节点生成自定义图片:

from pil import image
from io import bytesio
import base64

# helper decoder
def decode\_base64\_image(image_string):
    base64_image = base64.b64decode(image_string)
    buffer = bytesio(base64_image)
    return image.open(buffer)

response = predictor[sd_model].predict(data={
    "prompt": [
        "a bird is flying in space",
        "a photograph of an astronaut riding a horse",
    ],
    "height" : 512,
    "width" : 512,
    "num\_images\_per\_prompt":1
  }
)

#decode images
decoded_images = [decode_base64_image(image) for image in response["generated\_images"]]

#visualize generation
for image in decoded_images:
    display(image)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

一个人可以走的很快,但一群人才能走的更远!不论你是正从事it行业的老鸟或是对it行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

splay(image)



[外链图片转存中...(img-vvkx13vs-1715401945337)]
[外链图片转存中...(img-go2ayydy-1715401945337)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事it行业的老鸟或是对it行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com