Skip to content
On this page

腾讯云部署SD集成环境

这边以腾讯云为例,详解集成环境的安装。阅读本文可能需要一些编程基础。

环境准备

服务器选择

配置的选择。GPU是最重要最基础的配置。经济允许尽量选择显存大的。

地区的选择。如果选择国内的服务器,在安装基础环境、插件、模型的过程可能会遇到很多网络相关的问题,但是相对来说的好处是部署好的服务器出图不容易出现网络问题,就是说你跑的图可以即时拿到。如果选择国外的服务器,那么你安装基础环境、插件、模型可能会很顺利,但是你需要建立额外的一个图片浏览网站(当然,这个很简单!)。

配置安全组

不配置安全组就不能远程访问服务器上的sdui。

腾讯云的实例和相关配置是按地区划分的,进入腾讯云控制台,找到网络与安全>安全组,找到服务器所在的位置,例如东京,找到实例对应的安全组,点击修改规则,先执行一键放通,然后放通sdui和图片浏览程序所需要的端口,个人使用使用78608080端口,因为这两个是之后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执行下面的指令,如果是境内服务器可能会非常痛苦。

bash
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

python
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:

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源可以顺利解决这个问题。