Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作

文章目录

    • Stable Diffusion安装
      • AnimateDiff插件适配
      • sdxl模型适配
    • Stable Diffusion使用
      • 插件安装
      • 界面设置
      • 基础文生图
      • 加入lora的文生图

Stable Diffusion安装

我的情况比较特殊,显卡版本太老,最高也就支持cuda10.2,因此只能安装pytorch1.12.1,并且无法安装xformers。
在这里插入图片描述

在安装好虚拟环境和对应pytorch版本后,按照github教程安装stable diffusion webui即可,在webui.sh中将use_venv=1 (默认) 修改为use_venv=0,以在当前激活的虚拟环境中运行webui,然后执行bash webus.sh安装相关依赖。

针对显卡使用情况,可在webui-user.sh中设置可见显卡export CUDA_VISIBLE_DEVICES=0,1,2,并在执行webui.py时在命令行中通过--device-id=1指定具体的使用设备。

为了使用最新的模型和插件,需要做出以下适配:

AnimateDiff插件适配

该插件的原理是在调用和完成时分别向原始模型中注入(inject)和删除(restore)时间步模块从而生成连续变化的GIF,由于整体版本过老,直接执行该插件会报没有insert和pop方法的错误,因此需要在animatediff_mm.py文件中手动实现这两个函数,需要注意insert和pop的操作和通常理解不一样:

    def inject(self, sd_model, model_name="mm_sd_v15.ckpt"):unet = sd_model.model.diffusion_modelself._load(model_name)self.gn32_original_forward = GroupNorm32.forwardgn32_original_forward = self.gn32_original_forward# self.tes_original_forward = TimestepEmbedSequential.forward# def mm_tes_forward(self, x, emb, context=None):#     for layer in self:#         if isinstance(layer, TimestepBlock):#             x = layer(x, emb)#         elif isinstance(layer, (SpatialTransformer, VanillaTemporalModule)):#             x = layer(x, context)#         else:#             x = layer(x)#     return x# TimestepEmbedSequential.forward = mm_tes_forwardif self.mm.using_v2:logger.info(f"Injecting motion module {model_name} into SD1.5 UNet middle block.")# unet.middle_block.insert(-1, self.mm.mid_block.motion_modules[0])# unet.middle_block.add_module('new_module', self.mm.mid_block.motion_modules[0])# unet.middle_block.appendself.mm.mid_block.motion_modules[0])unet.middle_block = unet.middle_block[0:-1].append(self.mm.mid_block.motion_modules[0]).append(unet.middle_block[-1])# n = len(unet.middle_block._modules)# index = -1# if index < 0:#     index += n# for i in range(n, index, -1):#     unet.middle_block._modules[str(i)] = unet.middle_block._modules[str(i - 1)]# unet.middle_block._modules[str(index)] = unet.middle_blockelse:logger.info(f"Hacking GroupNorm32 forward function.")def groupnorm32_mm_forward(self, x):x = rearrange(x, "(b f) c h w -> b c f h w", b=2)x = gn32_original_forward(self, x)x = rearrange(x, "b c f h w -> (b f) c h w", b=2)return xGroupNorm32.forward = groupnorm32_mm_forwardlogger.info(f"Injecting motion module {model_name} into SD1.5 UNet input blocks.")for mm_idx, unet_idx in enumerate([1, 2, 4, 5, 7, 8, 10, 11]):mm_idx0, mm_idx1 = mm_idx // 2, mm_idx % 2unet.input_blocks[unet_idx].append(self.mm.down_blocks[mm_idx0].motion_modules[mm_idx1])logger.info(f"Injecting motion module {model_name} into SD1.5 UNet output blocks.")for unet_idx in range(12):mm_idx0, mm_idx1 = unet_idx // 3, unet_idx % 3if unet_idx % 3 == 2 and unet_idx != 11:# unet.output_blocks[unet_idx].insert(#     -1, self.mm.up_blocks[mm_idx0].motion_modules[mm_idx1]# )# unet.output_blocks[unet_idx].add_module('new_module', self.mm.up_blocks[mm_idx0].motion_modules[mm_idx1])# unet.output_blocks[unet_idx].append(self.mm.up_blocks[mm_idx0].motion_modules[mm_idx1])unet.output_blocks[unet_idx] = unet.output_blocks[unet_idx][0:-1].append(self.mm.up_blocks[mm_idx0].motion_modules[mm_idx1]).append(unet.output_blocks[unet_idx][-1])else:unet.output_blocks[unet_idx].append(self.mm.up_blocks[mm_idx0].motion_modules[mm_idx1])self._set_ddim_alpha(sd_model)self._set_layer_mapping(sd_model)logger.info(f"Injection finished.")def restore(self, sd_model):self._restore_ddim_alpha(sd_model)unet = sd_model.model.diffusion_modellogger.info(f"Removing motion module from SD1.5 UNet input blocks.")for unet_idx in [1, 2, 4, 5, 7, 8, 10, 11]:# unet.input_blocks[unet_idx].pop(-1)unet.input_blocks[unet_idx] = unet.input_blocks[unet_idx][:-1]logger.info(f"Removing motion module from SD1.5 UNet output blocks.")for unet_idx in range(12):if unet_idx % 3 == 2 and unet_idx != 11:# unet.output_blocks[unet_idx].pop(-2)unet.output_blocks[unet_idx] = unet.output_blocks[unet_idx][:-2].append(unet.output_blocks[unet_idx][-1])else:# unet.output_blocks[unet_idx].pop(-1)unet.output_blocks[unet_idx] = unet.output_blocks[unet_idx][:-1]if self.mm.using_v2:logger.info(f"Removing motion module from SD1.5 UNet middle block.")# unet.middle_block.pop(-2)unet.middle_block = unet.middle_block[:-2].append(unet.middle_block[-1])else:logger.info(f"Restoring GroupNorm32 forward function.")GroupNorm32.forward = self.gn32_original_forward# TimestepEmbedSequential.forward = self.tes_original_forwardlogger.info(f"Removal finished.")if shared.cmd_opts.lowvram:self.unload()

sdxl模型适配

在选择sdxl模型时,会收到如下报错:

AssertionError: We do not support vanilla attention in 1.12.1+cu102 anymore, as it is too expensive. Please install xformers via e.g. 'pip install xformers==0.0.16'

然后就会自动下载模型,但由于hugging face的连接问题,会报这种错误:

requests.exceptions.ConnectTimeout: (MaxRetryError("HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /laion/CLIP-ViT-bigG-14-laion2B-39B-b160k/resolve/main/open_clip_pytorch_model.bin (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7fc89a4438b0>, 'Connection to huggingface.co timed out. (connect timeout=10)'))"), '(Request ID: 9f90780e-6ae0-4531-83df-2f5052c4a1a3)')

这时就需要把所有下不了的模型下载到本地,然后把代码里的version由模型名称改成模型路径,例如将repositories/generative-models/configs/inference/sd_xl_base.yaml中的version: laion2b_s39b_b160k改成本地的/models/hugfac/CLIP-ViT-bigG-14-laion2B-39B-b160k/open_clip_pytorch_model.bin

但到这里还没完,为了能正常运行,需要在代码里把对于xformer的检查相关Assert部分注释掉,并重新实现repositories/generative-models/sgm/modules/diffusionmodules/model.py中的attention函数:

def attention(self, h_: torch.Tensor) -> torch.Tensor:h_ = self.norm(h_)q = self.q(h_)k = self.k(h_)v = self.v(h_)# compute attentionB, C, H, W = q.shapeq, k, v = map(lambda x: rearrange(x, "b c h w -> b (h w) c"), (q, k, v))q, k, v = map(lambda t: t.unsqueeze(3).reshape(B, t.shape[1], 1, C).permute(0, 2, 1, 3).reshape(B * 1, t.shape[1], C).contiguous(),(q, k, v),)# out = xformers.ops.memory_efficient_attention(#     q, k, v, attn_bias=None, op=self.attention_op# )k = k / (k.shape[-1] ** 0.5)attn = torch.matmul(q, k.transpose(-2, -1))attn = torch.softmax(attn, dim=-1)out = torch.matmul(attn, v)out = (out.unsqueeze(0).reshape(B, 1, out.shape[1], C).permute(0, 2, 1, 3).reshape(B, out.shape[1], C))return rearrange(out, "b (h w) c -> b c h w", b=B, h=H, w=W, c=C)

Stable Diffusion使用

插件安装

点击扩展→可用→简单粗暴按星数排序:
在这里插入图片描述
如果github无法访问,可以复制链接后前面加上https://ghproxy.com/从网址安装:
在这里插入图片描述

最终安装的部分插件如下,注意需要手动把插件模型下载到对应路径下才能使用:
在这里插入图片描述

界面设置

在设置→用户界面中对快捷设置和UItab做修改:
在这里插入图片描述
点击右上角设置kitchen插件主题:
在这里插入图片描述
在这里插入图片描述

最终效果如下:
在这里插入图片描述

基础文生图

首先在模型左侧选择Stable Diffusion模型及其对应VAE,然后输入正向和反向提示词,在下面点击生成相关设置如采样方法、采样迭代次数和宽高等。

需要注意的几点:

  • Clip跳过层设置:CLIP 是用来给提示词编码的神经网络,默认是使用模型最后一层的输出作为提示词的嵌入表示,将其设为2就可以使用模型倒数第二层的输出作为嵌入表示。增加这一参数时,可以更好地保留提示中的信息,生成与提示更匹配的图片,但设置的值过大也会影响编码的准确性。该参数仅适用于使用CLIP的模型,即1.x模型及其派生物。2.0模型及其派生物不与CLIP交互,因为它们使用OpenCLIP。
  • 将交叉关注层向上转型到float32设置:遇到NAN报错或者花屏图片时可以试试。
  • 图片大小设置:对于SDXL模型,为了保证生成质量图片至少为1024x1024
    • 16:9(电影摄影)1820x1024
    • 3:2(专业摄影)1536x1024
    • 4:3(普通图片)1365x1024
  • 采样方法:对SDXL 1.0来说,建议使用任何DPM++采样器,特别是带有Karras采样器的DPM++。比如DPM++ 2M Karras或DPM++ 2S a Karras

生成示例如下:

在这里插入图片描述

加入lora的文生图

lora是一类对模型进行微调的方法,是一系列参数量较小的模型,在与原始模型结合后,可以对生成图片做特定修饰,可以理解为化妆技术。
lora的使用方法是将模型下载到models/Lora文件夹下,注意最好分文件夹存放,方便调用和管理:
在这里插入图片描述
对应的前端界面如下:
在这里插入图片描述
使用方法很简单,在输入提示词后直接点击lora模型,就会自动添加到输入末尾:
在这里插入图片描述

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

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

相关文章

计算机网络【CN】介质访问控制

信道划分介质访问控制 FDMTDMWDMCDM【掌握eg即可】 随机介质访问控制 CSMA 1-坚持CSMA 非坚持CSMA p-坚持CSMA 空闲时 立即发送数据 立即发送数据 以概率P发送数据&#xff0c;以概率1-p推迟到下一个时隙 忙碌时 继续坚持侦听 放弃侦听&#xff0c;等待一个随机的时…

车载音频项目

加我微信hezkz17进数字音频系统研究开发交流答疑群(课题组) ー 1&#xff0e;负责此项目的音频链路的设计及其实现 在ADSP21375上实现音频链路的处理。如噪声门&#xff0c;压限器&#xff0c;高低通&#xff0c;PEQ、各种效果等。 2&#xff0e;负责DSP与MCU端SPI协议实现。M…

Builder 请进:波卡最新开发入门指南

撰文&#xff1a;Dennis Zoma 编译&#xff1a;OneBlock 社区 本文更新于 2023 年 10 月 3 日&#xff0c;来源&#xff1a;https://wiki.polkadot.network/docs/build-guide Polkadot 是一个区块链协议&#xff0c;有两个目标&#xff1a;在所有连接的平行链之间提供共享安全…

【操作系统】进程的控制和通信

文章目录 一. 实验目的二. 实验内容三. 实验步骤四. 实验结果 一. 实验目的 &#xff08;1&#xff09;加深对进程概念的理解&#xff0c;进一步认识并发执行的实质。 &#xff08;2&#xff09;掌握Linux 操作系统中进程的创建和终止操作。 &#xff08;3&#xff09;理解进程…

计算机网络-应用层(2)

一、DHCP 当需要跨越多个网段提供DHCP 服务时必须使用DHCP 中继代理&#xff0c; 就是在DHCP 客户和服务器之间转发DHCP 消息的主机或路由器。 DHCP 服务端使用UDP 的67号端口来监听和接收客户请求消息&#xff0c; 保留UDP 的68号端口用于接收来自DHCP 服务器的消息回复。 在…

基于 Python 的豆瓣电影分析、可视化系统,附源码

文章目录 1 简介2 技术栈具体实现1.设计豆瓣电影自动化爬虫程序&#xff0c;自动获取电影数据2.对爬取到的数据进行清洗和预处理&#xff0c;包括多维度数据字段清洗和扩充3.将清洗好的数据存储到MySQL数据库中 4 具体效果图5 推荐阅读 1 简介 基于Python flask 的豆瓣电影分析…

win11 右键菜单默认 显示更多选项

win10升级至win11后&#xff0c;一个很大的变化就是右键菜单&#xff0c;其不再显示所有的菜单项&#xff0c;而是默认只显示主要的几项&#xff0c;点击“显示更多选项”后&#xff0c;才会显示所有菜单项。 这对于经常需要用到右键其他菜单项的人来说明&#xff0c;非常的不…

【C++】C++入门(下)--内联函数 auto关键字 nullptr

目录 一 内联函数 1 内联函数概念和定义 2 内联函数特性 二 auto关键字 1 auto概念 2 auto 的使用细则 (1) auto与指针和引用结合起来使用 (2) 在同一行定义多个变量 3 auto不能推导的场景 (1) auto不能作为函数的参数 (2) auto不能直接用来声明数组 4 基于范围的fo…

关于深度学习中Attention的一些简单理解

Attention 机制 Attention应用在了很多最流行的模型中&#xff0c;Transformer、BERT、GPT等等。 Attention就是计算一个加权平均&#xff1b;通过加权平均的权值来自计算每个隐藏层之间的相关度&#xff1b; 示例 Attention 机制 Attention应用在了很多最流行的模型中&am…

C# 海康威视平台API接入 和网页摄像头部署

文章目录 前言相关网址综合安防管理平台网址获取Appkey和Secret/密码和密钥测试个人魔改工具类 海康视频接入获取摄像头Id下载海康Web插件原生Html导入网页设置 JS封装封装代码使用设置成功&#xff01; 前言 最近有个需求是将海康的摄像头视频画面传到我们平台上&#xff0c;…

C# OpenCvSharp Yolov8 Face Landmarks 人脸特征检测

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_Yolov8_Demo {public partial class frmMain…

FL Studio21.2演示版下载

FL Studio 21.2 带有 stem 分离和 FL Cloud&#xff0c;这是一项专为 FL Studio 打造的具有里程碑意义的新服务。其他新功能包括 FL Studio Fruity Edition 的 Audio Clips&#xff08;音频剪辑&#xff09;和一个新的模拟建模合成器 Kepler。 为庆祝 FL Studio 21.2 的发布&am…

Vue实现首页导航和左侧菜单,介绍mock.js并实现登录注册间的跳转,实现左侧栏折叠效果,优化Main.vue组件,使用mock.js生成随机响应数据

目录 1. mockjs 1.1 mockjs介绍 1.2 mockjs使用步骤 1.2.1 安装mockjs依赖 1.2.2 在项目中引入mockjs 1.2.3 创建目录和文件 1.2.4 为每个组件准备模拟数据 1.2.5 测试 1.2.6 前端调试 1.2.7 mockjs生成随机响应数据 1.2.8 根据不同响应&#xff0c;给出不同提示 2…

二进制搭建 Kubernetes+部署网络组件+部署CornDNS+负载均衡部署+部署Dashboard

二进制搭建 Kubernetes v1.20 k8s集群master01&#xff1a;20.0.0.50 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02&#xff1a;20.0.0.100k8s集群node01&#xff1a;20.0.0.110 kubelet kube-proxy docker etcd k8s集群node02&#xff1a;20.…

如何通过adb控制安卓手机wifi

一、准备工作 1、先用USB数据线 将手机和电脑连接在一起 1&#xff09; 数据线连接手机和电脑&#xff0c;选择“传输文件”的连接方式&#xff1b; 2&#xff09; 在手机上&#xff0c;打开“开发者选项”、“USB调试”&#xff1b; 2、在电脑上安装adb工具&#xff0c;参考…

MySQL(2):环境搭建

1.软件下载 软装去官网下载&#xff08;社区版&#xff09;&#xff1a;https://downloads.mysql.com/archives/installer/&#xff08;历史版本可选&#xff09; 选择下面的&#xff0c;一步到位 2.软件安装 双击 .msi 文件 选完 Custom 自定义后点 next 按 1&#xff0c…

软通动力:打造AI第二增长曲线,图谋新发展

【科技明说 &#xff5c; 重磅专题】 软通动力对于AI的想法还是比较久了&#xff0c;之前在与业内朋友聊到软通动力之时&#xff0c;曾提到软通动力的根基还是在于其多年来的软件服务能力&#xff0c;目前借助AI技术创新的机遇将软件服务能力进一步放大&#xff0c;扩展到更多行…

人工智能基础_机器学习006_有监督机器学习_正规方程的公式推导_最小二乘法_凸函数的判定---人工智能工作笔记0046

我们来看一下公式的推导这部分比较难一些, 首先要记住公式,这个公式,不用自己理解,知道怎么用就行, 比如这个(mA)T 这个转置的关系要知道 然后我们看这个符号就是求X的导数,X导数的转置除以X的导数,就得到单位矩阵, 可以看到下面也是,各种X的导数,然后计算,得到对应的矩阵结…

高阶数据结构学习 —— 图(2)

文章目录 1、BFS1、DFS 1、BFS 广度优先。确定从哪个点开始&#xff0c;然后用队列来完成遍历。拿出一个点就把和这个点相连的其它点放进去&#xff0c;但是这样前面放进过队列的也有可能被再次放入&#xff0c;所以需要做好标记。一个队列&#xff0c;一个标记容器。在邻接矩…

蓝桥杯每日一题2023.10.25

乘积尾零 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 由于需要相乘的数很多&#xff0c;所以我们不能直接进行暴力模拟&#xff0c;我们知道10 2 * 5&#xff0c; 所以我们只需要找出这个数2和5的个数&#xff0c;其中2和5个数小的那个则为末尾0出现的个数 #include<bi…