配置 Stable Diffusion WebUI 纯 CPU 或核显绘画

最近更新于 2024-08-20 12:46

1 前言

我笔记本电脑的独显上半年的时候烧掉了,所以只能用 CPU(或核显),折腾了一下午总算给配置出来了。我这里用的官方 Python,网上很多教程用 Anaconda(也是一种 Python 发行版),其实没必要。最开始我就跟着用 Anaconda,挺折腾的,到后面发现只是需要 Python 而已,那整体简单多了。喜欢用 Anaconda 的也可以用,不影响,只是需要 Python 这个基础,然后在上面跑 PyTorch,Stable Diffusion 又是基于 PyTorch,结构就是这样。

下面的图片是用 SD 画的
file

2 环境

CPU:Intel i5-8265U(Intel UHD Graphics 620)
RAM:20GB
OS:Windows 11 专业工作站版 23H2(预览版)

注意:配置及后续使用十分依赖“梯子”,设置成系统代理+绕过大陆就行
file

我在 Windows 11 上测试发现 CMD 会沿用系统代理,但是 Windows 10 上 CMD 没有使用系统代理,导致没有代理。可以修改 webui-user.bat 手动添加代理变量,如:
file
端口看自己电脑上的代理软件
file

3 配置

3.1 安装 Python

官网下载地址:https://www.python.org/downloads/
注意安装的时候勾选添加到 PATH 环境变量,不然要手动去添加
file
我测试时 SD 最新版为 1.7.0,建议的 Python 版本不超过 3.10.6

添加了环境变量,在终端就能执行
file

升级 pip 版本

python -m pip install pip

配置过程中不建议换国内源,我开始尝试的时候换了国内的,结果环境配置找不到指定版本的包导致报错,应该是国内镜像可能存在不及时同步的问题,或者选择性同步。而且后续配置过程也要使用代理,没必要改用国内镜像,直接默认官方源就行。

3.2 安装 Git

下载 Git:https://git-scm.com/downloads
安装后检查环境变量是否正常,保证可以运行

 git --version

file

3.3 配置 Stable Diffusion

这里用网页 UI 版的,方便操作。然后一个是原版:https://github.com/AUTOMATIC1111/stable-diffusion-webui ,另外一个是支持 Intel 显卡的版本,也支持核显(使用 OpenVINO):https://github.com/openvinotoolkit/stable-diffusion-webui

使用 Intel 显卡或者 Intel 核显的情况建议使用第二个版本,其它情况就用第一个版本。

首先打开代理,再选择一种进行准备操作:

① 原版

下载源码:

# 指定版本 1.7.0
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git --branch=v1.7.0

没有 NVIDIA 显卡支持的,下载后编辑下图的文件,在 set COMMANDLINE_ARGS= 后,加上 –skip-torch-cuda-test –precision full –no-half(跳过 PyTorch CUDA 测试,使用全精度,禁止半精度)
file
file


② OpenVINO 版

下载源码

# 没有版本标签,下载最新的
git clone https://github.com/openvinotoolkit/stable-diffusion-webui.git

完成上面的准备工作后,进行首次运行准备
直接双击 webui-user.bat 脚本执行
首次执行过程中会进行一些初始化准备,比如创建虚拟环境,安装 PyTorch,下载模型,要通过代理下载的东西差不多能有 10 GB 吧。准备完成会自动打开浏览器访问 http://127.0.0.1:7860/
file

以后运行也是执行这个文件

4 附

4.1 汉化

汉化界面可以使用这个开源项目:https://github.com/VinsonLaro/stable-diffusion-webui-chinese
支持纯中文,或者中英混合
file

其它汉化插件:

4.2 关于 OpenVINO 版

要使用核显加速的话,脚本选 OpenVINO 加速,设备选 GPU,下面有个默认勾选可以去掉。如果勾选了就会覆盖上面的采样器,当然它建议的是使用下面在 OpenVINO 验证过的采样器,用其它出问题的可能性更大,但是发挥就比较有限了。
file

我折腾的时候原版最新版本为 1.7.0,而 OpenVINO 版最新的是基于 1.6.0,用起来很多存在问题(下面说),维护更新也不太好,最近一次更新已经是一个月前了(看的 GitHub 提交记录)。

加速效果确实可以,我电脑上 CPU 能跑一两个小时的图,核显跑能变成几分钟,速度提高了好多。下图是我用核显跑的时候的资源占用情况:
file

下面主要说说我目前遇到的问题:

4.2.1 提示词和反向提示词的范围要一致

file
我这里画一个图不一致的时候就会报错

ValueError: `prompt_embeds` and `negative_prompt_embeds` must have the same shape when passed directly, but got: `prompt_embeds` torch.Size([1, 154, 768]) != `negative_prompt_embeds` torch.Size([1, 231, 768]).

file

就是说提示词和反向提示词的形状不一致,然后我用逗号硬凑成一样范围才能跑起来
file

4.2.2 “高分辨率修复” 无法使用加速

file

准确来说,在文生图的时候如果启用了高分辨率修复,那么实际跑起来会变成纯 CPU,目前这个 OpenVINO 加速还没有支持。这里我想到了两种协调方法,都要把高分辨率修复拆分开,即先文生图但不使用高分辨率修复,这样文生图能保证核显加速。

一种方法是接着使用高清化。这种高清化不涉及重绘,不会改变图片上的内容,单纯进行超分辨率处理,虽然还是使用 CPU,但是本身速度很快。
file

第二种方法就是接着使用图生图(可以使用加速)。高分辨率修复实质上就是图生图,只是文生图里集成高分辨率修复是把文生图和图生图混合起来变成连续处理了。

在设置里可以选择图生图使用的高清化算法,这里就和高分辨率修复选择算法是对应的,选好记得点应用设置完成保存。
file

然后在文生图结束以后,下面是有一个图标可以把生成的图片和使用的提示词发送到图生图的
file

在图生图中可以设置缩放比例或者缩放后的分辨率
file

重绘强度建议以 0.3 为基准,相当于少量重绘+高清化扩大分辨率,在细节上比纯高清化的效果更好,值越大图片内容改动就越大。这种方法优点是效果基本上等同于高分辨率修复,同时保证加速,但缺点就是内存使用较大,极限尺寸可能和直接文生图最大图差不多,可放大的操作空间有限。

一般来说进行超分辨率修复都是觉得图画得不错,确定要的,如果确实要放大得很多,又要保证较好的效果,那就不使用 OpenVINO 加速,纯 CPU 处理内存占用低很多,目标图片尺寸上限也可以提高。在电脑空闲的时候,挂着慢慢处理都行。

使用图生图把分辨率放大三倍,左边是放大的,右边是原图
file

4.2.3 点重启不能正常加载

有报错
file
file
重启后会发现 OpenVINO 加速消失了。重启只能手动来,先关掉 SD,再重新运行。

4.2.4 文生图时,图片的长宽必须是 8 的整数倍

否者会报错

ValueError: `height` and `width` have to be divisible by 8 but are 300 and 240.

file

4.2.5 使用核显加速对内存占用非常高

我画 640×960 的图多几次,就有几率爆内存。这个和模型文件的大小也有关系,模型文件本身很大的,图片尺寸可能都大不了。
内存严重不够的时候甚至直接把页面崩黑屏,然后系统弹窗报错内存地址不对啥的,SD 程序直接被系统杀掉。在边缘处的,SD 不会被杀,但是可以看到 CMD 上显示错误信息,类似分配内存失败啥的,然后操作结束。

我拿一台 8G 内存的电脑试,核显基本没法用,240×360 的都能把电脑搞蓝屏,可以看到蓝屏代码是 MEMORY MANAGEMENT(内存管理),就是内存不够分配,把系统炸了。拿 CPU 跑没啥问题,大图也行,就是速度慢。
file

一般看到终端报错[ GENERAL_ERROR ] [CL ext] Can not allocate nullptr for USM type.,就代表内存爆了,盯着任务管理器也能看到内存满了。
file

4.2.6 画出的图片不一样

我用 CPU 画和核显画,同样提示词和参数值,画出来图不一样,比如下面分别是 CPU 和核显画的:
file

这个似乎是正常现象,我看原版的 issue 上有多个提到用不同的显卡绘制的图像不一样,情况各种各样,似乎没有统一的说法。

4.2.6 缓存占用硬盘空间大

使用 OpenVINO 加速的时候会重新编译模型,默认勾选了缓存模型。在确定模型、生成图像尺寸、采样器、批次的情况下,从第二次开始直接沿用编译好的模型,但是如果上面有任何一个参数变了,模型就需要重新编译。
我测试连续画图,从第二次开始,每次画图都比第一次少三四分钟的时间(640×960,30 采样步数),这个不管有没有勾选缓存模型都有这个情况。连续画图的时候,第一次重新编译模型是保存在内存中的,第二次可以直接使用内存中的模型。只是一旦关闭 SD,内存就回收了,或者中间更改参数生成都会释放上一次重新编译生成的模型占用的内存。勾选缓存的作用就是在完成重新编译后,会把编译好的模型保存到硬盘中,如果下一次有匹配的参数,就不需要重新生成,直接从硬盘读取加载到内存中。
实际使用中是有些苛刻的,同一个模型,同样的采样器,同样的批次书,同样的图像尺寸都完全一样的情况下才能沿用以前生成时重新编译的模型,只要有变化又会重新编译模型。我也是用了两三天后发现我 SD 所在的硬盘少了 100+ GB,然后定位到 SD 里面有个 cache 文件夹就有 100+ GB,里面就是缓存的重新编译的 OpenVINO 模型
file

模型数x采样器数x分辨率尺寸数,随便都能产生几十种起步的组合,一个模型占用几个 GB,参数组合够多随便占用硬盘几百 GB 不成问题。如果硬盘空间足够,倒是可以开着缓存,效率提高还是挺明显的。要么就去掉勾选。
file

建议使用常用组合的时候勾选缓存,经常使用的模型+采样器+图像尺寸整体组合。不常用的,测试性的不需要勾选。或者手动维护,cache 里有个 model 文件夹,用时间排序就能很好分辨,每次重新编译的模型存储的文件是一对,一个 bin 文件和一个 xml 文件,手动删除。
file

4.2.7 >>>>>>>>>放弃折腾 – 对第三方插件不支持

—2024.1.5 晚

之前测试发现分块绘图的一个插件无法在 OpenVINO 版上使用,晚上突然发现 ControlNet 开了但是没有生效,核显绘图是正常的,但是勾选了 ControlNet 和没勾选没有任何区别,测试了多个 ControlNet 模型,都没有对绘图产生影响。所以这个版本除了 WebUI 原版的东西基本都没啥玩的,至少不使用 OpenVINO 加速的时候,纯 CPU 都能使用 ControlNet。
总结就是 OpenVINO 版用核显加速比纯 CPU 快很多,一般能有十几倍,小图差异不明显,大图 CPU 跑一两个小时的,核显几分钟搞定,我这个还是 i5 第 8 代低压版 CPU(轻薄本),缺点就是内存消耗翻倍了,我改到 36G 内存,极限也只能跑 750×1000 的像素个数,纯 CPU 跑,原先的 20G 内存都够。再就是上面提到的,对第三方插件支持不好,要么是不支持报错,要么就是没报错,但是插件没起作用,要么就还是用 CPU 在跑插件。官方的维护也不积极,Issues 目前总共就 22 个问题,但是都存在没回复的,可能 Intel 也不怎么重视吧,用户量可能都不高。综上暂时不想玩了,等后面换电脑再玩。

4.3 资源

4.3.1 模型

一般下载模型就是下面两个网站

4.3.2 插件

插件可以在 WebUI 里在线下载,通过索引或指定仓库链接
file

file
也可以手动下载之后放到插件目录
file

在 WebUI 索引里的插件可能只是小部分,更多还是要去 GitHub 找。

下面列举一些我折腾过的插件:

  • ControlNET:可以辅助控制,比如可以通过骨架控制生成人物的姿势,其它的如下图
    file

  • Inpaint-Anything:我觉得最大的亮点是可以自动蒙版,这个东西可以进行边缘识别,把图像中的元素分割,然后可以直接选择识别出的元素生成蒙版,结合局部绘制很不错。比如换衣服等等。
    file

  • Image browser:图片浏览器,方便在 WebUI 统一管理生成的图片。
    file

  • Booru tag autocompletion prompting:提示词提示补全,辅助提示词输入。
    file

  • WD 14 Tagger:由图片反推提示词,效果比图生图里自带的更好。
    file

  • Civitai Helper:可以把模型 Civitai 链接放进去,直接下载,免去手动下载后移动文件到模型目录,另外支持同步预览图和模型信息等。
    file
    file

  • multidiffusion-upscaler-for-automatic1111:对于独立显卡用户,如果显存比较小的,这个插件会十分有用,可以把图片拆分为很多小块分别绘制再拼接,用时间换空间,小显存也能画大图。至于核显,我已经试过好几次了,每次卡一两个小时,最后失败,OpenVINO 版问题还挺多的,这个插件对于核显用户没用。不如直接拿 CPU 画,CPU 画图确实慢,但是比用核显占用的内存明显的低,晚上睡觉挂着画大图也还行。

  • ADetailer:可以用于修复脸、手崩的问题,以及增加细节,ADetailer 作用时不支持核显,不过好在起作用的脸部、手部等都是小区域,CPU 绘制也用不了太久。
    比如下面左图,因为内存有限的原因,画的时候和 Lora 示例的 2K 尺寸差太多,脸部采样不够就画崩了,右边用这个插件修复的。
    file

  • Oldsix Pprompt:选择中文提示词可以添加对应的英文提示词,左键提示词,右键反向提示词,也支持自定义中文翻译英文。
    file

部署到移动硬盘

为了方便使用,可以做一个整合包。比如我这里把 SD 部署到移动硬盘上,只要带着硬盘,换台电脑插上也能直接用。

SD 有两个外部依赖项 Python 和 Git,只要把这两个和 SD 放到一堆,整体就能随时移动了,代理软件也可以放到一起。

我在移动硬盘上创建了一个文件夹名为 SD,用于存放整合包
file

在安装 Python 的时候可以看到默认或者自行选择安装的路径,安装后,前往对应路径
file

把 Python 整个文件夹复制到移动硬盘上创建的文件夹里。同样方式找到 Git 安装后的文件夹,也复制到移动硬盘上创建的文件夹里。SD 也放到这里。
file
file

然后进入 SD 目录,编辑 webui-user.bat 文件(启动脚本)
file

这个启动脚本本身也提供了 Python 和 Git 的路径变量,把 python.exe 和 git.exe 的路径写上去就行,“..\”代表上级目录,用相对路径,即使换台电脑移动硬盘的盘符变了,也不用修改。
file

代理

如果设置系统代理对 CMD 不生效,还可以编辑 webui-user.bat 增加

set http_proxy=http://代理地址:端口
set https_proxy=http://代理地址:端口

file

配置 Stable Diffusion WebUI 纯 CPU 或核显绘画
Scroll to top