(如有更新,见原文:https://blog.iyatt.com/?p=12345 )
我笔记本电脑的独显上半年的时候烧掉了,所以只能用 CPU,折腾了一下午总算给配置出来了。我这里用的官方 Python,网上很多教程用 Anaconda(也是一种 Python 发行版),其实没必要。最开始我就跟着用 Anaconda,挺折腾的,到后面发现只是需要 Python 而已,那整体简单多了。喜欢用 Anaconda 的也可以用,不影响,只是需要 Python 这个基础,然后在上面跑 PyTorch,Stable Diffusion 又是基于 PyTorch,结构就是这样。
下面的图片是用 SD 生成的,没独显还是老 CPU,速度超级慢。
内存占用挺高的(和设置图片尺寸有关)
CPU:Intel i5-8265U
RAM:20GB
OS:Windows 11 专业工作站版 23H2(预览版)
官网下载地址:https://www.python.org/downloads/
注意安装的时候勾选添加到 PATH 环境变量,不然要手动去添加
我测试时 SD 最新版为 1.7.0,建议的 Python 版本不超过 3.10.6
升级 pip 版本
python -m pip install pip
配置过程中不建议换国内源,我开始尝试的时候换了国内的,结果环境配置找不到指定版本的包导致报错,应该是国内镜像可能存在不及时同步的问题,或者选择性同步。而且后续配置过程也要使用代理,没必要改用国内镜像,直接默认官方源就行。
下载 Git:https://git-scm.com/downloads
安装后检查环境变量是否正常,保证可以运行
git --version
这里用网页 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 测试,使用全精度,禁止半精度)
下载源码
# 没有版本标签,下载最新的
git clone https://github.com/openvinotoolkit/stable-diffusion-webui.git
完成上面的准备工作后,进行首次运行准备
直接双击 webui-user.bat 脚本执行
首次执行过程中会进行一些初始化准备,比如创建虚拟环境,安装 PyTorch,下载模型,要通过代理下载的东西差不多能有 10 GB 吧。准备完成会自动打开浏览器访问 http://127.0.0.1:7860/
汉化界面可以使用这个开源项目:https://github.com/VinsonLaro/stable-diffusion-webui-chinese
支持纯中文,或者中英混合
要使用核显加速的话,脚本选 OpenVINO 加速,设备选 GPU,下面有个默认勾选可以去掉。如果勾选了就会覆盖上面的采样器,当然它建议的是使用下面在 OpenVINO 验证过的采样器,用其它出问题的可能性更大,但是发挥就比较有限了。
我折腾的时候原版最新版本为 1.7.0,而 OpenVINO 版最新的是基于 1.6.0,用起来很多存在问题(下面说),维护更新也不太好,最近一次更新已经是一个月前了(看的 GitHub 提交记录)。
加速效果确实可以,我电脑上 CPU 能跑两三个小时的图,核显跑能变成十几分钟,速度提高了好多,几倍到十几倍。要是有较好的独立显卡,估计一分钟不到,甚至几秒就能出图。当然电脑会变得很卡,CPU 跑的时候满负载,核显空闲的,同时干其它事不会明显的卡,但是核显跑满了,CPU 是有空闲,却会感觉到明显的卡顿。下图是我用核显跑的时候的资源占用情况:
下面主要说说我目前遇到的问题:
(1)提示词和反向提示词的范围要一致
我这里画一个图不一致的时候就会报错
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]).