腾讯云部署SD集成环境
这边以腾讯云为例,详解集成环境的安装。阅读本文可能需要一些编程基础。
环境准备
服务器选择
配置的选择。GPU是最重要最基础的配置。经济允许尽量选择显存大的。
地区的选择。如果选择国内的服务器,在安装基础环境、插件、模型的过程可能会遇到很多网络相关的问题,但是相对来说的好处是部署好的服务器出图不容易出现网络问题,就是说你跑的图可以即时拿到。如果选择国外的服务器,那么你安装基础环境、插件、模型可能会很顺利,但是你需要建立额外的一个图片浏览网站(当然,这个很简单!)。
配置安全组
不配置安全组就不能远程访问服务器上的sdui。
腾讯云的实例和相关配置是按地区划分的,进入腾讯云控制台,找到网络与安全
>安全组
,找到服务器所在的位置,例如东京
,找到实例对应的安全组,点击修改规则
,先执行一键放通
,然后放通sdui和图片浏览程序所需要的端口,个人使用使用7860
和8080
端口,因为这两个是之后sdui和图片浏览程序所默认的,点击添加规则
按下表填写。
参数 | 值 |
---|---|
类型 | 自定义 |
来源 | 0.0.0.0/0 |
协议端口 | TCP:7860,8080 |
策略 | 允许 |
备注 | sd,imgshow |
配置安全组有比较快捷的操作,配置好的安全组可以复用,可以自己研究一下。
登陆
具体方式不在本文讨论范围内。个人比较习惯,一个是通过腾讯云控制台直接登陆;另一个是通过一款叫做Xshell的软件登陆。两者没有太大的区别,只是一个基于浏览器,一个基于软件,我感觉后者更稳定一点。
GPU资源监控
第一次登陆云服务器不着急安装sdui,通过nvidia-smi
指令查看GPU情况,例如GPU型号以及目前的使用情况、温度等。还可以看到正在使用GPU的进程,有时候sdui卡了,或者出现一些其它异常,我们可以在这里找到它的PID,通过kill -9 具体PID
来强制终止进程,避免白白占用GPU资源。
个人习惯实时去看GPU情况,使用watch -n 2 nvidia-smi
指令,意思每隔两秒就自动执行一次nvidia-smi
,这样我们在屏幕上可以实时看到GPU使用情况。当然,这样子这个窗口就不能用了,我们打开另一个窗口继续操作。
sdui的安装
遵循AUTOMATIC1111官方主页的做法!
这边买的服务器操作系统是Ubuntu 20.04执行下面的指令,如果是境内服务器可能会非常痛苦。
sudo apt install wget git python3 python3-venv
bash <(wget -qO- https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh)
它会默认安装一个基础模型,安装好之后它会自动启动。但这个启动是无效的,我们访问不了。判断是否安装完并启动,查看是不是给出了一个访问sdui的链接。
首次启动sdui
我们通过ctrl+C
可以结束掉一个当前正在跑着的sdui。
通过ls
可以查看当前目录下的文件夹及文件,因为我们已经在当前目录执行了AUTOMATIC1111官方主页的指令,ls
回车后可以看到一个stable-diffusion-webui
文件夹,通过cd s+tab
回车可以快速进入这个文件夹。
然后执行该文件夹下的脚本,通过指令./webui.sh --listen --xformers
启动sdui集成环境,--listen
可以让远程访问sdui,而--xformers
可以大大加速图片生成速度并节省GPU资源的占用,个人测试使用该指令。
启动成功后通过http://43.133.182.26:7860/
访问sdui,把43.133.182.26
替换成你购买的腾讯云服务器公网IP。
图片浏览程序的搭建
现在sdui已经安装成功,通过链接也可以正常访问。随便点击Generate
可以顺利生成图片(实际生成进度可以观察服务器命令行的输出),但是由于是境外的服务器,当图片比较小的时候可以正常显示,一旦图片大一些,很可能就无法顺利显示了,sdui的后台和浏览器是通过一种叫做websocket的协议进行通信的,它可能需要比较好的网络状况才能顺利传输图片。但是境内到境外服务器的网络质量可能达不到。
为了解决这个问题,我们弄一个图片浏览程序访问成功生成的图片。
先pip3 install Flask
安装所需要的依赖。然后在~目录下mkdir imgshow
创建一个imgshow文件夹用来存放图片浏览程序。imgshow下面将放两个文件,第一个是app.py
,另一个是templates
文件夹,里面包含一个index.html
文件。
可以在本地准备好,然后直接上传上去。下面是文件的内容。
app.py
:
import os
from collections import namedtuple
from flask import Flask, render_template, send_from_directory, request
app = Flask(__name__)
@app.route('/')
def index():
return "欢迎来到图片浏览网站!"
Image = namedtuple('Image', ['name', 'path', 'ctime'])
def get_image_list(base_path, limit=None):
image_list = []
for root, dirs, files in os.walk(base_path):
for file in files:
if file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')):
image_path = os.path.join(root, file)
rel_path = os.path.relpath(image_path, base_path)
ctime = os.path.getctime(image_path)
image_list.append(Image(name=file, path=rel_path, ctime=ctime))
image_list.sort(key=lambda img: img.ctime, reverse=True)
if limit is not None:
image_list = image_list[:limit]
return image_list
@app.route('/images')
def images():
base_path = '/home/ubuntu/stable-diffusion-webui/outputs'
limit = request.args.get('limit', default=None, type=int)
image_list = get_image_list(base_path, limit)
return render_template('index.html', images=image_list)
@app.route('/download_image/<path:path>')
def download_image(path):
base_path = '/home/ubuntu/stable-diffusion-webui/outputs'
return send_from_directory(base_path, path)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
index.html
:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>图片浏览网站</title>
</head>
<body>
<h1>图片列表</h1>
<ul>
{% for image in images %}
<li>
<a href="{{ url_for('download_image', path=image.path) }}" target="_blank">
<img src="{{ url_for('download_image', path=image.path) }}" alt="{{ image.name }}" width="200">
</a>
<br>
{{ image.name }}
</li>
{% endfor %}
</ul>
</body>
</html>
上传成功后,用python app.py
运行图片浏览程序,这样我们可以通过访问http://your-ip:8080/images?limit=5
获取生成的图片,将your-ip
替换为你的公网IP。limit可以指定一次获取的图片数量。
screen的应用
为了在断开连接后保持sdui和图片运行程序的运行,我们采用一个工具screen。安装screen:sudo apt install screen
例如说我现在打算断开 ssh ,又希望XXXXXXXX程序继续运行:
root@xkfx:~# screen -ls
(查看所有视窗) There is a screen on: 1883.pts-0.xkfx (03/04/2018 12:06:14 PM) (Detached) 1 Socket in /var/run/screen/S-root.
root@xkfx:~# screen -dmS MyWorker
(创建一个新的视窗,并指定名字) root@xkfx:~# screen -ls There are screens on: 2210.MyWorker (03/04/2018 12:38:55 PM) (Detached) 1883.pts-0.xkfx (03/04/2018 12:06:15 PM) (Detached) 2 Sockets in /var/run/screen/S-root.
root@xkfx:~# screen -r 2227.MyWorker
(screen -r 2227
或者 screen -r MyWorker
均可)
(Attached某个视窗,也可以理解为进入某个视窗)
root@xkfx:/# screen -ls There are screens on: 2227.MyWorker (03/04/2018 12:40:00 PM) (Attached) 1883.pts-0.xkfx (03/04/2018 12:06:15 PM) (Detached) 2 Sockets in /var/run/screen/S-root.
(执行你想进行的任何操作)
root@xkfx:/# cd /opt/antpool/cpuminer-2.5.0/ root@xkfx:/opt/antpool/cpuminer-2.5.0# ./minerd -o stratum+tcp://stratum-ltc.antpool.com:8888 -u xkfx.01 [2018-03-04 12:45:10] 1 miner threads started, using 'scrypt' algorithm. [2018-03-04 12:45:10] Starting Stratum on stratum+tcp://stratum-ltc.antpool.com:8888 [2018-03-04 12:45:12] thread 0: 4104 hashes, 15.34 khash/s
[detached from 2227.MyWorker]
(退出某个视窗,但保持该视窗工作继续进行。这里的操作是 Ctrl + A + D
)
root@xkfx:~# screen -ls There are screens on: 2227.MyWorker (03/04/2018 12:40:00 PM) (Detached) 1883.pts-0.xkfx (03/04/2018 12:06:15 PM) (Detached) 2 Sockets in /var/run/screen/S-root.
好了,现在可以断开 ssh了。
重新连接ssh,看看程序是不是仍在运行:
root@xkfx:~# screen -ls There are screens on: 2227.MyWorker (03/04/2018 12:39:59 PM) (Detached) 1883.pts-0.xkfx (03/04/2018 12:06:14 PM) (Detached) 2 Sockets in /var/run/screen/S-root.
root@xkfx:~# screen -r 2227.MyWorker
[2018-03-04 13:26:38] accepted: 28/28 (100.00%), 15.55 khash/s (yay!!!) [2018-03-04 13:27:39] accepted: 29/29 (100.00%), 15.58 khash/s (yay!!!) [2018-03-04 13:28:14] accepted: 30/30 (100.00%), 15.55 k1hash/s (yay!!!)
PS. 终结一个 screen ,切入该 screen 结束正在运行的程序, Ctrl + D
安装SD模型
获取模型的链接
例如https://civitai.com/api/download/models/80511
切到对应目录下wget即可,附带一个-O重命名
cd stable-diffusion-webui/models/Stable-diffusion/
wget -O meinamix_meinaV10.safetensors https://civitai.com/api/download/models/80511
wget -O DreamShaper.safetensors https://civitai.com/api/download/models/78164
安装插件,以controlnet为例
cd stable-diffusion-webui/extensions
切到extensions目录下,
git clone https://github.com/Mikubill/sd-webui-controlnet.git
可以去主页看文件,插件的特征是有一个根目录包含一个scripts
然后重启sdui他会自动安装这个插件及其所需的依赖
我们到https://huggingface.co/lllyasviel/ControlNet-v1-1/tree/main
下载所需要的controlnet模型。
同理切换到对应目录下
wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15s2_lineart_anime.pth
即可
安装过程的一些问题
ERROR: No matching distribution found for gradio==3.31.0 (from -r requirements_versions.txt (line 6))
因为腾讯云服务器在pip的时候默认使用的是他们自己的镜像,有时候软件包不是最新的,所以出现这个问题,通过pip config get global.index-url
可以查看当前使用的镜像http://mirrors.tencentyun.com/pypi/simple
,通过pip config set global.index-url https://pypi.org/simple
将源更改为官方的PyPI源可以顺利解决这个问题。