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

这篇具有很好参考价值的文章主要介绍了Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Stable Diffusion网络资源记录

  • 环境安装
    https://blog.csdn.net/qq_44525568/article/details/132338630?spm=1001.2014.3001.5506
    https://zhuanlan.zhihu.com/p/617997179
    https://www.tjsky.net/tutorial/488

  • 插件安装与使用:
    https://tianfeng.space/1557.html
    https://tianfeng.space/1682.html

  • 模型使用
    https://zhuanlan.zhihu.com/p/631089077

  • Controlnet使用
    https://www.uisdc.com/controlnet
    https://www.uisdc.com/controlnet-2
    https://www.cnblogs.com/bossma/p/17720770.html

  • 公众号
    星空财研
    白马与少年
    月起星九

Stable Diffusion安装

我的情况比较特殊,显卡版本太老,最高也就支持cuda10.2,因此只能安装pytorch1.12.1,并且无法安装xformers。
Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作,多模态模型,stable diffusion

在安装好虚拟环境和对应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_model
        self._load(model_name)
        self.gn32_original_forward = GroupNorm32.forward
        gn32_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_forward
        if 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_block
        else:
            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 x

            GroupNorm32.forward = groupnorm32_mm_forward

        logger.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 % 2
            unet.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 % 3
            if 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_model
        logger.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_forward
        logger.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 attention
        B, C, H, W = q.shape
        q, 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使用

插件安装

点击扩展→可用→简单粗暴按星数排序:
Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作,多模态模型,stable diffusion
如果github无法访问,可以复制链接后前面加上https://ghproxy.com/从网址安装:
Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作,多模态模型,stable diffusion

最终安装的部分插件如下,注意需要手动把插件模型下载到对应路径下才能使用:
Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作,多模态模型,stable diffusion

界面设置

在设置→用户界面中对快捷设置和UItab做修改:
Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作,多模态模型,stable diffusion
点击右上角设置kitchen插件主题:
Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作,多模态模型,stable diffusion
Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作,多模态模型,stable diffusion

最终效果如下:
Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作,多模态模型,stable diffusion

基础文生图

首先在模型左侧选择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

生成示例如下:

Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作,多模态模型,stable diffusion

加入lora的文生图

lora是一类对模型进行微调的方法,是一系列参数量较小的模型,在与原始模型结合后,可以对生成图片做特定修饰,可以理解为化妆技术。
lora的使用方法是将模型下载到models/Lora文件夹下,注意最好分文件夹存放,方便调用和管理:
Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作,多模态模型,stable diffusion
对应的前端界面如下:
Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作,多模态模型,stable diffusion
使用方法很简单,在输入提示词后直接点击lora模型,就会自动添加到输入末尾:
Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作,多模态模型,stable diffusion文章来源地址https://www.toymoban.com/news/detail-715921.html

到了这里,关于Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringSecurity最新版从入门到精通,WebSecurityConfigurerAdapter已经过时?最新版来了。

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 spring security的超详细配置和使用攻略,包括从登录校验开始到不同页面、不同功能的权限管理,包括了整合thymeleaf框架、用户登录信息持久化处理、csrf防护等web安全。 SpringSecurity是SpringBoot支持的高度可

    2024年02月13日
    浏览(53)
  • 【最新版配置conda环境】新版pycharm导入新版anaconda环境

    最近下载了新版pycharm和新版anaconda,并且在命令行创建了环境,想着在pycharm里面导入环境。结果现在的导入方式发生了变化。 之前是通过导入Python.exe进行的。 现在: 当我们点击进去之后,会发现找不到python.exe了。 具体什么原因我不知道,应该是版本问题。 解决方法: 通

    2024年02月08日
    浏览(53)
  • 抖音协议最新版

    抖音核心协议的步骤是 : 1、在查询串插入一个固定的键rstr 2、对查询串进行按键排序并取值,对空格和+进行转义为a 3、然后取MD5;如果时间轴1为1,那么取多一次MD5 4、将MD5结果分别和5******6、1******4进行2次错位排序算法 5、将4的结果再进行一次错位排序,得到26位字符 6、

    2024年02月13日
    浏览(45)
  • 淘宝协议最新版

    我可以为您提供一些示例代码,以演示一些与电商平台相关的功能。请注意,以下代码仅为示例,具体实现还需要根据您的应用程序的架构、技术栈和需求进行调整和扩展。 1. 用户注册功能:    - 后端实现:在后端,您可以创建一个用于处理用户注册请求的接口。当用户提

    2024年02月06日
    浏览(51)
  • 微信小程序新版隐私协议弹窗实现最新版

    2023.08.22更新:【原文连接】 以下指南中涉及的 getPrivacySetting、onNeedPrivacyAuthorization、requirePrivacyAuthorize 等接口目前可以正常接入调试。调试说明: 在 2023年9月15号之前,在 app.json 中配置 __usePrivacyCheck__: true 后,会启用隐私相关功能,如果不配置或者配置为 false 则不会启用。

    2024年02月10日
    浏览(72)
  • 小红书协议算法最新版

    如果您想通过学习来了解小红书的点赞、关注、私信等功能的实现,以下是一些一般性的思路和示例代码,供您学习参考: 1. 点赞功能:    - 后端实现:在后端,您可以创建一个用于存储用户点赞信息的数据库表。对于每个帖子或内容,可以创建一个对应的点赞表,记录用

    2024年02月06日
    浏览(40)
  • 抖音协议算法最新版

    抖音的协议算法是指用于推荐内容和个性化用户体验的算法系统。这些算法根据用户的兴趣、行为和偏好来推荐适合他们的视频内容,以提供更好的用户体验。 抖音的协议算法使用了大量的数据和机器学习技术来实现个性化推荐。以下是一些可能应用于抖音协议算法的技术和

    2024年02月06日
    浏览(46)
  • composer最新版本安装

    安装前请务必确保已经正确安装了 PHP。打开命令行窗口并执行  php -v  查看是否正确输出版本号。 打开命令行并依次执行下列命令安装最新版本的 Composer: 复制 复制 复制 执行第一条命令下载下来的  composer-setup.php  脚本将简单地检测  php.ini  中的参数设置,如果某些参

    2024年02月13日
    浏览(47)
  • 快速安装最新版Docker

    安装docker 列出系统中以安装的docker包: 卸载以安装的docker包 如果系统中没有docker,则直接进行下一步 安装docker所需依赖:  添加docker的yum源: yum安装docker: 验证docker版本以确认安装成功: 如图所示,docker安装成功 启动docker 执行以下命令启动docker: 然后将docker设置为开机

    2024年02月12日
    浏览(48)
  • GitHub网页无法打开——最新版

    今天访问了一天GitHub没进去,试了很多方法都不管用,最终找到了下面这种方法可以解决网页无法访问的问题。 操作如下: 1.打开此路径:C:WindowsSystem32driversetc 2.将该路径下的hosts文件复制到桌面,用记事本打开 3.将下列代码复制到文本的最下方并保存 4.将该文件复制到:

    2024年02月15日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包