skip to content
Urob's Black Hole

Stable Diffusion 炼丹不完全指南

/ 13 min read

Last Updated:

🪨 原材料

🧠 唯一的原材料就是你想要实现什么,即你的想法。

🛠️ 工具

GPU 机器

如果你已经有一台性能不错的 GPU 机器,那么你已经拥有了炼丹最重要的工具。

如果你还没有,那么可以租用一些云服务商的 GPU 机器。出于某些原因,本文以在 AutoDL 租用的 GPU 机器为例。市面上还有像 vastai腾讯云Google Cloud等服务商提供的云服务器,读者根据需求和预算选择就好。

SSH(可选)

概览

如果你准备通过云端的显卡来开启你的炼丹之路,首先你需要解决的问题是:该如何访问云端 GPU 呢?

SSH1 就是你的魔杖 🪄(阿瓦达索命!)。

SSH 全称是 Secure Shell Protocol,顾名思义就是一种安全的网络协议

作用

现实的网络环境是复杂且危险的,如果我们需要远程访问一台服务器,如果我们发送给远程服务器的所有信息(包括用户登陆密码)都以明文的方式发送的话,毫无疑问远程机器会很容易被黑掉。

因此我们远程操控我们的远程服务器,就需要一种安全的传输协议来尽可能地保护我们与远程机器的通信,这也就是 SSH 存在的原因。我 SSH 只干三件事!安全!安全!还是XX的安全!

如何使用

SSH 连接的实现遵循客户端-服务器架构,每一台云端的 GPU 服务器都预装好了服务端程序。因此我们只需要在我们(本地)的机器上使用 SSH 客户端来连接我们的云端 GPU。

SSH 客户端提供两种方式来认证用户:

  1. 输入密码(缺点:相对不安全,每次都需输入密码;优点:相对好操作)
  2. SSH keys(缺点:首次验证比较繁琐;优点:只需要验证第一次,非常安全且方便)

为了使用 SSH 登录,我们需要知道机器的 ip 地址(也可以是域名)、登录端口、登录用户以及密码。那么我们的登录指令就是:

ssh -p port username@ip

而像 autodl 这样的平台在容器列表界面提供了可以直接复制的 ssh 登录指令和密码,直接复制即可: autodl username and code

输入密码(不推荐

对于第一种输入密码的方式,只需要在终端输入 ssh -p port username@remote_host ,然后再提示框输入密码(首次登录会先要求验证指纹,输入 yes 就好)就可以登录云端机器。以 autodl 中的一个容器实例为例:

ssh -p 40213 root@connect.westb.seetacloud.com
# 首次登录要求验证指纹
The authenticity of host '[connect.westb.seetacloud.com]:40213 ([1.1.1.1]:40213)' can't be established.
xxxx key fingerprint is SHA256:.....
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
yes
Warning: Permanently added '[connect.westb.seetacloud.com]:40213' (xxxx) to the list of known hosts.
root@connect.westb.seetacloud.com's password:
# 最后输入密码:
xxxx
# 登录成功
root@autodl-container-xxx-xxx:~#
SSH keys(强烈推荐

目前 Windows10、Macos、Linux 等操作系统都提供了开箱即用的 SSH 客户端,下面我来分别介绍一下怎么样通过 SSH 客户端来登陆云端机器。

Windows10
  1. 打开 powershell
  2. 输入 ssh-keygen 生成 ssh 钥匙对(跟着提示,一直按回车)

如果登录的当前用户是管理员(例如 powershell 显示的路径是 C:\Users\Administrator),请使用管理员模式打开 powershell ,否则会因为权限问题无法写入公钥。

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\yourusername/.ssh/id_rsa):
Created directory 'C:\\Users\\yourusername/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\yourusername/.ssh/id_rsa
Your public key has been saved in C:\Users\yourusername/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:FDqTjhQ3ILabzzR+BKCjkYfdsafwWEDSDQ213C49gG2E yourusername@UROB1D88
The key's randomart image is:
+---[RSA 3072]----+
|+.. + .          |
|.B o + .         |
|+.+ . o +        |
|o+ . o * +       |
|oE  o = S        |
|o.. .* * .       |
|o==o  = o        |
|o==*.  .         |
|.oo.+.           |
+----[SHA256]-----+
  1. 复制上一步生成的公匙地址,在这里就是 C:\Users\yourusername\.ssh\id_rsa.pub ,然后在 powershell 运行(请务必把 C:\Users\yourusername\.ssh\id_rsa.pub 替换成你的公钥地址):
$pubKey = Get-Content C:\Users\yourusername\.ssh\id_rsa.pub

最后运行(请务必把 ssh -p 54400 username@domain 替换成你的 ssh 登录指令):

ssh -p 54400 username@domain "mkdir -p ~/.ssh && echo $pubKey >> ~/.ssh/authorized_keys"

大功告成,接下来你直接在 powershell 运行 ssh -p 54400 username@domain 就可以直接登录云端机器,无需输入密码!

🧑‍🔧 如何建造自己的炼丹炉

在一切开始之前,你需要知道你的炼丹炉是什么。简单来说,Stable Diffusion 是一个开源的文生图模型,可以接受提示词作为输入,然后产生提示词描述中的图像。

虽然 Stable Diffusion 的代码和模型权重都是开源的,但是对于大部分的非算法相关从业人员来说,部署模型是一件非常困难的事。幸运的是,有 stable-diffusion-webui 这样的开源项目,(几乎)帮我们做好了所有的事情,可以让我们在短时间内部署一个包含前后端的 Stable Diffusion 服务。下面我将针对不同平台介绍下如何部署 stable-diffusion-webui 服务。

Linux

AutoDL 中的 ubuntu22.04 镜像容器为例,部署的过程可简单拆分为安装依赖、拉取源码、下载模型、运行服务。

安装依赖

# 由于 AutoDL 中默认的镜像已经安装好了 python3 以及 miniconda,所以下面的安装指令并没有 python3
sudo apt install wget git  libgl1 libglib2.0-0

拉取源码

首先你需要切换到你想要放源码的目录,例如:

# 只是一个例子,你可以放在你想要放的任何地方
mkdir -p /opt/sd
cd /opt/sd
# 对于 AutoDL,需要开启学术资源加速,否则无法访问
source /etc/network_turbo
wget -q https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh
# 赋予脚本权限,否则无法执行
chmod u+x webui.sh
# 运行脚本,-f 表示允许在 root 用户下运行(脚本默认不允许)
./webui.sh -f

至此,源码安装成功!

修改模型存放路径(可选)

对于 AutoDL 平台,由于区分系统盘和数据盘,我们下载的代码当前在系统盘,而模型最好放在数据盘(数据盘空间更大,读写速度更快)。

# 创建数据盘路径
mkdir -p ~/autodl-tmp/data
mv /opt/sd/stable-diffusion-webui/models  ~/autodl-tmp/data
# 创建软链接,把 /opt/sd/stable-diffusion-webui 路径下的 model 文件夹指向数据盘
ln -s ~/autodl-tmp/data/models /opt/sd/stable-diffusion-webui/models

下载模型

Stable Diffusion 模型有非常多,你可以根据需求下载。通常我会在 huggingface 或者 civitai 寻找我觉得有意思的模型。

找到你想要使用的模型之后,接下来需要下载并把它放在 webui 能读取到的路径下,具体是 /opt/sd/stable-diffusion-webui/models/Stable-diffusion,注意需要把 /opt/sd/ 换成你放源码的目录。

cd /opt/sd/stable-diffusion-webui/models/Stable-diffusion

然后下载模型,首先你需要找到模型的下载链接,以 civitai 为例,右键 Download 按钮,然后选择复制链接地址: civitai link address 然后直接粘贴到命令行上,运行:

# 设置代理
source /etc/network_turbo
# --content-disposition 表示重定向,如果是 huggingface 的模型不需要加这个选项
wget https://civitai.com/api/download/models/27135 --content-disposition

之后等待模型下载完成即可。

运行服务

cd /opt/sd
# 这里端口可以改成你的云服务商设置开放的接口,对于 AutoDL,开放的端口固定为 6006
./webui.sh -f --port 6006

至此我们的 webui 服务已经部署完成,如果你的云服务商提供了公网 ip 地址,可以直接通过公网 ip:port 的形式访问 WebUI 网页。如果你使用的是 AutoDL,则需要新建一个命令行窗口,然后运行:

# username 就是用户名,domain 是机器地址,port 是 ssh 端口
ssh -CNgv -L 6006:127.0.0.1:6006 username@domain -p port

以上指令的意义是:

  1. ssh: Secure Shell的缩写,用于安全地访问远程服务器。
  2. -C: 使用压缩。当数据在客户端和服务器之间传输时,这个选项会让数据被压缩,从而可能加快传输速度。
  3. -N: 表示只建立隧道,不执行远程命令。也就是说,这条ssh命令不会在远程服务器上运行任何命令,它只是简单地建立一个隧道。
  4. -g: 允许远程主机连接到本地的转发端口。
  5. -v: 详细模式。输出ssh命令的调试信息。这对于调试连接问题很有帮助。
  6. -L 6006:127.0.0.1:6006: 设置端口转发。这意味着所有发往本地机器的6006端口的数据都会被转发到远程服务器的127.0.0.1的6006端口。
    • 6006(第一个): 本地机器上的端口号。
    • 127.0.0.1: 远程服务器上的IP地址。在这里,它指的是远程服务器自己。
    • 6006(第二个): 远程服务器上的端口号。
  7. username@domain: 用于SSH登录的用户名和远程服务器的域名或IP地址。
  8. -p port: 使用指定的端口号连接到远程服务器。这里的port应该被替换为实际的端口号。

总的来说这条命令建立了一个从本地的 6006 端口到远程服务器 127.0.0.1 上的6006端口的 SSH 隧道。如果你有一个在远程服务器上运行并监听在 6006 端口的应用(例如,AutoDL 上的容器),使用这条命令后,你可以在本地机器上通过访问 localhost:6006 来访问那个应用。 举个例子,如果你的 ssh 登录指令是:

ssh root@region-1.autodl.com -p 37881

那么对应的建立隧道的指令就是:

ssh -CNgv -L 6006:127.0.0.1:6006 root@region-1.autodl.com -p 37881

最后使用你喜欢的浏览器,打开 http://localhost:6006,你就能看到你成功搭建的网页 🎉。

🧙‍♂️ 开炉!

🎨 品味成果

Footnotes

  1. 更详细的 SSH 使用指南可以参考:SSH Essentials: Working with SSH Servers, Clients, and Keys