Stable Diffusion 复现——基于 Amazon SageMaker 搭建文本生成图像模型

人工智能
机器学习
云上探索实验室
0
2
| 作者介绍:中杯可乐多加冰,武汉理工大学计算机科学与技术硕士,武汉理工大学UC科研团队成员,CSDN博客之星TOP12,目前研究方向为文本生成图像。作者微信号:大前端之旅|| | --- | --- | 众所周知,Stable Diffusion 扩散模型的训练和推理非常消耗显卡资源,我之前也是因为资源原因一直没有复现成功。 而最近我在网上搜索发现,亚马逊云科技最近推出了一个【云上探索实验室】刚好有复现 Stable Diffusion 的活动,其使用亚马逊云科技提供的 Amazon SageMaker 机器学习平台,为快速构建、训练和部署机器学习模型提供了许多便利的工具和服务,我也是深入体验了一番。 通过使用,从资源量、下载速度、安装速度、复现便捷性、文档、服务上的体验感都是非常不错,下面分享这篇复现博客给大家。 # 一、介绍 ## 1.1、文本生成图像工作简述 > 如果我们的计算机视觉系统要真正理解视觉世界,它们不仅必须能够识别图像,而且必须能够生成图像。文本到图像的 AI 模型仅根据简单的文字输入就可以生成图像。 用户可以输入他们喜欢的任何文字提示——比如,“一只可爱的柯基犬住在一个用寿司做的房子里”——然后,AI就像施了魔法一样,会产生相应的图像。文本生成图像(text-to-image)即根据给定文本生成符合描述的真实图像,其是多模态机器学习的任务之一,具有巨大的应用潜力,如视觉推理、图像编辑、视频游戏、动画制作和计算机辅助设计。 ## 1.2、Stable Diffusion 模型原理分析 文本生成图像中的扩散模型是一种将文本转化为图像的重要框架,它结合了分数阶扩散方程和卷积神经网络(CNN)的思想。这个方法的核心思想是将文本作为扩散源,通过扩散过程将文本信息传递到整个图像中,从而生成一张图像。 ![image.png](https://dev-media.amazoncloud.cn/c44afa31bbe4411291a40ba0f2dcf23a_image.png "image.png") 具体来说,文本生成图像中的扩散模型首先将文本转化为一个初始的激活图像,然后使用分数阶扩散方程描述扩散过程。在这个模型中,扩散过程可以理解为从激活图像的中心开始向周围扩散,每个像素点的扩散速度取决于该像素点与中心的距离和文本信息的权重。通过不断迭代扩散过程,激活图像逐渐扩散到整张图像中,从而生成一张与文本相关的图像。 ![image.png](https://dev-media.amazoncloud.cn/5ad058dad0604d5bb110feb501251b35_image.png "image.png") 而 Stable Diffusion 是 Diffusion Model 的一次巨大飞跃,Stable Diffusion 扩散模型是一种基于稳定分布的扩散过程模型。它是基于分数阶偏微分方程(Fractional Partial Differential Equation, FPDE)的扩散方程,其中分数阶导数表示了非局部扩散性质。Stable Diffusion 扩散模型采用了分数阶导数运算,相比传统的整数阶导数运算,它更加适用于描述具有长尾分布的数据。分数阶导数具有记忆效应,即某个时刻的扩散速度受到之前所有时刻扩散速度的影响,这使得stable扩散模型可以更好地描述扩散过程中的长时间记忆效应。 ## 1.3、Amazon SageMaker 机器学习平台 Amazon SageMaker 机器学习平台提供了一系列工具和服务能够快速构建、训练和部署机器学习模型,使机器学习工作流程更加高效、易用和可扩展,从而降低了机器学习的入门门槛,使更多的开发人员能够从中受益,经过体验后,我总结了以下几点: 1. 快速建模和训练:Amazon SageMaker提供了一些内置的算法和预置的机器学习环境,使开发人员可以快速构建和训练自己的模型,无需关注底层的计算和数据管理。 2. 高度可扩展:Amazon SageMaker支持水平扩展和自动缩放,可以处理大规模数据集和高并发的请求,从而保证了系统的可用性和性能。 3. 丰富的工具和服务:Amazon SageMaker提供了一系列的工具和服务,例如自动调参、模型解释、端点部署等,使开发人员能够更加轻松地管理和监控他们的机器学习工作流程。 4. 易于集成:Amazon SageMaker可以轻松地与其他AWS服务集成,例如Amazon S3、Amazon Cloud9、Amazon Lambda等,从而使开发人员可以更加便捷地进行数据管理和自动化部署。 5. 可扩展的部署选项:Amazon SageMaker提供了多种部署选项,包括托管式终端节点、自定义容器和本地部署,可以根据不同的场景和需求进行选择。 # 二、实验一:基于 Amazon SageMaker 复现Stable Diffusion ## 2.1、创建 Amazon SageMaker 实例 1、在查找服务处搜索关键词 SageMaker,进入 Amazon SageMaker 环境: ![image.png](https://dev-media.amazoncloud.cn/ae3c4a63b24b4a08b66f77fd2652813b_image.png "image.png") 2、在左侧找到笔记本,点击笔记本--笔记本实例--创建笔记本实例,进入以下选项,笔记本实例类型是需要申请的资源类型,可以看到 Amazon SageMaker 给我们提供了很多类型资源,我们选择加速型 g4dn.xlarge,在平台上我们选择熟悉的 Linux 和 Jupyter,卷大小也就是存储空间,可以随意选择但不宜小于 20GB。 ![image.png](https://dev-media.amazoncloud.cn/f53f527afa6c42f4b41154b442f8a4ce_image.png "image.png") 3、创建好后,我们在列表中就可以看到对应实例了,跟我们在其他云服务器中使用差不多,Amazon SageMaker 也给我们提供了熟悉的 Jupyter notebook。 ![image.png](https://dev-media.amazoncloud.cn/d4b595db75c34f568d14664c3dda104a_image.png "image.png") ## 2.2、配置代码与环境 我们点击打开 Jupyter页面,进入对应实例,选择右侧 upload,上传 Notebook 代码,代码下载链接: https://static.us-east-1.prod.workshops.aws/public/73ea3a9f-37c8-4d01-ae4e-07cf6313adac/static/code/notebook-stable-diffusion-ssh-inference.ipynb,先下载到本机,再上传到笔记本实例当中,上传成功后,点击打开: ![image.png](https://dev-media.amazoncloud.cn/978dc042979842929186ebc03e76cdd4_image.png "image.png") 在第一次进入时,系统会自动跳出提示,让你选择对应 kernel,我们选择conda_pytorch_p39 核,并点击 set kernel ![image.png](https://dev-media.amazoncloud.cn/38bad26d801243e1afd7d9813cdba677_image.png "image.png") 由于这个 Diffusion Model 的 Amazon SageMaker Jupyter 文件已经为我们写好了所有配置步骤,环境安装,我们直接点击 Run ![image.png](https://dev-media.amazoncloud.cn/7b3664bd766f43d7827744411aa14d34_image.png "image.png") 分析一下,该代码文件包含以下内容: - 在笔记本实例中下载并测试AIGC模型文件 - 编写模型推理入口代码,打包模型文件,并上传至S3桶 - 使用代码部署模型至Amazon SageMaker Inference Endpoint - (可选)使用会话管理器连接至Amazon SageMaker Inference Endpoint进行远程调试 ## 2.3、复现Stable Diffusion 通过上面的运行,已经将代码部署模型至 Amazon SageMaker Inference Endpoint,从而可以基于推理终端节点生成自定义图片,我们在 juypter notebook 的最后,加上这样一段代码,我们将想要生成的句子可以写在 prompt 里面。 ```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) #run prediction response = predictor[SD_MODEL].predict(data={ "prompt": [ "A cute panda is sitting on the sofa", "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) ``` 如上,我们试着生成**一张可爱的熊猫坐在沙发上面,一个宇航员在骑马**,等待几秒钟后,推理完成,得到如下结果: ![image.png](https://dev-media.amazoncloud.cn/b3cbf91efd064113b1f87bcef207a11b_image.png "image.png") ![image.png](https://dev-media.amazoncloud.cn/dcbaaace1a4b4db1a72261ac69a75404_image.png "image.png") # 三、实验二:基于 Vue3 +Amazon Cloud9 搭建一款文本生成图像 Web 应用 通过上面的实践,通过 Amazon SageMaker 的强大算力加持,我们已经成功训练好了 Diffusion Model 模型并保存了推理入口,但是光光只能在代码中调用不够,下面我们通过 Vue3+Flask 通过调用模型来搭建一款简单的文本生成图像 demo。 ## 3.1、在 Amazon Cloud9 创建后端 Flask服务 亚马逊为我们提供了一种和 VScode Web 版相同的基于云的集成开发环境 (IDE):Amazon Cloud9,我们首先在搜索栏搜索到 Cloud9,点击新建一个云环境: ![image.png](https://dev-media.amazoncloud.cn/9ee6d902b23e443f8f1fc3994be905d9_image.png "image.png") 创建好之后,我们可以在 Environments 中打开 Cloud9IDE ![image.png](https://dev-media.amazoncloud.cn/b508df133f7b494697fc9f989bb351ec_image.png "image.png") 与 VS Code Web 类似,**Amazon Cloud9 包括一个代码编辑器、调试程序和终端,并且预封装了适用于 JavaScript、Python、PHP 等常见编程语言的基本工具,无需安装文件或配置开发计算机,即可开始新的项目**。 ![image.png](https://dev-media.amazoncloud.cn/e492eba1a288402d8055f7725a5f51f0_image.png "image.png") 在下面的终端,我们输入以下代码,下载并解压 SampleWebApp 文件夹 ```cd ~/environment wget https://static.us-east-1.prod.workshops.aws/public/73ea3a9f-37c8-4d01-ae4e-07cf6313adac/static/code/SampleWebApp.zip unzip SampleWebApp.zip ``` 该文件夹包含以下内容: - 后端代码 app.py:接收前端请求并调用 SageMaker Endpoint 将文字生成图片。 - 两个前端 html 文件 image.html 和 index.html。 要运行此后端服务,首先需要安装相应环境,使用 pip3 安装 Flask 和 boto3 环境: ```pip3 install Flask pip3 install boto3 ``` 安装成功之后,点击左侧的 app.py文件,点击 Amazon Cloud9 上方的 Run 按钮运行代码,这样代码就可以调用 Amazon Simple Storage Service (Amazon S3)中已经保存好的 endpoint 进行文本生成图像推理,运行如下: ![image.png](https://dev-media.amazoncloud.cn/6c7658fe7481477b991bbe7cdb5febe5_image.png "image.png") 左侧可以看到后台为前端提供了 8080 端口,右侧前端页面提供了简单的 demo,width 和 length 代表输出图像的长宽,prompt 为输入的文本,同样测试 A cute panda is sitting on the sofa 这条语句,成功输出: ![image.png](https://dev-media.amazoncloud.cn/a0ca7cad46b04f86b99c68fdf99419c3_image.png "image.png") ## 3.2、在本机使用前端 Vue 搭建 Web demo 光在服务器调用不过瘾,我们尝试在本机搭建一款 Vue demo,然后调用 Amazon Cloud9 的 Flask 服务。如果你不想从零开始搭建,可以使用 git clone,克隆我上传的这个项目,然后直接跳到 3.3 继续实验流程。 ```git clone https://github.com/Heavenhjs/t2iweb-demo.git ``` 首先我们打开 VSCode,输入 npm create vite@latest 用 vite 初始化一款 Vue 项目,分别选择 Vue、TS 作为技术栈: ![image.png](https://dev-media.amazoncloud.cn/06cf136d8a5544c99fae22dc9d5418bd_image.png "image.png") 初始化好后,输入 npm i 安装相应依赖,然后输入 npm install element-plus --save 和 npm install axios 安装 element-plus、axios 依赖 ![image.png](https://dev-media.amazoncloud.cn/d0ff86cf669047c4ab08cf04fd6fae4c_image.png "image.png") 然后输入 npm run dev 启动项目,一个初始化项目就建好了: ![image.png](https://dev-media.amazoncloud.cn/30cc127a70444e1f9222aa2becbbaa24_image.png "image.png") 接下来,我们把原始给的东西清理一下,然后开始写一个 demo,需要设计一个表单,然后在表单下方设计一个值专门用于渲染后端传回来的 html 富文本,项目结构设计的比较简单如下所示,api 放的是调用后台 flask 服务的接口,components 里做了一个T2I的组件,utils 里是封装的 axios 服务,另外还需要在 vite.config.ts 里配置跨域。 ![image.png](https://dev-media.amazoncloud.cn/d1eb1b94e486414a9ff0a82e25bc4c26_image.png "image.png") 主要代码如下: ```// T2I.VUE <template> <div> <el-form :inline="true" :model="form" class="demo-form-inline"> <div> <el-form-item label="图像宽度:"> <el-select v-model="form.width" placeholder="请选择"> <el-option label="256" value="256" /> <el-option label="512" value="512" /> </el-select> </el-form-item> </div> <div> <el-form-item label="图像高度:"> <el-select v-model="form.length" placeholder="请选择"> <el-option label="256" value="256" /> <el-option label="512" value="512" /> </el-select> </el-form-item> </div> <div> <el-form-item label="对应文本:"> <el-input v-model="form.inputContent" :autosize="{ minRows: 2, maxRows: 4 }" type="textarea" placeholder="请输入想要生成的文本" /> </el-form-item> </div> <el-form-item> <el-button type="primary" @click="onSubmit">生成</el-button> <el-button type="primary" @click="onClean">清空</el-button> </el-form-item> </el-form> </div> <p v-html="image"></p> </template> <script setup lang="ts"> import { reactive, ref } from "vue"; import { T2I } from "../api/t2iApi"; const form = reactive({ inputContent: "", width: "", length: "", }); let image = ref("<p>请输入信息后,点击生成</p>"); const onSubmit = () => { console.log("submit!"); T2I(form).then((res: any) => { console.log(res.data); image.value = res.data; }); }; const onClean = () => { form.inputContent = ""; form.length = ""; form.width = ""; image.value = "<p>请输入信息后,点击生成</p>"; }; </script> <style lang="less"></style> ``` ```// t2iApi.ts import axios from "../utils/axios"; /** * @name 用户管理模块 */ // 获取用户列表 const PORT1 = "/api"; // T2I export const T2I = (parms: any) => { const form = new FormData(); form.append("inputContent", parms.inputContent); form.append("width", parms.width); form.append("length", parms.length); return axios.post(PORT1 + `/predictor`, form); }; ``` ## 3.3、使用Axios请求Cloud9的文本生成图像服务 为了安全,Amazon Cloud9 分配给环境的预览标签页中的 URL,只能在当环境的 IDE 处于打开状态并且应用程序正在同一个 Web 浏览器中运行时才有用,所以我们要通过公网ip和端口号的方式暴露接口。 为此首先我们要为实例修改安全组,打开8080端口,允许其传输数据,这样才可以访问到后端写好的Flask服务,具体步骤可以看手册这一章: [https://docs.aws.amazon.com/zh_cn/cloud9/latest/user-guide/app-preview.html](https://docs.aws.amazon.com/zh_cn/cloud9/latest/user-guide/app-preview.html?trk=cndc-detail) 打开8080端口后,可以用 Postman 测试一下,在body里面,加入 form-data,并输入对应的 key 和 value,点击 send 发送,显示200,下方栏返回 html 且 img 当中有值,则配置成功: ![image.png](https://dev-media.amazoncloud.cn/8c50124e92914d99b701b37e9fd7d345_image.png "image.png") 成功之后,我们就可以使用 Axios 来请求 Cloud9 的服务,这就需要在前端配置一下接口的 ip,打开 vite.config.ts,其中 target 需要改为自己 ACL 的公网 ip+ 端口号,这样就可以在本机上调用到 flask 的服务啦! ```import { defineConfig } from "vite"; import vue from "@vitejs/plugin-vue"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], server: { //服务器主机名 port: 8080, open: true, hmr: { host: "127.0.0.1", port: 5173, }, // 代理跨域 proxy: { "/api": { target : "这里输入亚马逊网络对应ACL的公网ip+端口号如:http://18.222.222.222:8080", changeOrigin: true, // 将/api去掉 rewrite: (path: string) => path.replace(/^\/api/, ""), }, }, }, }); ``` 最后输入"npm run dev"运行项目,效果如下: ![image.png](https://dev-media.amazoncloud.cn/994d20e4d61d400086c42e7e5511987f_image.png "image.png") ![image.png](https://dev-media.amazoncloud.cn/d1cc768e66be4604b4d4703ae2f8d2f1_image.png "image.png") # 3.4、避坑指南——注意事项和经验总结 问题1:配额不足或者无法申请配额 您的请求有问题。请参阅以下详细信息。User: arn:aws:sts::581067464334:assumed-role/TeamRole/MasterKey is not authorized to perform: servicequotas:ListAWSDefaultServiceQuotas with an explicit deny in an identity-based policy 解决方案:更换地区为美国东部 ![image.png](https://dev-media.amazoncloud.cn/3ac1ef34d3ce44e48a47030754c00b7c_image.png "image.png") 点击链接 [https://ap-northeast-1.console.aws.amazon.com/servicequotas/home/services/sagemaker/quotas进入配额列表,搜索:ml.g4dn.xlarge](https://docs.aws.amazon.com/zh_cn/cloud9/latest/user-guide/app-preview.html?trk=cndc-detail) for endpoint usage,点击请求申请增加配额。 ![image.png](https://dev-media.amazoncloud.cn/27676a2e7e074f9ba22f13211631e5bb_image.png "image.png") 问题2:404错误 可能是公网ip和端口号不对,可能是安全组的准入规则没有设置对,认真看一下手册,打开8080端口或者更换其他端口。 问题3:500 Bad Request Request传入的参数不对,检查一下表单输入的值和传输过去的数据是否符合规范,也有可能是后端flask服务断联了,重启一下flask服务就好了。 # 四、 总结 ## 4.1、Stable Diffusion 模型的表现和局限性 经过体验,Stable Diffusion 的效果着实惊艳到我,Stable Diffusion 模型可以生成高质量的图像和文本,表现出色。它能够通过对初始随机噪声的迭代扩散,逐步生成细节更加丰富、更加逼真的样本。而在多样化方面,即使在输入的条件相同的情况下也能够产生不同的输出,这是由于 Stable Diffusion 模型使用的扩散过程是随机的,每次迭代生成的噪声都是不同的,这就给了其丰富的商业价值和艺术空间。 但是尽管 Stable Diffusion 模型有许多优点,但它也存在一些局限性: 1. 计算资源消耗大:Stable Diffusion 模型需要大量的计算资源来训练和生成样本。对于大规模的数据集和复杂的生成任务,需要更多的计算资源来保证模型的表现,幸运的是,Amazon SageMaker 为我们提供了非常理想和便捷的计算资源,在体验过程中,着实为我解决了计算资源这一难题。 2. 训练时间长:与其他生成模型相比,Stable Diffusion 模型的训练时间较长,因为它需要在多个时间步骤上运行随机游走和扩散过程。这也会导致模型的可扩展性和实时性受到限制。 3. 对噪声敏感:Stable Diffusion 模型在生成样本时会受到噪声的影响,这可能导致生成的样本不够准确或存在不合理的部分。因此,需要对输入数据进行预处理和噪声消除来提高模型的性能。比如下面这一张,猫的脸部输出比较奇怪,扭曲在一起,图片也像是背景与前景的拼接,不太真实,这也是未来可以发展研究的重要方向之一。 ![image.png](https://dev-media.amazoncloud.cn/41ef16bdd3994d5586759af4a549da25_image.png "image.png") ## 4.2、Amazon SageMaker 机器学习平台实践体验 Amazon SageMaker 是亚马逊云科技(亚马逊云服务)提供的一个全面托管的机器学习平台,其提供了许多便利的工具和服务,帮助开发人员快速构建、训练和部署机器学习模型。通过亲身实践,我有如下体验: 1. 高速下载和库安装:在使用 Amazon SageMaker 的过程中,我们可以明显地感受到其下载速度非常快,这可以极大地提高我们的工作效率。同时,在使用 Amazon SageMaker 安装库时,我们也可以感受到它的速度非常快,这让我们可以更加专注于模型的构建和训练,而不必耗费大量的时间在等待安装库上。 ![image.png](https://dev-media.amazoncloud.cn/e9f8fb7768994a088ade3fbae3606659_image.png "image.png") ![image.png](https://dev-media.amazoncloud.cn/79a07a1d1f5343f1b377a1194d33d215_image.png "image.png") 2. 丰富的计算资源和配置:Amazon SageMaker 提供了许多丰富的计算资源和配置选项,以满足不同规模和需求的机器学习项目。无论是小规模的数据集还是大规模的数据集,Amazon SageMaker 都可以提供足够的计算资源,以支持训练大模型。同时,Amazon SageMaker 也提供了各种配置选项,可以根据具体的项目需求进行灵活的设置。 3. 惊人的文件读写速度:Amazon SageMaker 提供了高效的文件系统和存储选项,在使用中,仅仅不到两分钟,Amazon SageMaker 就成功写入并保存了 4.57GB 的模型。此外,Amazon SageMaker 还支持多种数据源和格式,包括Amazon S3、Amazon EBS 和 Amazon FSx,使数据管理和访问变得更加方便和灵活。 ![image.png](https://dev-media.amazoncloud.cn/ed3f86ff45b24b1eb03e2cc7d558c579_image.png "image.png") 4. 丰富的工具和服务:Amazon SageMaker 提供了许多强大的工具和服务,以帮助开发人员更加高效地管理和监控机器学习工作流程。例如,Amazon SageMaker 提供了自动调参、模型解释、端点部署等功能,这些功能可以大大提高我们的工作效率和模型的准确性。 5. 与其他亚马逊云科技服务的完美集成:Amazon SageMaker 可以与其他亚马逊云科技服务(如 S3、Cloud9 等)完美集成,以便更加方便地管理数据和进行自动化部署。这意味着我们可以将数据从 S3 传输到 Amazon SageMaker 中,使用 Cloud9 进行代码开发,然后将训练后的模型部署到 Amazon SageMaker 的终端节点中,这一切都可以在 Amazon SageMaker 平台上方便地完成。 # 五、云上探索实验室 亚马逊云科技正在开展云上探索实验室活动,云上探索实验室是为开发者打造的一项创新性云计算产品体验,旨在帮助开发者更好地了解和应用云计算技术,通过云上探索实验室,开发者可以学习实践云上技术,不仅是一个很好的体验空间,更是一个非常好的分享平台,正好其中有很多 AIGC 实例和视频教程,想要体验的朋友们,不容错过! *该动手实验方案由亚马逊云科技解决方案架构师团队提供 - 点击查看[实验手册内容](https://catalog.us-east-1.prod.workshops.aws/workshops/3b86fa89-da3a-4e5f-8e77-b45fb11adf4a/zh-CN?trk=cndc-detail)* ![image.png](https://dev-media.amazoncloud.cn/091b22c865344e0098851013547b0381_image.png "image.png") ![image.png](https://dev-media.amazoncloud.cn/efedaff2fdc6481d98d7b7e3cc1acc06_image.png "image.png")
2
目录
关闭