正文
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=1 # 每个提示词生成多少个图像 ).images # image here is in [PIL format](https://pillow.readthedocs.io/en/stable/) print(f"Prompts: {prompts}\n") print(datetime.datetime.now()) for image in generated_images: display(image)
在这里,我们设置了两个提示词:
- An eagle flying under the water
一只在水里翱翔的老鹰 - A pig kite flying in the sky
一只在天上飞翔的风筝猪
生成的结果如下:
3.5. 部署和使用训练好的模型
在确定模型可以正常使用之后,我们可以将模型部署到终端节点(Endpoint),这个过程分为两个阶段:
创建Stable Diffusion模型的推理节点
将模型部署到Cloud 9中作为Web应用
Amazon SageMaker 可以让我们将模型构建成自定义的推理脚本,该推理脚本可以直接接收json格式的输入,然后返回生成的图像数据。
# 提交json数据,接收生成的图像数据 response = predictor[SD_MODEL].predict(data={ "prompt": [ "An eagle flying in the water", # "A pig kite flying in the sky", ], "height" : 512, "width" : 512, "num_images_per_prompt":1 } ) # 解码生成的图像 decoded_images = [decode_base64_image(image) for image in response["generated_images"]] #visualize generation for image in decoded_images: display(image)
我们构建的推理脚本将模型的功能解耦成两个函数,实际上就是读取模型以及读取超参数和prompts:
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}
在这之后,我们要使用Hugging Face将stable-diffusion-v1-4模型上传到 Amazon S3桶。
from sagemaker.s3 import S3Uploader sd_model_uri=S3Uploader.upload(local_path=f"{SD_MODEL}.tar.gz", desired_s3_uri=f"s3://{sess.default_bucket()}/stable-diffusion") #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 5min(V1), 8min(V2) predictor[SD_MODEL] = huggingface_model[SD_MODEL].deploy( initial_instance_count=1, instance_type="ml.g4dn.xlarge", endpoint_name=f"{SD_MODEL}-endpoint" )
到这里为止,我们就已经创建好了Stable Diffusion模型的推理节点。然后我们在 AWS Cloud9 中为模型创建Web应用。
回到控制台主页,在搜索栏搜索Cloud9,并点击进入服务。
然后点击“Create environment”创建 AWS Cloud9 环境,我们只需要设置环境实例的名称即可,其余保持默认。有几个可调整选项:
lnstance type是实例的硬件类型,其中t2.micro是免费的类型。
Platform是操作系统类型。
Timeout是实例休眠时间,如果长时间没有访问,它会自动通知服务,防止持续计费。
设置好自己的实例属性之后,点击Create即可创建Cloud9环境实例。等待实例创建成功,即可点击“Open”打开实例IDE。
之后我们在控制台中输入以下命令:
cd ~/environment wget https://static.us-east-1.prod.workshops.aws/public/73ea3a9f-37c8-4d01-ae4e-07cf6313adac/static/code/SampleWebApp.zip unzip SampleWebApp.zip
这是一套简单的Web程序框架,包含:
- 后端代码 app.py:接收前端请求并调用 SageMaker Endpoint 将文字生成图片。
- 两个前端html文件 image.html 和 index.html。
然后,在控制台中输入命令安装 Flask和boto3。
pip3 install Flask pip3 install boto3
之后在左侧项目文件夹中打开 app.py,运行它。
然后我们点击 Run 按钮左侧的 “Preview”,选择“Preview Running Application”,就可以预览页面啦。在这个页面上输入prompt和width、length,会返回对应生成的图像。
3.6. 清理资源
完成实验的运行之后,一定要停止并删除自己创建的Notebook和Cloud9的所有资源,以确保不会继续计费。当然这一点在 Notebook的代码 中也提到了,这里再次强调。
4. 对Stable Diffusion模型的评估
由于本次实验不涉及模型的训练,因此超参数或者训练步数对模型性能、过拟合效应的影响无法被反映出来。为了评估模型的性能,我在这里设计了两个实验探究模型在不同情况下的效率区别。
4.1. CPU和GPU对生成速度的影响
我们选用ml.t3.medium(2CPU+4G内存)和ml.g4dn.xlarge(4CPU+16G内存+16G显存)来探究不同设备情况下生成图像速度的区别。对于每一种stable diffusion模型,我将height和width设为最大,num_images_per_prompt设为1。
设备 | stable-diffusion-v1-4 | stable-diffusion-v2-1 |
ml.t3.medium | 9s | 11s |
ml.g4dn.xlarge | 8s | 9s |
可以观察到,stable-diffusion-v2-1的图像生成速度相对于v1-4略慢,GPU的图像生成速度相对于CPU要快。
4.2. 超参数对模型性能的影响
在上文中我们已经提到,height、width和num_images_per_prompt会直接影响到GPU的内存开销。我们在这里选用ml.g4dn.xlarge设备来探究超参数变化对stable-diffusion-v1-4模型的图像生成速度会带来怎么样的影响。
超参数 | 配置1 | 配置2 | 配置3 | 配置4 |
height&width | 512 | 256 | 128 | 64 |
num_images_per_prompt | 1 | 1 | 1 | 1 |
用时 | 8s | 5s | 4s | 4s |
可以观察到,随着生成图像的height&width减小,生成图像的用时也在减少,但减少的幅度并非是线性的,可以预见的是,当图像小于128时,继续减小对图像的生成速度不会再有显著的影响。
超参数 | 配置1 | 配置2 | 配置3 | 配置4 |
height&width | 512 | 512 | 512 | 512 |
num_images_per_prompt | 4 | 3 | 2 | 1 |
用时 | 24s | 20s | 17s | 8s |
可以观察到,随着一次性生成图像数量的增加,生成所需要的时间也会同步增加,两者之间近似成正比关系。
5. 总结
5.1. 基于Amazon SageMaker搭建的AIGC应用的功能评价
我认为,可以从以下五个方面对Amazon SageMaker的功能进行评价:
模型训练功能
在Amazon SageMaker Notebook中,我们可以直接从Hugging Face下载所需要的预训练模型。在本次体验中,我们可以很容易地获取Stable Diffusion V1.4和V2.1两个版本,并且在使用的过程中,可以很方便地参考文档来理解各个超参数的含义和作用,快速实现模型的微调。
模型部署功能
训练好的模型不仅可以很方便地进行使用和微调,Amazon SageMaker也提供了多种部署教程,例如将模型打包成推理节点,以及使用Cloud9服务搭建带有UI的Web应用。
速度与易用性
Amazon SageMaker提供了多种实例类型供用户选择,对于不同的实例设备,可能会有使用体验上的差别,但毫无疑问的是,实例的初始化和使用是十分快捷方便的。
生态丰富度
虽然本次体验只带大家完成了AIGC应用的搭建,但Amazon SageMaker还包括了一系列机器学习和人工智能应用以及相对应的IDE,例如还可以基于Amazon SageMaker构建细粒度情感分析应用、使用Amazon SageMaker构建机器学习应用等等。
可视化能力
Amazon SageMaker提供了Jupyter Notebook的全部功能,也就具备了实时对表格、图像输出进行可视化的能力。此外在Cloud9服务中,也可以对部署的Web应用进行快速预览。对于JumpStart的训练过程,Amazon SageMaker也提供了监控终端节点的功能。
然而,Stable Diffusion模型本身并不完美,尽管在生成图像方面具有令人印象深刻的性能,但它也存在一些明显的局限性,包括但不限于:
分辨率不够,尽管v2.1版本相对于v1.4版本在分辨率上有了巨大的提升,但仍然不够,想要生成高质量的图片,需要很长的时间和足够的调试耐心。
仅适用英文,如果能加入中文或多语言数据进行训练,会有更广泛的应用场景。
对细节的处理不足,所生成的图像第一眼看过去是很惊艳的,但如果放大观察细节部分,会出现很多错位、扭曲的现象。
5.2. 对开发过程有帮助的产品文档汇总
以上提到的内容的相关介绍以及有关文档可参考:
Amazon SageMaker 入门教程:https://aws.amazon.com/cn/sagemaker/getting-started/
Amazon SageMaker产品介绍:https://aws.amazon.com/cn/sagemaker/
Amazon SageMaker产品文档:https://docs.aws.amazon.com/zh_cn/sagemaker/index.html
Stable Diffusion 模型文档(HuggingFace):https://huggingface.co/spaces/stabilityai/stable-diffusion
Stable Diffusion 模型文档(StabilityAI):https://stability.ai/blog/stable-diffusion-public-release
通过云上探索实验室,开发者可以学习实践云上技术,用技术实验、产品体验、案例应用等方式,亲身感受最新、最热门的亚马逊云科技开发者工具与服务。发挥自己的想象和创造,以文章、视频、代码 Demo 等形式将自己的技术心得分享给其他开发者小伙伴。一同创造分享,互助启发,玩转云上技术。云上探索实验室不仅是体验的空间,更是分享的平台。
本次亚马逊云科技举办的活动「云上探索实验室」,活动的主题是从实践中探索机器学习边界。一共有三个可体验的教程,分别是:使用 Amazon SageMaker 构建机器学习应用、基于 Amazon SageMaker构建细粒度情感分析应用、使用 Amazon SageMaker基于Stable Diffusion模型,快速搭建你的第一个AIGC应用。开启云上探索实验室1,和我来一起体验Amazon SageMaker吧。