10-11 更新:显存占用问题可以通过指定 Fp16 计算解决,16G 显存就足够运行完整模型,77Prompt 长度限制通过增加 - e CLIP_CONTEXTS=3 解决,Docker 的启动指令已经更新。

10-11 更新 @LyanOrz 提供的 Colab 白嫖跑官方前后端

https://colab.research.google.com/drive/1_Ma71L6uGbtt6UQyA3FjqW2lcZ5Bjck-

一些碎碎念

其实我感觉自己用的话部署整套 UI + 后端挺麻烦的,毕竟前端只是帮你发了个请求,后端也只是把请求改了个样子发给实际处理的 Api,直接部署 Api 调用 Api 结果是一样的,还方便白嫖。

可以参考 @LyanOrz 大佬提供的用 Colab 白嫖部署的方法,直接嫖一个后端出来,显卡都省了岂不美哉.jpg

https://colab.research.google.com/drive/1X-62QjZJpZ5Ewo3w6xr9D23Tu90udvQI

或者使用 Stable-Diffusion Webui 替换模型的 Webui,也是白嫖 Colab

https://colab.research.google.com/drive/1zuK0u8UW8IKMEvVNz7lU34Qph_gS14XD

其他的吐槽

原版这全套莫名其妙的极其能吃显存,吃完还不释放(见文末尾),如果有大佬优化一下最好了。

又更新:

看起来全尺寸的 7G 模型就是特别能吃显存,建议显存低于 24G 的就不要尝试使用官方版本前后端了,铁定爆(

目前来看如果准备使用官方前后端还想玩 img2img 的话。。。可能需要 32G + 的显存,建议购买 V100S 或者 A6000 或者 A100(跑

还没写完文章就有的更新:

已经有大佬把官方前端后端单独提出来了,没必要折腾下面那么多完整的部署,直接下载运行就好了,默认使用的是 4G 大的模型,理论上替换成 7G 那个模型就是跟官方一样的效果。

1
>magnet:?xt=urn:btih:4a4b483d4a5840b6e1fee6b0ca1582c979434e4d&dn=naifu&tr=udp%3a%2f%2ftracker.opentrackr.org%3a1337%2fannounce

1. 准备

硬件需求:

  • 一台拥有一张至少有 24G 显存(单后端至少11G)的 NVIDIA GPU 的 linux 系统的 x86 设备。

  • 软件需求:

  • NVIDIA 驱动 (CUDA 11.6 Toolkit)

  • Docker 19+

  • Nvidia-Container-Toolkit

2. 安装 Docker

该命令国内访问较慢,可以查国内镜像安装

1
curl -fsSL https://get.docker.com | bash

3. 安装 Nvidia-Container-Toolkit

Ubuntu, Debian:
1
2
3
4
5
6
7
8
9
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -

curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit

sudo systemctl restart docker
CentOS/RHEL
1
2
3
4
5
6
7
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo

sudo yum install -y nvidia-container-toolkit

sudo systemctl restart docker

4. 安装显卡驱动

5. 确认显卡驱动已经安装好,并且nvidia-smi可以看到显卡

nvidia-smi

6. 确认 Nvidia-Container-Toolkit 安装成功

nvidia-container-toolkit

7. 下载 NovelAI 模型相关文件

https://pan.lumine233.ml/d/Lumine/NovelAI-Leak/Models/novelai.tar.gz

8. 解压 NovelAI 模型相关文件

1
tar -zxvf novelai.tar.gz

解压模型文件

9. 下载 Docker 镜像相关文件

https://pan.lumine233.ml/d/Lumine/NovelAI-Leak/Back-End/novelaidocker.tar

10. 导入 Docker 镜像

1
docker load -i novelaidocker.tar

导入Docker镜像

继续部署单后端版本

10.1 运行 Docker

如果希望包含 nsfw 内容,则把

1
- e MODEL_PATH="/root/stableckpt/animesfw-latest"

改成

1
-e MODEL_PATH="/root/stableckpt/animefull-latest"

解压的 novelai 位置替换为你实际解压 NovelAI 模型相关文件出来的 novelai 文件夹的位置,如 /root/novelai

1
docker run --gpus all -d -p 80:80 -v 解压的 NovelAI 位置:/root -e  DTYPE="float32" -e AMP="1" -e MODEL="stable-diffusion" -e DEV="True" -e  MODEL_PATH="/root/stableckpt/animesfw-latest" -e  MODULE_PATH="/root/stableckpt/modules" -e  TRANSFORMERS_CACHE="/root/transformer_cache" -e SENTRY_URL=""-e  ENABLE_EMA="1"-e VAE_PATH="/root/stableckpt/animevae.pt"-e  BASEDFORMER="1"-e PENULTIMATE="1" novelai:latest gunicorn main:app  --workers 1 --worker-class uvicorn.workers.UvicornWorker --bind  0.0.0.0:80

10.2 查看容器状态

查询出容器 ID

1
docker ps

docker ps

1
docker logs [Container ID]

docker logs

出现 “Application startup complete.” 即代表程序已经就绪

1
docker attach [Container ID]

attach 进入 docker 可以看到当前任务实时的生成进度

docker attach

10.3 请求 API

参考代码,具体参照 leak 的前端后端项目,以及其中的 sd-private\hydra-node-http\main.py

prompt 中 masterpiece, best quality, 开头对应原版 web Add Quality Tags 选项,不建议删除,后面直接跟自己 prompt 即可

uc 部分对应 web Undesired Content,建议保留默认

sampler 是采样方法,可选plms/ddim/k_euler/k_euler_ancestral/k_heun/k_dpm_2/k_dpm_2_ancestral/k_lms

seed 是种子,自己随机一个整数数字,不然一直会出一样的结果。

n_samples 代表要生成几张图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
import json
import base64
import random

endpoint = "http://10.10.12.67/generate"

data = {"prompt": "masterpiece, best quality, brown red hair,blue eyes,twin tails,holding cat", "seed": random.randint(0, 2**32)
,"n_samples":1,"sampler":"ddim","width":512,"height":768,"scale":11,"steps":28,"uc":"lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry"}
req = requests.post(endpoint, json=data).json()
output = req["output"]
for x in output:
img = base64.b64decode(x)
with open("output-" + str(output.index(x)) + ".png", "wb") as f:
f.write(img)

生成的效果图示例

Genshin,lumine, gold hair, cat, girl,White silk

Genshin,lumine, gold hair, cat, girl,White silk

11. 创建一个 Docker Bridge

1
docker network create --subnet=10.240.0.0/16 nainetwork

创建docker bridge

12. 下载 Tag Predict 所需文件

https://pan.lumine233.ml/d/Lumine/NovelAI-Leak/TagPredict/safe.zip

13. 将上一步的压缩包解压到Novelai 文件夹中。

unzip

14. 修改 Docker 中的 models.py 文件让他从本地加载 Tag Predict 依赖文件

执行

1
2
3
4
5
cd ~

mkdir docker

cd docker

下载 models.py

https://pan.lumine233.ml/d/Lumine/NovelAI-Leak/Models/models.py

然后将 models.py 下载并存放到新建的 docker 文件夹内

执行

1
echo -e "FROM novelai:latest\nCOPY models.py /usr/src/app/hydra_node" > Dockerfile

检查一下文件夹内容

内容

无误的话执行

1
docker build . -t novelai:latest

build

15. 启动 Tag Predict Docker

注意:他可能需要从被墙的 Huggingface 下载东西,建议机器科学上网

1
docker run --gpus all --network "nainetwork" --name "tag-predict" --restart=always -d -p 127.0.0.1:7000:7000 -v 上文中解压 Novelai 相关文件的位置:/root -e DTYPE="float32" -e AMP="1" -e MODEL="embedder" -e DEV="True" -e MODEL_PATH="/root/stableckpt/animefull-latest" -e MODULE_PATH="/root/stableckpt/modules" -e TRANSFORMERS_CACHE="/root/transformer_cache" -e SENTRY_URL=""-e ENABLE_EMA="1"-e VAE_PATH="/root/stableckpt/animevae.pt"-e BASEDFORMER="1"-e PENULTIMATE="1" -e TOKEN=114514qwqqwq novelai:latest gunicorn main:app --workers 1 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:7000

16. 查看 Tag Predict Docker 状态

tag predict docker

17. 测试 Tag Predict 是否工作

1
curl 'http://127.0.0.1:7000/predict-tags' -H 'Authorization: Bearer 114514qwqqwq' -H 'Content-Type: application/json' --data-raw '{"prompt":"kochiya"}'

tag predict

如果以上步骤一切正常的话,就可以开始部署 web 的后端了

18. 运行 Pgsql

18.1 下载 Pgsql 数据库文件

https://pan.lumine233.ml/d/Lumine/NovelAI-Leak/Pgsql/pgsqldata.tar.gz

18.2 解压 Pgsql 数据库文件

1
tar -zxvf pgsqldata.tar.gz

18.3 拉取 Pgsql Docker

1
docker pull postgres

18.4运行 Pgsql

1
docker run -d --network "nainetwork" --name "pgsql" -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=development -v 解压出的 Pgsqldata 文件夹位置:/var/lib/postgresql/data postgres

19. 运行 Web 后端

下载并导入 Web 后端 Docker

19.1 导入 Docker

1
docker load -i novelai-backend.tar

19.2 运行 Docker

1
docker run -d --log-opt max-size=10m --log-opt max-file=3 --network "nainetwork" --restart=always -p 3000:3000 -e LISTEN_ADDRESS=0.0.0.0 -e VOICE_TOKEN=114514qwqqwq -e NODE_ENV=development -e DB_HOST=pgsql -e DB_PORT=5432 -e DB_USER=postgres -e DB_PASSWORD=development -e DB_NAME=novelai -e RECAPTCHA_SECRET_KEY=disabled -e HYDRA_DUMMY=true -e AI_KEY= -e JWT_SIGN_SECRET=b95bac5a-9c43-4cdf-8c65-fc1bcc557e41 -e PADDLE_VENDOR_ID=1234 -e PADDLE_VENDOR_TOKEN= -e MAILGUN_DOMAIN=1234 -e MAILGUN_KEY=1234 -e REGISTRATION_DISABLED= -e ADMIN_PASSWORD=1234 novelai-backend:latest

检查 Web 后端 Log

Log

20. 运行模型

如果准备同时加载两个模型的话对显存要求比较高,量力而行。

20.1 加载 Curated 模型

1
docker run --gpus all -d  --restart=always --network "nainetwork" --name "nai-sfw" -v 解压的 NovelAI 文件夹位置:/root -e DTYPE="float16" -e CLIP_CONTEXTS=3  -e AMP="1" -e MODEL="stable-diffusion" -e DEV="True" -e MODEL_PATH="/root/stableckpt/animesfw-latest" -e MODULE_PATH="/root/stableckpt/modules" -e TRANSFORMERS_CACHE="/root/transformer_cache" -e SENTRY_URL=""-e ENABLE_EMA="1"-e VAE_PATH="/root/stableckpt/animevae.pt"-e BASEDFORMER="1"-e PENULTIMATE="1" -e TOKEN=114514qwqqwq novelai:latest gunicorn main:app --workers 1 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80

20.2 加载 Full 模型

1
docker run --gpus all -d  --restart=always --network "nainetwork" --name "nai-full" -v 解压的 NovelAI 文件夹位置:/root -e DTYPE="float16" -e CLIP_CONTEXTS=3  -e AMP="1" -e MODEL="stable-diffusion" -e DEV="True" -e MODEL_PATH="/root/stableckpt/animefull-latest" -e MODULE_PATH="/root/stableckpt/modules" -e TRANSFORMERS_CACHE="/root/transformer_cache" -e SENTRY_URL=""-e ENABLE_EMA="1"-e VAE_PATH="/root/stableckpt/animevae.pt"-e BASEDFORMER="1"-e PENULTIMATE="1" -e TOKEN=114514qwqqwq novelai:latest gunicorn main:app --workers 1 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80

21. 部署前端

21.1 拉取 Nginx docker

1
docker pull nginx

21.2 下载前端文件

https://pan.lumine233.ml/d/Lumine/NovelAI-Leak/Front-End/nginx.zip

21.3 解压文件

1
unzip nginx.zip

21.4启动 Nginx

1
docker run -d --network "nainetwork" -v 解压出来的 nginx 目录位置  /conf.d:/etc/nginx/conf.d -v 解压出来的 nginx 目录位置 /build:/etc/nginx/build -p 80:80 nginx:latest

22. 修改 Hosts

将本地 Hosts 中添加一条

你后端部署在的机器的 ip novelai.baidu.com

HOST

23. 访问 Web

现在尝试访问一下 http://novelai.baidu.com

使用账号 test@nya.la 密码 Aa123123123 登录即可

只有 Image Generation 下面的功能是可以使用的。

WEB


一些其他信息

跑生成时的显存占用

smi

已知问题:

生成一个图片之后这破程序不回收显存,生成下一张就会

BOOM

然后 docker 就会自动崩溃重启。

24G 显存的 A10 使用 img2img 功能,哪怕全默认配置

BOOM

显存也不够他吃的