[Tools: LoRA] Diffusers中Stable Diffusion的实现

news/2024/9/18 12:25:00/ 标签: stable diffusion, LoRA, diffusers

实现底层原理

  • Diffusers中的Attention操作实现在AttnProcessor类(diffusers.models.attention_processor.py),里面定义了单次Attention操作。
  • 添加LoRA,本质上是用LoRAAttnProcessor类替换AttnProcessor类。
  • LoRAAttnProcessor中新增了四个线性层,分别是to_q_lora、to_k_lora、to_v_lora、to_out_lora,并在执行AttnProcessor前分配给attn,然后再嵌套执行AttnProcessor:

  • 修改的attn是Attention类,其中的to_q、to_k、to_v和to_out是LoRACompatibleLinear(diffusers.models.lora.py),在增加lora_layer后,计算如下。其中,scale是用来控制LoRA强度,如果为0则不添加LoRA

具体实现

  • 参考:threestudio中的LoRA实现
lora_attn_procs = {}
for name, processor in self.unet_lora.attn_processors.items():cross_attention_dim = (Noneif name.endswith("attn1.processor")else self.unet_lora.config.cross_attention_dim)if name.startswith("mid_block"):hidden_size = self.unet_lora.config.block_out_channels[-1]elif name.startswith("up_blocks"):block_id = int(name[len("up_blocks.")])hidden_size = list(reversed(self.unet_lora.config.block_out_channels))[block_id]elif name.startswith("down_blocks"):block_id = int(name[len("down_blocks.")])hidden_size = self.unet_lora.config.block_out_channels[block_id]processor_name = type(processor).__name__if processor_name == 'AttnProcessor':lora_attn_procs[name] = LoRAAttnProcessor(hidden_size=hidden_size, cross_attention_dim=cross_attention_dim)elif processor_name == 'AttnProcessor2_0':lora_attn_procs[name] = LoRAAttnProcessor2_0(hidden_size=hidden_size, cross_attention_dim=cross_attention_dim)else:raise ValueError(f"Unknown processor type {processor_name}")self.unet_lora.set_attn_processor(lora_attn_procs)
self.lora_layers = AttnProcsLayers(self.unet_lora.attn_processors).to(self.device
)
self.lora_layers._load_state_dict_pre_hooks.clear()
self.lora_layers._state_dict_hooks.clear()

SD的整体结构

  • diffusers中的SD实现为StableDiffusionPipeline,其中UNet为UNet2DConditionModel,包含down_block -> mid_block -> up_block。

  • 以down_block_types为例,包含3个CrossAttnDownBlock2D和1个DownBlock2D。对于CrossAttnDownBlock2D包含多组ResnetBlock2DTransformer2DModel,以及最后的Downsample2D。从下面代码中可以看到,LoRA的scale系数可以同时嵌入到上述三个加粗模块中:


http://www.ppmy.cn/news/1520830.html

相关文章

强连通分量专题总结

~~~~~ 总题单链接 ~~~~~ 对于只需要考虑强连通分量的题,就可以用强连通分量(大雾 ~~~~~ 我想了很久,确实没有什么好说的 … \ldots …

ECCV2024|RegionDrag:基于区域的图像编辑方法,通过手动拖拽实现图像编辑!

香港大学和牛津大学提出了一种使用扩散模型进行基于区域的快速图像编辑方法RegionDrag, RegionDrag 是一种基于区域的图像编辑方法,通过使用户能够通过 手柄和 目标区域表达指令,提供比点拖动方法更快、更精确的图像编辑,在速度上…

el-table利用折叠面板 type=“expand“ 嵌套el-table,并实现 明细数据多选,选中明细数据后返回原数据得嵌套格式

效果图: 废话不多说直接上代码&#xff0c;完整代码展示&#xff1a; <template><el-tableborderref"multipleTable":data"tableData"tooltip-effect"dark"style"width: 100%"><el-table-columnwidth"50"la…

Java | Leetcode Java题解之第385题迷你语法分析器

题目&#xff1a; 题解&#xff1a; class Solution {int index 0;public NestedInteger deserialize(String s) {if (s.charAt(index) [) {index;NestedInteger ni new NestedInteger();while (s.charAt(index) ! ]) {ni.add(deserialize(s));if (s.charAt(index) ,) {in…

创新之光闪耀,点赋科技在第十三届创新创业大赛中绽放光彩

近日&#xff0c;第十三届创新创业大赛决赛落下帷幕&#xff0c;这场充满激情与挑战的赛事吸引了众多优秀企业参与角逐。在激烈的竞争中&#xff0c;点赋科技脱颖而出&#xff0c;荣获第三名的佳绩。 创新创业大赛一直是企业展示实力、交流创新理念的重要平台。本次大赛中&…

前端防抖和节流函数的实现原理

在前端开发中&#xff0c;防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;是两种常用的优化技术&#xff0c;它们主要用于减少事件处理函数的执行频率&#xff0c;从而提高程序性能和用户体验。 防抖&#xff08;Debounce&#xff09; 防抖的目…

iomuxc、pinctrl子系统、gpio子系统(学习总结)

iomuxc、pinctrl子系统、gpio子系统三者的关系 相互依赖&#xff1a;IOMUXC、pinctrl子系统和gpio子系统在功能上相互依赖。IOMUXC提供了引脚复用和电气属性的配置能力&#xff0c;pinctrl子系统负责从设备树中获取这些配置信息并完成初始化&#xff0c;而gpio子系统则在引脚被…

UE 【材质编辑】自定义材质节点

使用UE的材质编辑器&#xff0c;蓝图提供了大量的节点函数&#xff1a; 实际上&#xff0c;这是一段封装好的包含一串HLSL代码的容器。打开“Source/Runtime/Engine/Classes/Material”&#xff0c;可以看到很多不同节点的头文件&#xff1a; 照葫芦画瓢 以UMaterialExpressi…

notepad++将换行替换成空

将多行里的换行置为一行&#xff0c;例如将下面的6行置为3行 crrlH打开替换框&#xff0c; 替换目标为【,\r\n】&#xff0c;替换成空&#xff0c;勾选循环查找和 正则表达式&#xff0c;全部替换即可。 替换后的效果

应该怎么从0搭建一个图像识别系统,如果想考计算机的研究生应该如何准备

搭建一个图像识别系统的过程可以分为以下几个步骤&#xff1a; 数据收集和准备&#xff1a;收集包含标注的图像数据集&#xff0c;并将其准备为训练集和测试集。确保数据集的多样性和代表性。 特征提取和选择&#xff1a;选择适当的特征提取方法&#xff0c;如卷积神经网络&am…

如何配置iSAID_Devkit环境

这个库有点年头了&#xff0c;使用README.md里的conda env create -f environment.yml会说包之间有冲突, 没法安装. 解决方法: 自己建立一个conda env, conda create -n py_isaid pip python3.6.8 记得自己提前定好python版本use gpt to transform environment.yml to setup.p…

mac安装spark

参考&#xff1a;在Mac上安装Spark apache-spark-3.5.1_mac安装spark-CSDN博客 几个需要用到的路径&#xff1a; hadoop的bin目录&#xff1a;/opt/homebrew/Cellar/hadoop/3.4.0/bin spark的conf目录/opt/homebrew/Cellar/apache-spark/3.5.2/libexec/conf spark的bin目录&am…

Elasticsearch之原理详解

简介 ES是使用 Java 编写的一种开源搜索引擎&#xff0c;它在内部使用 Lucene 做索引与搜索&#xff0c;通过对 Lucene 的封装&#xff0c;隐藏了 Lucene 的复杂性&#xff0c;取而代之的提供一套简单一致的 RESTful API 然而&#xff0c;Elasticsearch 不仅仅是 Lucene&#…

SpringCloud Alibaba】(十三)学习 RocketMQ 消息队列

目录 1、MQ 使用场景与选型对比1.1、MQ 的使用场景1.2、引入 MQ 后的注意事项1.3、MQ 选型对比 2、下载、安装 RocketMQ 及 RocketMQ 控制台2.1、下载安装 RocketMQ2.2、测试 RocketMQ 环境2.3、RocketMQ 控制台【图形化管理控制台】2.3.1、下载、安装2.3.2、验证 RocketMQ 控制…

day-49 使数组中所有元素相等的最小操作数

思路 第一个数和最后一个数要变为一致&#xff0c;需要操作n-1次&#xff0c;然后第二个数和倒数第二个数要操作n-3次 解题过程 以此类推即可得出答案 Code class Solution {public int minOperations(int n) {int ans0;int t(n-1);while(t>0){anst;t-2;}return ans;} }作…

String核心设计模式——建造者模式

目录 建造者模式 优点 缺点 使用场景 结构 步骤 1 Item.java Packing.java 步骤 2 Wrapper.java Bottle.java 步骤 3 Burger.java ColdDrink.java 步骤 4 VegBurger.java ChickenBurger.java Coke.java Pepsi.java 步骤 5 Meal.java 步骤 6 MealBuilder…

Proteus 仿真设计:开启电子工程创新之门

摘要&#xff1a; 本文详细介绍了 Proteus 仿真软件在电子工程领域的广泛应用。从 Proteus 的功能特点、安装与使用方法入手&#xff0c;深入探讨了其在电路设计、单片机系统仿真、PCB 设计等方面的强大优势。通过具体的案例分析&#xff0c;展示了如何利用 Proteus 进行高效的…

CSP-CCF ★201512-2 消除类游戏★

一、问题描述 问题描述 消除类游戏是深受大众欢迎的一种游戏&#xff0c;游戏在一个包含有n行m列的游戏棋盘上进行&#xff0c;棋盘的每一行每一列的方格上放着一个有颜色的棋子&#xff0c;当一行或一列上有连续三个或更多的相同颜色的棋子时&#xff0c;这些棋子都被消除。当…

Spring的核心设计模式——工厂模式

目录 工厂模式 工厂模式的类型 优点 缺点 使用场景 结构 实现 步骤 1 步骤 2 步骤 3 步骤 4 步骤 5 工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;它提供了一种创建对象的方式&#xff0c;使得创建对象的…

Scratch教师节:给老师的一封信

小虎鲸Scratch资源站-免费Scratch作品源码,素材,教程分享平台! 【Scratch教师节特别献礼】—— 给老师的一封信&#xff1a;编程之光&#xff0c;照亮梦想之路 在这个金秋送爽、硕果累累的季节里&#xff0c;我们迎来了一个特别而温馨的日子——教师节。在这个充满感激与敬意的…