探索稳定扩散技术中的LoRA权重激活:从模型微调到动漫风格图像生成的全过程

多重LoRA权重激发稳定扩散

  • 稳定扩散控制网络流水线
    • 步骤1:环境准备
    • 步骤2:模型转换
    • 步骤3:运行时流水线测试
  • 启用稳定扩散的LoRA权重
    • 步骤4-1:通过pytorch_lora_weights.bin启用LoRA
    • 步骤4-2:通过safetensors类型的权重启用LoRA
    • 步骤4-3:通过MatcherPass在运行时启用LoRA合并
    • 步骤4-4:启用多个LoRA权重

低秩适应(LoRA)技术是一种创新的方法,用于解决微调扩散器和大型语言模型(LLMs)的问题。在稳定扩散微调中,LoRA可应用于图像表示的交叉注意层,其中包含描述的潜在信息。为了理解模型微调的基本概念和方法,您可以参考Hugging Face扩散器的文档https://huggingface.co/docs/diffusers/training/lora

在这篇博客中,我们旨在介绍如何使用OpenVINO™优化构建Stable Diffusion + ControlNet管道,并启用LoRA权重,以便通过Stable Diffusion的Unet模型生成具有不同风格的图像。演示源代码基于https://github.com/FionaZZ92/OpenVINO_sample/tree/master/SD_controlnet

稳定扩散控制网络流水线

步骤1:环境准备

首先,按照以下步骤准备开发环境。您可以选择从Hugging Face下载模型以获得更好的运行时体验。在本例中,我们选择了ControlNet用于canny图像任务。

# 安装所需的依赖和下载模型
$ mkdir ControlNet && cd ControlNet
$ wget https://huggingface.co/lllyasviel/ControlNet/resolve/main/annotator/ckpts/body_pose_model.pth
$ conda create -n SD python==3.10
$ conda activate SD
$ pip install opencv-contrib-python
$ pip install -q "diffusers>=0.14.0" "git+https://github.com/huggingface/accelerate.git" controlnet-aux gradio
$ pip install openvino openvino-dev onnx
$ pip install torch==1.13.1 # 重要:确保使用torch==1.13.1
$ git lfs install
$ git clone https://huggingface.co/lllyasviel/sd-controlnet-canny 
$ git clone https://huggingface.co/runwayml/stable-diffusion-v1-5
$ git clone https://huggingface.co/openai/clip-vit-large-patch14 
$ wget https://huggingface.co/takuma104/controlnet_dev/blob/main/gen_compare/control_images/vermeer_512x512.png 

请注意,如果您的torch版本大于等于2.0,则扩散器将开始使用torch.nn.functional.scaled_dot_product_attention。由于ONNX不支持“Aten::scaled_dot_product_attention”的op转换,为了避免在模型转换时出现错误,请确保您使用的是torch==1.13.1。

步骤2:模型转换

使用提供的两个程序之一,将模型转换为OpenVINO™ IR。使用get_model.py脚本,通过以下方式检查脚本的选项:

$ python get_model.py -h

在这个例子中,我们选择多个批次大小以生成多个图像。视觉生成的常见应用有两个批次的概念:

  1. batch_size:指定输入提示或负提示的长度,用于生成N图像。
  2. num_images_per_prompt:指定每个提示生成的图像数量,用于生成M图像。

因此,对于常见的用户应用,可以在扩散器中使用这两个属性通过N提示生成 N ∗ M N*M NM图像。例如,基本种子是42,要生成 N ( 2 ) ∗ M ( 2 ) N(2)*M(2) N(2)M(2)图像,实际生成如下:

  • N=1,M=1:prompt_list[0],seed=42
  • N=1,M=2:prompt_list[0],seed=43
  • N=2,M=1:prompt_list[1],seed=42
  • N=2,M=2:prompt_list[1],seed=43

在这种情况下,以N=2,M=1作为快速演示的示例,因此使用–batch 2。此脚本将默认生成一个静态形状模型。如果您使用不同的N和M值,请指定–dynamic。

$ python get_model.py -b 2 -sd stable-diffusion-v1-5/

请检查您当前的路径,并确保您已经生成了以下模型。其他ONNX文件可以删除以节省空间。

  • controlnet-canny.<xml|bin>
  • text_encoder.<xml|bin>
  • unet_controlnet.<xml|bin>
  • vae_decoder.<xml|bin>

如果您的本地路径已经存在ONNX或IR模型,脚本将生成ONNX/IR。如果您更新了pytorch模型或想生成具有不同形状的模型,请记得删除现有的ONNX和IR模型。

步骤3:运行时流水线测试

提供的run_pipe.py程序是手动构建的用于StableDiffusionControlNet的流水线,参考了diffusers.StableDiffusionControlNetPipeline的源代码。您可以在GitHub查看源代码。

不同之处在于,通过OpenVINO™运行时API简化了流水线,通过该API可以确保在Intel® CPU和GPU平台上加速模型推断。

默认迭代次数为20,图像形状为 512 ∗ 512 512*512 512512,种子为42,输入图像和提示为“戴珍珠耳环的女孩”。您可以调整或自定义您的流水线属性以进行测试。

$ python run_pipe.py

在 batch_size=2 的情况下,生成的图像如下:

在这里插入图片描述

启用稳定扩散的LoRA权重

正常的LoRA权重有两种类型,一种是 pytorch_lora_weights.bin,另一种是使用safetensors。在这种情况下,我们为这两种LoRA权重介绍两种方法。

启用LoRA权重的主要思想是将权重附加到稳定扩散的原始Unet模型上,然后导出保留LoRA权重的Unet的IR模型。

在https://civitai.com/tag/lora上有各种LoRA模型,我们选择了HuggingFace上的一些公共模型作为示例,您可以考虑用自己的模型替换它们。

步骤4-1:通过pytorch_lora_weights.bin启用LoRA

此步骤介绍了通过 pipe.unet.load_attn_procs(…) 函数将LoRA权重添加到稳定扩散的Unet模型的方法。通过使用这种方式,LoRA权重将被加载到稳定扩散的Unet模型的注意力层中。

$ git clone https://huggingface.co/TheUpperCaseGuy/finetune-lora-stable-diffusion
$ rm unet_controlnet.* unet_controlnet/unet_controlnet.onnx
$ python get_model.py -b 2 -sd stable-diffusion-v1-5/ -lt bin -lw finetune-lora-stable-diffusion/

切记删除现有的 Unet 模型,以生成带有 LoRA 权重的新 IR

然后,运行管道推理程序检查结果。

$ python run_pipe.py

LoRA 权重加上稳定扩散模型和 controlNet 管道,可以生成如下图像:
在这里插入图片描述

步骤4-2:通过safetensors类型的权重启用LoRA

此步骤介绍了通过 'diffusers/scripts/convert_lora_safetensor_to_diffusers.py’将LoRA权重添加到稳定扩散的Unet模型的方法。Diffusers提供了使用safetensors类型的LoRA模型启用新的稳定扩散模型的脚本。通过此方法,您将需要将加权路径替换为具有LoRA的新生成的StableDiffusion模型。您可以调整 alpha 选项的值以更改注意力层中 W = W 0 + a l p h a ∗ d e l t a W W = W_0 + alpha * deltaW W=W0+alphadeltaW 的合并比率。

$ git clone https://huggingface.co/ntc-ai/fluffy-stable-diffusion-1.5-lora-trained-without-data
$ git clone https://github.com/huggingface/diffusers.git && cd diffusers
$ python scripts/convert_lora_safetensor_to_diffusers.py --base_model_path ../stable-diffusion-v1-5/ --checkpoint_path ../fluffy-stable-diffusion-1.5-lora-trained-without-data/fluffySingleWordConcept_v10.safetensors --dump_path ../stable-diffusion-v1-5-fluffy-lora --alpha=1.5
$ cd .. && rm unet_controlnet.* unet_controlnet/unet_controlnet.onnx
$ python get_model.py -b 2 -sd stable-diffusion-v1-5-fluffy-lora/ -lt safetensors

然后,运行管道推理程序检查结果。

$ python run_pipe.py

使用控制网管道的 LoRA 权重附加 SD 模型可以生成如下图像:在这里插入图片描述

步骤4-3:通过MatcherPass在运行时启用LoRA合并

此步骤介绍了在Unet或text_encoder模型编译之前在运行时添加LoRA权重的方法。对于具有多个不同LoRA权重的客户端应用,通过重用相同的Unet/text_encoder结构,可以更改图像样式,这将非常有帮助。

此方法是在safetensors文件中提取LoRA权重,找到Unet模型中的相应权重,并插入LoRA权重偏差。添加LoRA权重的通用方法如下:

W = W 0 + W b i a s ( a l p h a ∗ t o r c h . m m ( l o r a u p , l o r a d o w n ) ) W = W_0 + W_{bias}(alpha * torch.mm(lora_{up}, lora_{down})) W=W0+Wbias(alphatorch.mm(loraup,loradown))

本文打算通过OpenVINO™ opset10.add(W0, W_bias) 为Unet的注意力权重插入Add操作。Unet模型中的原始注意力权重是通过Const操作加载的,通常的处理路径是 Const->Convert->Matmul->…,如果我们添加LoRA权重,我们应该插入计算得到的LoRA权重偏差,如 Const->Convert->Add->Matmul->…。在这个函数中,我们采用openvino.runtime.passes.MatcherPass 以迭代方式插入 opset10.add(),并使用 call_back() 函数。
在这里插入图片描述

其中转换操作将首先插入 opset.Add(),然后在使用设备进行模型编译期间。图将执行常量折叠,以将Add操作与接下来的MatMul操作合并,以优化模型的运行时推断。因此,这是将LoRA权重合并到原始模型的有效方法。

您可以查看实现源代码,并找到称为 InsertLoRA(MatcherPass) 的MatcherPass函数的定义。

class InsertLoRA(MatcherPass):def __init__(self,lora_dict_list):MatcherPass.__init__(self)self.model_changed = Falseparam = WrapType("opset10.Convert")def callback(matcher: Matcher) -> bool:root = matcher.get_match_root()root_output = matcher.get_match_value()for y in lora_dict_list:if root.get_friendly_name().replace('.','_').replace('_weight','') == y["name"]:consumers = root_output.get_target_inputs()lora_weights = ops.constant(y["value"],Type.f32,name=y["name"])add_lora = ops.add(root,lora_weights,auto_broadcast='numpy')for consumer in consumers:consumer.replace_source_output(add_lora.output(0))# Use new operation for additional matchingself.register_new_node(add_lora)# Root node wasn't replaced or changedreturn Falseself.register_matcher(Matcher(param,"InsertLoRA"), callback)

'InsertLoRA(MatcherPass) '函数将通过 'manager.register_pass(InsertLoRA(lora_dict_list))'进行注册,并通过 ‘manager.run_passes(ov_unet)’ 被调用。在此运行时MatcherPass操作之后,使用设备插件编译的图已准备好进行推断。

运行一个流水线推断程序来检查结果。结果与步骤4-2相同。

python run_pipe.py -lp fluffy-stable-diffusion-1.5-lora-trained-without-data/fluffySingleWordConcept_v10.safetensors -a 1.5

LoRA 权重加上稳定扩散模型和 controlNet 管道,可以生成如下图像:

在这里插入图片描述

步骤4-4:启用多个LoRA权重

有许多不同的方法可以添加多个LoRA权重。我在这里列出两种方法。假设您有两个LoRA权重,LoRA A和LoRA B。您可以简单地按照步骤4-3的方法循环使用MatcherPass函数,将其插入到原始Unet Convert层和LoRA A的添加层之间。这很容易实现。但是,这样的性能不够好。
在这里插入图片描述
请考虑MatcherPass函数的逻辑。此函数需要过滤出所有具有Convert类型的层,然后通过条件判断确定每个由权重Constant连接的Convert层是否已在LoRA权重文件中进行了微调和更新。LoRA启用的主要成本由InsertLoRA()函数耗费,因此主要思想是只调用InsertLoRA()函数一次,但附加多个LoRA文件的权重。
在这里插入图片描述
通过上述方法添加多个LoRA,附加2个或更多LoRA权重的成本几乎与添加1个LoRA权重相同。

现在,让我们将稳定扩散与dreamlike-anime-1.0一起更改,以生成具有动画风格的图像。我从 https://civitai.com/tag/lora 中挑选了两个SD 1.5的LoRA权重。

  • soulcard: https://civitai.com/models/67927?modelVersionId=72591
  • epi_noiseoffset: https://civitai.com/models/13941/epinoiseoffset

您可能需要进行提示工程工作以生成如下有用的提示:

  • prompt: “1girl, cute, beautiful face, portrait, cloudy mountain, outdoors, trees, rock, river, (soul card:1.2), highly intricate details, realistic light, trending on cgsociety, neon details, ultra-realistic details, global illumination, shadows, octane render, 8k, ultra sharp”
  • Negativate prompt: “3D, cartoon, low-res, bad anatomy, bad hands, text, error”
  • Seed: 0
  • num_steps: 30
  • canny low_threshold: 100
$ python run_pipe.py -lp soulcard.safetensors -a 0.7 -lp2 epi_noiseoffset2.safetensors -a2 0.7

您可以获得一个美妙的图像,生成一个带有灵魂卡典型边框的动画女孩,如下图所示:

在这里插入图片描述
这样,您已经学到了如何在Stable Diffusion和ControlNet管道中使用LoRA权重,并且可以生成具有不同风格的图像。希望这能满足您的需求!

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

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

相关文章

008 OpenCV matchTemplate 模板匹配

目录 一、环境 二、模板匹配算法原理 三、代码演示 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、模板匹配算法原理 cv.matchTemplate是OpenCV库中的一个函数&#xff0c;用于在图像中查找与模板匹配的特征。它的主要应用场景…

leetcode:645. 错误的集合(python3解法)

难度&#xff1a;简单 集合 s 包含从 1 到 n 的整数。不幸的是&#xff0c;因为数据错误&#xff0c;导致集合里面某一个数字复制了成了集合里面的另外一个数字的值&#xff0c;导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了集合 S 发生错误后的结…

创建 Plotly 的散点线图

一 使用 Plotly 画图 import plotly.graph_objects as godef img_show_fig(out_data_today):# 创建 Plotly 的散点线图fig go.Figure()# 添加散点线fig.add_trace(go.Scatter(xout_data_today.index,yout_data_today.values,modelinesmarkers,markerdict(colorred, # 设置数…

揭秘周杰伦《最伟大的作品》MV,绝美UI配色方案竟然藏在这里

色彩在UI设计的基本框架中占据着举足轻重的位置。实际上&#xff0c;精心挑选和组合的色彩配色&#xff0c;往往就是UI设计成功的不二法门。在打造出一个实用的UI配色方案过程中&#xff0c;我们需要有坚实的色彩理论知识&#xff0c;同时还需要擅于从生活中观察和提取灵感。以…

uboot中nfs和tftp方式获取文件

NFS文件系统挂载 服务器端配置如下 1.Server端需要安装NFS服务&#xff1a; sudo apt-get install nfs-kernel-server2.创建需要挂载的路径&#xff1a; mkdir -p /home/workspace/mercury/nfs_path3.创建共享目录&#xff1a; ①vim /etc/exports ②在文件中添加&#xff…

Java 中 HashSet 和 TreeSet 的区别

简介&#xff1a; 在Java开发中&#xff0c;HashSet和TreeSet都是常用的集合类&#xff0c;用于存储不重复的元素。虽然它们都实现了Set接口&#xff0c;并提供了相似的功能&#xff0c;但在内部实现和特性上存在一些区别。本文将深入探讨HashSet和TreeSet的差异&#xff0c;帮…

人机交互模块的发展

人机交互&#xff08;Human-Computer Interaction&#xff0c;HCI&#xff09;是指人与计算机之间进行交互和信息交换的过程。人机交互模块的发展经历了多个阶段&#xff0c;从早期的命令行界面到现在多样化的交互方式&#xff0c;不断发展和创新。以下是一些人机交互模块的发展…

蓝桥杯物联网竞赛_STM32L071_2_继电器控制

CubeMX配置&#xff1a; Function.c及Function.h&#xff1a; #include "Function.h" #include "gpio.h" void Function_LD5_ON(void){HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET); }void Function_LD5_OFF(void){HAL_GPIO_WritePin(LD5_…

角色管理--产品经理岗

研发组织管理--角色管理--产品经理岗 定位 相对稳定和简单产品的独立产品打造者&#xff0c;复杂产品的辅助者 所需资质 校招新人&#xff0c;拥有灵性拥有基础的产品力&#xff08;认知&#xff0c;设计&#xff0c;创新&#xff0c;推进&#xff0c;学习&#xff09;Axur…

解决Vue项目的runtime-only转为runtime-compiler

我们在vue.config.js中添加上 runtimeCompiler: true,然后再将main.js入口文件中的Vue实例改为以下即可 //修改前 new Vue({router,store,render: (h) > h(App) }).$mount(#app) //修改后 new Vue({el:#app,router,store, components:{App}, template:<App/>})

解锁word密码,忘记密码怎么办?

想要解密、找回或去除Word文档密码&#xff0c;可以按以下步骤操作&#xff1a;第一步&#xff0c;在百度上搜索【密码帝官网】&#xff0c;接着在用户中心上传需要解密的文件即可。这种方法安全、简单易操作&#xff0c;而且不用下载软件&#xff0c;手机和电脑都可以用。无论…

uniapp 使用Highcharts,多色曲线,多色阴影,百分比,网格等处理,accessibility.js提示错误处理

示例图 1.安装Highcharts npm install highcharts --save npm install highcharts-vue2.demo代码 <template><view class"charts-main"><view id"charts" style"width: 90%;height: 460rpx;"></view></view>&l…

虚拟机系列:windows 虚拟机相关功能、组件梳理

一. 简介 英文名称中文名称说明Container容器Guarded Host受保护的主机利用远程证明创建并运行受防护的虚拟机Hyper-V├Hyper-V Management ToolsHyper-V 管理工具包含 GUI 管理工具和 Power Shell 的 Hyper-V 模块└Hyper-V PlatformHyper-V 平台├Hyper-V HypervisorHyper-V …

如何实现高效的绩效面谈?

企业绩效面谈是绩效管理的核心工作之一&#xff0c;管理者需要对员工的绩效表现进行评价和交流、对前期的实施效果进行总结&#xff0c;以使绩效管理体系在下一个周期运行得更好&#xff0c;达到提升绩效的目的。然而在实际工作中&#xff0c;许多公司的绩效面谈并未能发挥其应…

全民 K 歌音频相关技术分享

日期 &#xff1a;2021.05.22 技术分享介绍&#xff1a;https://zhuanlan.zhihu.com/p/373506048 技术分享视频&#xff1a;https://app6ca5octe2206.pc.xiaoe-tech.com/p/t_pc/course_pc_detail/column/p_60ae5c89e4b00176519f2e5b

微服务负载均衡器Ribbon

1.什么是Ribbon 目前主流的负载方案分为以下两种&#xff1a; 集中式负载均衡&#xff0c;在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的&#xff08;比如 F5&#xff09;&#xff0c;也有软件的&#xff08;比如 Nginx&#xff09;。 客户端根据…

多线程 02

1.线程的常见构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用 Runnable 对象创建线程对象Thread(String name)创建线程对象&#xff0c;并命名Thread(Runnable target, String name)使用 Runnable 对象创建线程对象&#xff0c;并命名【了解】Thread(Threa…

JS文字操作库(亲测可用)

使用 <template><div class"app"><li class"main_right-btn" click"selectionColor(yellow)">题干标识</li><li class"main_right-btn" click"selectionColor(transparent)">取消标识</li…

K-means算法

K-means算法 Lloyd k-means Algorithm 样本矩阵&#xff1a; X [ x 1 , x 2 , . . . , x n ] ∈ R d n X[x_1,x_2,...,x_n] ∈R^{dn} X[x1​,x2​,...,xn​]∈Rdn&#xff0c;有n个 x i x_i xi​每个 x i x_i xi​是d维 簇集合&#xff1a; C [ C 1 , C 2 , . . . , C c …

自由飞翔之小鸟

一、创建文件、包、类、插入图片文件 二、app包 1、Gameapp类&#xff08;运行游戏&#xff09; package app;import main.GameFrame;public class Gameapp {public static void main(String[] args) {//游戏的入口new GameFrame();} } 三、main包 1、Barrier&#xff08;障…