使用 Keras 的 Stable Diffusion 实现高性能文生图

news2024/11/27 2:17:21

前言

在本文中,我们将使用基于 KerasCV 实现的 [Stable Diffusion] 模型进行图像生成,这是由 stable.ai 开发的文本生成图像的多模态模型。

Stable Diffusion 是一种功能强大的开源的文本到图像生成模型。虽然市场上存在多种开源实现可以让用户根据文本提示轻松创建图像,但 KerasCV 有一些独特的优势来加速图片生成,其中包括 XLA 编译混合精度支持等特性。所以本文除了介绍如何使用 KerasCV 内置的 StableDiffusion 模块来生成图像,另外我们还通过对比展示了使用 KerasCV 特性所带来的图片加速优势。

准备

  • N 卡,建议 24 G ,在下文使用 KerasCV 实际生成图像过程中至少需要 20 G
  • 安装 python 3.10 的 anaconda 虚拟环境
  • 安装 tensorflow gpu 2.10
  • 一颗充满想象力的大脑,主要是用来构建自己的文本 prompt

这里有一个工具函数 plot_images ,主要是用来把模型生成的图像进行展示。

def plot_images(images):
    plt.figure(figsize=(20, 20))
    for i in range(len(images)):
        plt.subplot(1, len(images), i + 1)
        plt.imshow(images[i])
        plt.axis("off")
    plt.show()

模型工作原理

超分辨率工作可以训练深度学习模型来对输入图像进行去噪,从而将其转换为更高分辨率的效果。为了实现这一目的,深度学习模型并不是通过恢复低分辨率输入图像中丢失的信息做到的,而是模型使用其训练数据分布来填充最有可能的给定输入的视觉细节。

然后将这个想法推向极限,在纯噪声上运行这样的模型,然后使用该模型不断去噪最终产生一个全新的图像。这就是潜在扩散模型的关键思想,

flowers.gif

现在要从潜在扩散过渡到文本生成图像的效果,需要添加关键字控制生成图像的能力,简单来说就是将一段文本的向量加入到到带噪图片中,然后在数据集上训练模型即可得到我们想要的文生图模型 Stable Diffusion 。这就产生了 Stable Diffusion 架构,主要由三部分组成:

  • text encoder:可将用户的提示转换为向量。
  • diffusion model:反复对 64x64 潜在图像进行去噪。
  • decoder:将最终生成的 64x64 潜在图像转换为更高分辨率的 512x512 图像。

基本模型架构图如下:

image.png

benchmark

我们使用 keras_cv 中的 StableDiffusion 模块构造一个文生图基准模型 model ,在对模型进行基准测试之前,先执行一次 text_to_image 函数来预热模型,以确保 TensorFlow graph已被跟踪,这样在后续使用模型进行推理时候的速度测试才是准确的。可以从日志中看到第一次运行的时间是 22 s ,这个不用去管他,我们只看第二个时间。

我这里的提示词是“There is a pink BMW Mini at the exhibition where the lights focus” ,生成 3 张图像,耗时 10.32 s

执行结束之后运行 keras.backend.clear_session() 清除刚刚运行的模型,以保证不会影响到后面的试验。

model = keras_cv.models.StableDiffusion(img_width=512, img_height=512, jit_compile=False)
model.text_to_image("warming up the model", batch_size=3)
start = time.time()
images = model.text_to_image("There is a pink BMW Mini at the exhibition where the lights focus", batch_size=3)
print(f"Standard model: {(time.time() - start):.2f} seconds")
plot_images(images)
keras.backend.clear_session()

日志打印:

25/25 [==============================] - 22s 399ms/step
25/25 [==============================] - 10s 400ms/step
Standard model: 10.32 seconds

319f63da759ac3c6d2b850d9465fef9.png

benchmark + Mixed precision

正如日志中打印的信息可以看到,我们这里构建的模型现在使用混合精度计算,利用 float16 运算的速度进行计算,同时以 float32 精度存储变量,这是因为 NVIDIA GPU 内核处理同样的操作,使用 float16 比 float32 要快得多。

我们这里和上面一样先将模型预热加载,然后针对我的提示词“There is a black BMW Mini at the exhibition where the lights focus”生成了 3 张图像,耗时 5.30s ,可以看到在 benchmark 基础上使用混合精度生成速度提升将近一倍。

keras.mixed_precision.set_global_policy("mixed_float16")
model = keras_cv.models.StableDiffusion(jit_compile=False)
print("Compute dtype:", model.diffusion_model.compute_dtype)
print("Variable dtype:",  model.diffusion_model.variable_dtype)
model.text_to_image("warming up the model", batch_size=3)
start = time.time()
images = model.text_to_image( "There is a black BMW Mini at the exhibition where the lights focus", batch_size=3,)
print(f"Mixed precision model: {(time.time() - start):.2f} seconds")
plot_images(images)
keras.backend.clear_session()

日志打印:

Compute dtype: float16
Variable dtype: float32
25/25 [==============================] - 9s 205ms/step
25/25 [==============================] - 5s 202ms/step
Mixed precision model: 5.30 seconds

179ce83c7bb1e25e5958d3c8a9dda51.png

benchmark + XLA Compilation

XLA(加速线性代数)是一种用于机器学习的开源编译器。XLA 编译器从 PyTorch、TensorFlow 和 JAX 等常用框架中获取模型,并优化模型以在不同的硬件平台(包括 GPU、CPU 和机器学习加速器)上实现高性能执行。

TensorFlow 和 JAX 附带 XLA , keras_cv.models.StableDiffusion 支持开箱即用的 jit_compile 参数。 将此参数设置为 True 可启用 XLA 编译,从而显著提高速度。

从日志中可以看到,在 benchmark 基础上使用 XLA 生成时间减少了 3.34 s

keras.mixed_precision.set_global_policy("float32")
model = keras_cv.models.StableDiffusion(jit_compile=True)
model.text_to_image("warming up the model", batch_size=3)
start = time.time()
images = model.text_to_image("There is a black ford mustang at the exhibition where the lights focus", batch_size=3, )
print(f"With XLA: {(time.time() - start):.2f} seconds")
plot_images(images)
keras.backend.clear_session()

日志打印:

25/25 [==============================] - 34s 271ms/step
25/25 [==============================] - 7s 271ms/step
With XLA: 6.98 seconds

0fe51809c822d71ad91d8a770dc517f.png

benchmark + Mixed precision + XLA Compilation

最后我们在 benchmark 基础上同时使用混合精度计算和 XLA 编译,最终生成同样的 3 张图像,时间仅为 3.96s ,与 benchmark 相比生成时间减少了 6.36 s ,生成时间大幅缩短!

keras.mixed_precision.set_global_policy("mixed_float16")
model = keras_cv.models.StableDiffusion(jit_compile=True)
model.text_to_image("warming up the model", batch_size=3, )
start = time.time()
images = model.text_to_image( "There is a purple ford mustang at the exhibition where the lights focus", batch_size=3,)
print(f"XLA + mixed precision: {(time.time() - start):.2f} seconds")
plot_images(images)
keras.backend.clear_session()

日志打印:

25/25 [==============================] - 28s 144ms/step
25/25 [==============================] - 4s 152ms/step
XLA + mixed precision: 3.96 seconds

630d45a4d883874517055b22ff61dce.png

结论

四种情况的耗时对比结果,展示了使用 KerasCV 生成图片确实在速度方面有特别之处:

  • benchmark : 10.32s
  • benchmark + Mixed precision :5.3 s
  • benchmark + XLA Compilation : 6.98s
  • benchmark + Mixed precision + XLA Compilation : 3.96s

那么,我们该如何学习大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、大模型全套的学习路线

学习大型人工智能模型,如GPT-3、BERT或任何其他先进的神经网络模型,需要系统的方法和持续的努力。既然要系统的学习大模型,那么学习路线是必不可少的,下面的这份路线能帮助你快速梳理知识,形成自己的体系。

L1级别:AI大模型时代的华丽登场

L2级别:AI大模型API应用开发工程

L3级别:大模型应用架构进阶实践

L4级别:大模型微调与私有化部署

一般掌握到第四个级别,市场上大多数岗位都是可以胜任,但要还不是天花板,天花板级别要求更加严格,对于算法和实战是非常苛刻的。建议普通人掌握到L4级别即可。

以上的AI大模型学习路线,不知道为什么发出来就有点糊,高清版可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1805385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux磁盘分区使用情况查询

一、磁盘分区使用情况查询 1. 查询磁盘整体使用情况使用 df -h进行查询 如图我们可以了解到磁盘的一些大致的使用情况,注意当已用部分有超过80%使用的分区就意味着你需要进行磁盘的清理了。 2.查询指定的磁盘使用情况 使用指令 du -h 当不指定目录时,默…

Vivado时序报告之Datasheet详解

目录 一、前言 二、Datasheet配置选项说明 2.1 Options 2.2 Groups 2.3 Timer Settings 2.4 Common Options 三、Datasheet报告 3.1 General Information 3.2 Input Ports Setup/Hold 3.3 Output Ports Clock-to-out 3.4 Setup between Clocks 3.5 Combinational…

物联网实战--平台篇之(十四)物模型(用户端)

目录 一、底层数据解析 二、物模型后端 三、物模型前端 四、数据下行 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 物联网…

基于Python的AI动物识别技术研究

基于Python的AI动物识别技术研究 开发语言:Python 数据库:MySQL所用到的知识:Django框架工具:pycharm、Navicat、Maven 系统功能实现 系统的登录模块设计 本次设计的AI动物识别系统为了保证用户的数据安全,设计了登录的模块&…

明天15点!如何打好重保预防针:迎战HVV经验分享

在当今数字化时代,网络攻击日益猖獗,各行各业面临的网络安全威胁不断升级。从钓鱼邮件到复杂的APT攻击,网络犯罪分子的手法层出不穷,给各行各业的信息安全带来了前所未有的挑战。 在这样的背景下,"HVV行动"应…

免费,C++蓝桥杯等级考试真题--第7级(含答案解析和代码)

C蓝桥杯等级考试真题--第7级 答案:D 解析:步骤如下: 首先,--a 操作会使 a 的值减1,因此 a 变为 3。判断 a > b 即 3 > 3,此时表达式为假,因为 --a 后 a 并不大于 b。因此,程…

如何远程连接Linux服务器?

远程连接Linux服务器是通过网络连接到位于远程位置的Linux服务器,以进行服务器管理和操作。远程连接使得系统管理员可以方便地远程访问服务器,进行配置、维护和故障排除等操作,而不必亲自在服务器前工作。以下是一些常用的远程连接方法&#…

使用小黄鸟(HttpCanary)、VMOS Pro虚拟机对手机APP进行抓包(附带软件)

老规矩先看,效果图: 文章很详细,希望可以耐心看完,保证可以学会抓包,不再走冤枉路,小编在之前看过太多类似文章,折腾了太久才搞懂的,写这篇文章就是不想希望你们像小编一样再花时间…

qmt量化交易策略小白学习笔记第15期【qmt编程之获取龙虎榜数据】

qmt编程之获取龙虎榜数据 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 获取龙虎榜数据 获取指定日期区间内的龙虎榜数据 内置python C.get_longhubang(stock_list, startTime, endTime)参…

十八、【源码】二级缓存

源码地址:https://github.com/mybatis/mybatis-3/ 仓库地址:https://gitcode.net/qq_42665745/mybatis/-/tree/18-second-levelcache 二级缓存 二级缓存,namespace级别,默认关闭,需要手动开启,在xml加入…

论文阅读《SELECTIVE DOMAIN-INVARIANT FEATURE FOR GENERALIZABLE DEEPFAKEDETECTION》

作者:Yingxin Lai、 Guoqing Yang1、Yifan He2、Zhiming Luo、Shaozi Li 期刊:ICASSP-2024 目的:解决泛化性的问题,提出了3个模块 论文整体的架构图:(挑选域特征不变,减少对图像内容或者风格…

我的编程语言学习记录:一段不断探索的旅程

目录 我的编程语言学习记录:一段不断探索的旅程 1.引言 2.我的编程之旅开始 第一站:Python — 简洁之美 第二站:JavaScript — 网页的魔法 第三站:Java — 企业级的力量 3.学习过程中的挑战与克服 1.理解概念 3.记忆语法…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第七周) - 结构化预测

结构化预测 0. 写在大模型前面的话1. 词法分析 1.1. 分词1.2. 词性标注 2.2. 句法分析 2.3. 成分句法分析2.3. 依存句法分析 3. 序列标注 3.1. 使用分类器进行标注 4. 语义分析 0. 写在大模型前面的话 在介绍大语言模型之前,先把自然语言处理中遗漏的结构化预测补…

Word Split Line

Word Split Line 分割线 https://download.csdn.net/download/spencer_tseng/89413772

Verilog实战学习到RiscV - 4 : ICEStick 评估板计数器

这篇是关于always 时序逻辑的。直接上代码。 引脚配置文件 set_io leds[0] 99 set_io leds[1] 98 set_io leds[2] 97 set_io leds[3] 96set_io -pullup yes pmod[0] 78 set_io -pullup yes pmod[1] 79参看icestick的原理图 这里在pmod上使用了内部的上拉电阻。…

两轮自平衡小车资料(L298N 模块原理图及使用说明+c源码)

本文详细介绍了基于STM32微控制器的两轮自平衡小车的设计与实现过程。内容包括小车的硬件选型、电路设计、软件编程以及PID控制算法的应用。通过陀螺仪和加速度计获取小车的姿态信息,利用PID控制算法调整电机输出,实现小车的自主平衡。此外,还…

mac Network: use --host to expose

本地启动无法访问,这个不是权限问题是mac 主机端口安全策略,现在我们只需要开启端口自动检测就可以 npm run dev --host 网络:未暴露 方案一 1、执行 npm run dev -- --host 方案二 1、请在 vite.config.js server: {host: true } 1…

c++之旅第十弹——IO流

大家好啊,这里是c之旅第十弹,跟随我的步伐来开始这一篇的学习吧! 如果有知识性错误,欢迎各位指正!!一起加油!! 创作不易,希望大家多多支持哦! 一.流的概念&…

知乎网站只让知乎用户看文章,普通人看不了

知乎默认不显示全部文章,需要点击展开阅读全文 然而点击后却要登录,这意味着普通人看不了博主写的文章,只有成为知乎用户才有权力查看文章。我想这不是知乎创作者希望的情况,他们写文章肯定是希望所有人都能看到。 这个网站篡改…

力扣每日一题129:从根节点到叶子节点的和

题目 中等 相关标签 相关企业 给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节…