🪨 原材料
🧠 唯一的原材料就是你想要实现什么,即你的想法。
🛠️ 工具
GPU 机器
如果你已经有一台性能不错的 GPU 机器,那么你已经拥有了炼丹最重要的工具。
如果你还没有,那么可以租用一些云服务商的 GPU 机器。出于某些原因,本文以在 AutoDL 租用的 GPU 机器为例。市面上还有像 vastai、腾讯云、Google Cloud等服务商提供的云服务器,读者根据需求和预算选择就好。
SSH(可选)
概览
如果你准备通过云端的显卡来开启你的炼丹之路,首先你需要解决的问题是:该如何访问云端 GPU 呢?
SSH1 就是你的魔杖 🪄(阿瓦达索命!)。
SSH 全称是 Secure Shell Protocol,顾名思义就是一种安全的网络协议。
作用
现实的网络环境是复杂且危险的,如果我们需要远程访问一台服务器,如果我们发送给远程服务器的所有信息(包括用户登陆密码)都以明文的方式发送的话,毫无疑问远程机器会很容易被黑掉。
因此我们远程操控我们的远程服务器,就需要一种安全的传输协议来尽可能地保护我们与远程机器的通信,这也就是 SSH 存在的原因。我 SSH 只干三件事!安全!安全!还是XX的安全!
如何使用
SSH 连接的实现遵循客户端-服务器架构,每一台云端的 GPU 服务器都预装好了服务端程序。因此我们只需要在我们(本地)的机器上使用 SSH 客户端来连接我们的云端 GPU。
SSH 客户端提供两种方式来认证用户:
- 输入密码(缺点:相对不安全,每次都需输入密码;优点:相对好操作)
- SSH keys(缺点:首次验证比较繁琐;优点:只需要验证第一次,非常安全且方便)
为了使用 SSH 登录,我们需要知道机器的 ip 地址(也可以是域名)、登录端口、登录用户以及密码。那么我们的登录指令就是:
ssh -p port username@ip
而像 autodl 这样的平台在容器列表界面提供了可以直接复制的 ssh 登录指令和密码,直接复制即可:
输入密码(不推荐)
对于第一种输入密码的方式,只需要在终端输入 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
- 打开
powershell
- 输入
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]-----+
- 复制上一步生成的公匙地址,在这里就是
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 按钮,然后选择复制链接地址: 然后直接粘贴到命令行上,运行:
# 设置代理
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
以上指令的意义是:
ssh
: Secure Shell的缩写,用于安全地访问远程服务器。-C
: 使用压缩。当数据在客户端和服务器之间传输时,这个选项会让数据被压缩,从而可能加快传输速度。-N
: 表示只建立隧道,不执行远程命令。也就是说,这条ssh
命令不会在远程服务器上运行任何命令,它只是简单地建立一个隧道。-g
: 允许远程主机连接到本地的转发端口。-v
: 详细模式。输出ssh
命令的调试信息。这对于调试连接问题很有帮助。-L 6006:127.0.0.1:6006
: 设置端口转发。这意味着所有发往本地机器的6006端口的数据都会被转发到远程服务器的127.0.0.1的6006端口。6006
(第一个): 本地机器上的端口号。127.0.0.1
: 远程服务器上的IP地址。在这里,它指的是远程服务器自己。6006
(第二个): 远程服务器上的端口号。
username@domain
: 用于SSH登录的用户名和远程服务器的域名或IP地址。-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
-
更详细的 SSH 使用指南可以参考:SSH Essentials: Working with SSH Servers, Clients, and Keys ↩