Stable Diffusion 的 Intel oneAPI 改造,让低显/非N卡也能快速造老婆

2022-10-16

最近novel AI的模型泄露引起了很大的热度,笔者的每个群里都有在用novel AI的人。那作为一个老二次元,很快啊,我就顶着百度网盘700k的速度下载了一个集合包来玩玩。结果第一下就给我的显卡整破防了。
先介绍一下笔者的配置:

CPU: i5-1035G1
RAM: 8GB
Graphic: NVIDIA GeForce MX230 2GB

总归还是有N卡的win
但姑且先别说MX230的CUDA有多慢,光那2G的显存就可以直接劝退大部分人了。
2G显存512x512可能都跑不了了

刚好最近Intel不停往我邮箱里推他们家的oneAPI,我手里的i5也多少还算是过得去的U,很自然的我就萌生了用oneAPI跑Stable Diffusion的想法。

1 准备系统

Stable Diffusion中主要依赖的是PyTorch,而无论是Intel oneAPI还是AMD ROCm版的PyTorch都是要在Linux环境下运行的。所以这次教程主要在Debian系统下进行。想必看到这篇文章的人都会装Linux了吧,这里就不教了

2 配置Anaconda环境

考虑到想必看到这篇文章的人都会装Anaconda不同的人配置Anaconda有自己的习惯,这里笔者就不对大家指手画脚了。装了一遍不想再装了

3 安装Intel oneAPI

直到这里才是这篇文章真正的开始
首先,先去Intel官网下载Intel AI Analytics Toolkit
我的建议是下载脱机包,.sh格式的,不用担心打不开。下载完后导航到文件目录打开终端,运行
sh /l_AIKit_p_2022.3.0.8775_offline.sh //这里可以根据你安装Anaconda时的情况决定是否要sudo
然后就会自动解压安装文件并打开GUI安装程序,一路下一步就行了,这个安装你莫得选择,只能全装。
安装完之后还不能直接用,因为oneAPI的安装程序是不会配置环境变量的,这里我们要手动配置一下。
打开安装用户的~/.bashrc文件,在最后加入
source /home/$username/intel/oneapi/setvars.sh intel64 //$username换成oneAPI安装的用户名
.bashrc

4 配置conda虚拟环境

完成了以上步骤后已经可以在conda中使用oneAPI优化的PyTorch了,如果你只想用oneAPI跑一下Stable Diffusion,可以直接跳到4.2,想用oneAPI干点别的要隔离环境就接着看下去。

4.1 配置Stable Diffusion专用环境

为了保持oneAPI环境的干净整洁,在安装Stable Diffusion所需要的包前我们需要先单独创建一个专用环境。
首先克隆一个PyTorch环境
conda create -n stable-diffusion-oneapi --clone pytorch

4.2 安装Stable Diffusion所需包

直接激活环境
conda activate stable-diffusion-oneapi
跳过4.1的用下面这句
conda activate pytorch
激活环境后导航到stable-diffusion-webui目录,执行
pip install -r requirements.txt
Stable Diffusion的requirements里面写的包不是很全,在安装完里面的包后先运行一次Stable Diffusion看报错我没记是哪个包
python webui.py
缺了两个包,要运行两次把它们装全

5 修改源代码

这里在后面还看到一个方法:在运行时加"--skip-torch-cuda-test",不过我还没有试过。

编辑stable-diffusion-webui目录下的/repositories/stable-diffusion/ldm/models/diffusion/ddim.py
将第21、22行的cuda改成cpu
将第21、22行的cuda改成cpu

6 运行Stable Diffusion

经过了那么多的步骤,我们终于可以开始造老婆运行Stable Diffusion了。因为除了CUDA以外的PyTorch都不支持半精度,所以每次运行时都要加一些flags,否则会报"RuntimeError: "LayerNormKernelImpl" not implemented for 'Half'"
python webui.py --precision full --no-half
不出意外的话现在Stable Diffusion已经正常的跑起来了,接下来只要发散各位的XP就可以了。

7 笔者实机对比Intel oneAPI与NVIDIA CUDA

注意,以下内容仅代表笔者电脑的测试结果,并不能表明oneAPI和CUDA孰优孰劣两个硬件的级别都不一样

先贴配置

masterpiece, best quality, 1girl, white and green hair, red buttons, blue hair, short hair, ahoge, transparent sleeves, light smile, ocean, firework, incredibly absurdres, artbook
Negative prompt: lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry
Steps: 24, Sampler: DDIM, CFG scale: 11, Seed: 1594337505, Size: 512x512, Model hash: ab21ba3c

Intel oneAPI (i5-1035G1) 结果

oneAPI

Time taken: 6m 3.11s

NVIDIA CUDA (MX230) 结果

CUDA

Time taken: 21m 12s

我也不知道为啥结果不一样,可能半精度和全精度有差别吧,但是2G显存半精度根本跑不了512x512

8 优缺点对比

Intel oneAPI NVIDIA CUDA
优点 1.使用内存,增加内存比增加显存容易,还可以用交换空间,几乎无上限
2.与显卡不同,可以单独加内存
3.近几代Intel CPU都支持,在配置低端显卡或核显的轻薄本上也能流畅运行
1.上限极高,可以在PCIe允许范围内不断加卡
2.高端消费级显卡单卡CUDA就可以薄纱消费级CPU的oneAPI
3.常用API,大多数应用教程基于CUDA,开箱即用,支持的线上平台也更多
4.全程可视化安装,简单易上手
缺点 1.配置复杂,需要Linux系统
2.与系统共用内存,可能会导致系统崩溃
1.部分笔记本可能没有独显
2.增加显存价格昂贵