在没有GPU的设备上运行Stable Diffusion
众所周知,像Stable Diffusion这类AI程序通常需要用GPU来加速,但是显卡的价格不是很乐观,而且有时我们也不需要那么快的速度。所以使用CPU也许是个还算不错的选择?
一般来说,使用CPU来跑Stable Diffusion可能是这几种原因:
- 经济条件限制
- 显卡性能不足
- 是A卡或者I卡
- 根本不是电脑(比如安装了Termux的手机)
- 单纯出于好奇心想试试
我个人就是单纯想试试在CPU上运行Stable Diffusion
准备工作
我使用的是一台GCP C3实例,配置为8核心处理器、16GB内存和100GB普通硬盘,这个实例运行的操作系统为Ubuntu 18 LTS
使用SSH连接到实例之后,创建一个名为“sduser”的用户(也可以是其他名字,这里只是用它做例子):
adduser sduser
然后设置密码,在Linux命令行中输入密码是没有显示的。添加完成之后,为该用户添加sudo权限
sudo usermod -G sudo sduser
之后再切换到这个用户:
su sduser
此时你已经切换到了名为“sduser”的用户中了
安装Anaconda
wget https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-x86_64.sh && bash Anaconda3-2023.03-Linux-x86_64.sh
整个安装过程中,只需按“yes”或直接按回车键进行确认。在安装完成后,系统会询问是否将环境变量写入配置文件,此时输入“yes”以实现环境变量的写入。重启ssh链接,然后你会看见用户名旁边多了一个“(base)”,类似这样:
(base) sduser@instance-3:~$
再创建一个名叫“stablediffusion_cpu”的虚拟环境并进入它:
conda create --name stablediffusion_cpu python=3.10.6
conda activate stablediffusion_cpu
再安装CPU版本的PyTorch:
conda install pytorch torchvision torchaudio cpuonly -c pytorch
现在准备工作就基本完成了
安装Caddy(可选)
如果你和我一样,是使用的没有图形化界面,也不在本地的Linux云服务器,那就需要让WebUI能被外部访问,你可以选择在运行WebUI的时候加上--share
参数,但是我个人还是更喜欢用Caddy来反向代理,要安装Caddy非常简单,只需要运行这个脚本:
Debian, Ubuntu, Raspbian:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
Fedora, RedHat, CentOS:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/testing/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-testing-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/testing/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-testing.list
sudo apt update
sudo apt install caddy
完成后找个文件夹新建Caddyfile文件(如: /etc/caddy),并加入如下内容:
http://:42354 {
reverse_proxy * 127.0.0.1:7860
}
保存后使用以下命令来加载配置,加载后你就可以从服务器的端口42354来访问WebUI了:
caddy reload
如果你希望给这个页面加上密码保护,还可以使用caddy的BasicAuth模块。使用以下命令来生成一个hash:
caddy hash-password
执行后会询问你要设置的密码,输入两次之后就会输出一个hash,格式类似:
(base) sduser@instance-3:~/caddy$ caddy hash-password
Enter password: //我在这里输入的值是:“11”
Confirm password: //我在这里输入的值是:“11”
$2a$14$DQL37/.1rpmbmG4YkMsa3uV79pElOPuIUEDgfRr49wuiOszv7uZcW
(base) sduser@instance-3:~/caddy$
其中以$2a$14$DQL3开头的那串文字就是你需要的hash。再修改Caddyfile文件,在倒数第二行中加入如下内容后使用caddy reload
应用配置即可:
basicauth * {
用户名 这里是你的hash值
}
部署Stable Diffusion
首先将AUTOMATIC1111的WebUI Clone到本地:
apt update
apt install git -y
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
cd stable-diffusion-webui
运行WebUI:
python3 launch.py --use-cpu all --no-half --precision full --skip-torch-cuda-test
如果一切顺利的话,最后应该会输出:
Running on local URL: http://127.0.0.1:7860
这时你就可以打开之前用Caddy设置的反向代理地址或者直接在浏览器打开这个地址了
运行效率
对于一张分辨率为512x768的图片,采样步数为50步时,需要耗时6分40秒。这个结果是在一台多核GeekBench5得分达到5500分的服务器上得到的。这种效率相当低下,如果用来训练模型的话,无疑将会是一种痛苦的体验。
很不错,特来拜访博主。