当前位置: 首页 > news >正文

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模型,就会自动添加到输入末尾:
在这里插入图片描述

相关文章:

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

文章目录 Stable Diffusion安装AnimateDiff插件适配sdxl模型适配 Stable Diffusion使用插件安装界面设置基础文生图加入lora的文生图 Stable Diffusion安装 我的情况比较特殊&#xff0c;显卡版本太老&#xff0c;最高也就支持cuda10.2&#xff0c;因此只能安装pytorch1.12.1&…...

ruoyi框架前端vue部署生产环境教程

前端有子目录&#xff0c;后端有项目名称&#xff0c;请看第3种 第1种 前端nginx没有子目录&#xff0c;后端也没有访问的项目名。这种是最简单的。 vue.config.js 只需要修改target中的IP和端口&#xff0c;就是后端访问的IP和端口 # vue.config.js devServer: {host: 0.…...

leetcode第369周赛

2917. 找出数组中的 K-or 值 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数&#xff1a; 只有在 nums 中&#xff0c;至少存在 k 个元素的第 i 位值为 1 &#xff0c;那么 K-or 中的第 i 位的值才是 1 。 返回 nums …...

如何在维格云中自动新增一行或多行数据?

简介​ 在日常使用维格云中,通常会出现一张表中有数据发生变化时,需要另一张表同时新增一些数据,比如: 项目管理中,每新增一个项目,都要在任务表中产生若干个固定的任务;或一个任务要自动生成若干子任务当一笔订单状态变为成交后,可能要在客户成功表中新增一行记录;帮…...

Three.js 开发引擎的特点

Three.js 是一个流行的开源 3D 游戏和图形引擎&#xff0c;用于在 Web 浏览器中创建高质量的三维图形和互动内容。以下是 Three.js 的主要特点和适用场合&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作…...

k8s声明式资源管理方式

Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式&#xff1a;主要用于 api 接口之间消息的传递 YAML 格式&#xff1a;用于配置和管理&#xff0c;YAML 是一种简洁的非标记性语言&#xff0c;内容格式人性化&#xff0c;较易读 YAML 语法格式&#xff1a; ●大小写…...

unity性能优化__Statistic状态分析

在Unity的Game视图右上角&#xff0c;我们会看到有Stats选项&#xff0c;点击会出现这样的信息 我使用的Unity版本是2019.4.16 一、Audio&#xff0c;顾名思义是声音信息 1&#xff1a;Level:-74.8dB 声音的相对强度或音量。通常&#xff0c;音量级别以分贝&#xff08;dB&a…...

Linux Spug自动化运维平台公网远程访问

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、文件…...

3DES算法

简介 本文基于.NET的C#实现3DES算法的加密和解密过程。可以用在加密软件、加密狗等。 代码下载链接&#xff1a;https://download.csdn.net/download/C_gyl/88487942 使用 第一种方法 加密 KeySize&#xff1a;128(16字节)&#xff0c;192&#xff08;24字节&#x…...

手机电池寿命检测

安卓 - 应用商店下载“安兔兔” -accubattery 下载地址 accubattery汉化版下载-Accubattery pro中文免费版(电池检测)下载 v1.5.11 安卓专业版-IT猫扑网...

Vue项目搭建及使用vue-cli创建项目、创建登录页面、与后台进行交互,以及安装和使用axios、qs和vue-axios

目录 1. 搭建项目 1.1 使用vue-cli创建项目 1.2 通过npm安装element-ui 1.3 导入组件 2 创建登录页面 2.1 创建登录组件 2.2 引入css&#xff08;css.txt&#xff09; 2.3 配置路由 2.5 运行效果 3. 后台交互 3.1 引入axios 3.2 axios/qs/vue-axios安装与使用 3.2…...

AVL树、红黑树的介绍和实现[C++]

本文主要对AVL树和红黑树的结构和实现方法进行一定的介绍&#xff0c;仅实现部分接口。 目录 一、AVL树 1.AVL树的概念 2.AVL树节点的定义 3.AVL树的插入 4.AVL树的旋转 1. 新节点插入较高左子树的左侧——左左&#xff1a;右单旋 2. 新节点插入较高右子树的右侧——右…...

meta分析的异质性检验指标如何计算?

一、什么是异质性&#xff1f; 广义&#xff1a;描述参与者、干预措施和一系列研究间测量结果的差异和多样性&#xff0c;或那些研究中内在真实性的变异。 狭义&#xff1a;统计学异质性&#xff0c;用来描述一系列研究中效应量的变异程度&#xff0c;也用于表明除仅可预见的…...

如何在mac 安装 cocos 的 android环境

基本概念&#xff1a; Java: Java 是一种编程语言&#xff0c;由Sun Microsystems&#xff08;现在是 Oracle Corporation&#xff09;开发。Java 是一种跨平台的语言&#xff0c;可以用于开发各种应用程序&#xff0c;包括 Android 应用程序。Android 应用程序的核心代码通常用…...

作为网工有必要了解一下什么是SRv6?

什么是SRv6&#xff1f; 【微|信|公|众|号&#xff1a;厦门微思网络】 【微思网络http://www.xmws.cn&#xff0c;成立于2002年&#xff0c;专业培训21年&#xff0c;思科、华为、红帽、ORACLE、VMware等厂商认证及考试&#xff0c;以及其他认证PMP、CISP、ITIL等】 SRv6&…...

Jmeter(十八):硬件性能监控指标详解

硬件性能监控指标 一、性能监控初步介绍 性能测试的主要目标 1.在当前的服务器配置情况&#xff0c;最大的用户数 2.平均响应时间ART&#xff0c;找出时间较长的业务 3.每秒事务数TPS&#xff0c;服务器的处理能力 性能测试涉及的内容 1.客户端性能测试&#xff1a;web前…...

【ARM Trace32(劳特巴赫) 使用介绍 2 -- Trace32 cmm 脚本基本语法及常用命令】

文章目录 Trace32 CMM 概述1.1 Trace32 系统命令 SYStem1.1.1 Trace32 SYStem.CONFIG1.1.2 SYStem.MemAccess1.1.3 SYStem.Mode1.1.3.1 TRST-Resets the JTAG TAP controller and the CPU internal debug logic1.1.3.2 SRST- Resets the CPU core and peripherals 1.2 Trace32 …...

2023年第七期丨全国高校大数据与人工智能师资研修班

全国高校大数据与人工智能 师资研修班邀请函 2023年第七期 线下班&#xff08;昆明&#xff09;&#xff1a; 数据采集与机器学习实战 线上班&#xff08;七大专题&#xff09;: PyTorch深度学习与大模型应用实战 数据采集与处理实战 大数据分析与机器学习实战 大数据技…...

一文获取鼎捷医疗器械行业数智化合规敏态方案

医疗器械产业是关乎国计民生的重要产业&#xff0c;高端医疗器械更是“国之重器”。为加强医疗器械的监督管理&#xff0c;提升行业质量和安全整体水平&#xff0c;我国出台了《医疗器械监督管理条例》、《医疗器械召回管理办法》、《医疗器械临床试验质量管理规范》、《医疗器…...

2023最新版本 FreeRTOS教程 -1-标准库移植FreeRTOS

源码下载 官网下载驱动 点击直达 源码剪裁 剪裁之后的图片,找我免费获取 添加进MDK 配置滴答定时器 全部工程获取 查看下方头像...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...