前语

最近AI很火,先是AI画图,然后就ChatGPT,后者我现已用了一段时间了,用来写作文挺不错的,但OpenAI屏蔽了中国IP,加上用户太多啥的,用起来没那么爽,但没办法全球只此一家,只能捏着鼻子用。而AI画图就不相同了,全是开源的,自己部署一下能够玩个爽~

正好咱们这有台2080Ti的工作站,之前用来练习模型的,现在部署个画图应该轻轻松松,于是就开端了折腾之路~

作用

先看看我生成出来的一些图片

汉服 COSER
快来玩AI画图!StableDiffusion模型搭建与使用入门~
快来玩AI画图!StableDiffusion模型搭建与使用入门~
大海 2B小姐姐
快来玩AI画图!StableDiffusion模型搭建与使用入门~
快来玩AI画图!StableDiffusion模型搭建与使用入门~

Stable Diffusion

AI画图有 Novel AIDisco DiffusionStable Diffusion 等模型,为了快速上手,我挑选了最简略的 Stable Diffusion ~

Stable Diffusion 是一个「文本到图画」的人工智能模型(AI 绘图东西),开源且能部署在家用电脑(对硬件要求不高)上。运用 Stable Diffusion,你能够在拥有 6GB 显存显卡,16GB 内存或只依靠 CPU 的电脑上生成图画,并且仅需几秒钟的时间,无需进行预处理或后处理。

GitHub上有个项目能够快速将 Stable Diffusion 用 docker 跑起来,还附带了 UI 界面,便利得很,本文用的就是这个项目。

项目地址: github.com/AbdBarho/st…

前置条件

  • Linux体系(炼丹绕不开的,推荐Ubuntu系;Windows能够凭借WSL,但折腾)
  • NVIDIA显卡,6G以上显存(当然AMD显卡或者没显卡用CPU跑也行,但不在本文评论规模)
  • CUDA版别 11.6 以上
  • 晓畅的网络(能够正常访问GitHub、下载模型)

装备docker网络

装置这个 Stable Diffusion 模型,需求下载许多模型,单纯根底模型和数据就得十几个GB,这些都是要从国外的服务器下载,所以为了装置顺利,先来装备一下docker的署理。

Dockerd 署理

在履行docker pull时,是由看护进程dockerd来履行。因此,署理需求配在dockerd的环境中。而这个环境,则是受systemd所管控,因此实践是systemd的装备。

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf

在这个 proxy.conf 文件(可所以恣意 *.conf 的形式)中,增加以下内容:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

其中,proxy.example.com:8080 要换成可用的免密署理。

Container 署理

容器运转阶段,假如需求署理上网,则需求装备 ~/.docker/config.json。以下装备,只在Docker 17.07及以上版别生效。

{
  "proxies": {
    "default": {
      "httpProxy": "http://proxy.example.com:8080",
      "httpsProxy": "http://proxy.example.com:8080",
      "noProxy": "localhost,127.0.0.1,.example.com"
    }
  }
}

这个是用户级的装备,除了 proxies,docker login 等相关信息也会在其中。

Docker Build 署理

尽管 docker build 的实质,也是发动一个容器,但是环境会略有不同,用户级装备无效。在构建时,需求注入 http_proxy 等参数。

假如是通过 docker 指令发动的容器,能够运用以下指令

docker build . \
    --build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
    --build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
    --build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
    -t your/image:tag

不过咱们一般运用 docker compose 东西,所以接着看看 compose 的装备方法

version: '3.9'
services:
  app:
    build: ./services/AUTOMATIC1111
    image: sd-auto:49
    environment:
      - CLI_ARGS=--allow-code --medvram --xformers --enable-insecure-extension-access --api

改成

version: '3.9'
services:
  app:
    build:
      context: ./services/AUTOMATIC1111
      args:
        - HTTP_PROXY=http://proxy.example.com:8080/
        - HTTPS_PROXY=http://proxy.example.com:8080/
    image: sd-auto:49
    environment:
      - CLI_ARGS=--allow-code --medvram --xformers --enable-insecure-extension-access --api

这样就搞定了~

Tips

装备完记住重启 docker daemon

sudo systemctl daemon-reload
sudo systemctl restart docker

注意:无论是 docker run 还是 docker build,默认是网络隔绝的。假如署理运用的是 localhost:1234 这类,则会无效。

CUDA

推荐运用 LinuxMint/Ubuntu 体系自带的驱动管理器装置最新的显卡驱动。

体系方面之前用的是 LinuxMint18(根据Ubuntu16.04) ,看了下 NVIDIA 的官方网站,这体系太老了,现已没办法用上新版驱动和CUDA了,所以我又花了一下午时间把体系升级到 LinuxMint21(根据Ubuntu22.04),然后装上驱动,Ubuntu系装驱动真是便利,一键搞定,没有任何曲折,而且驱动附带的 CUDA 也装上了,不必额定折腾,舒服了。

nvidia-smi 看看驱动信息

Thu Mar 30 21:39:45 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.89.02    Driver Version: 525.89.02    CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:C1:00.0 Off |                  N/A |
|  0%   30C    P8    26W / 300W |   1350MiB / 11264MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1394      G   /usr/lib/xorg/Xorg                114MiB |
|    0   N/A  N/A      3198      G   cinnamon                           38MiB |
|    0   N/A  N/A    508973      C   python                           1192MiB |
+-----------------------------------------------------------------------------+

CUDA版别是12,完美~

建立过程

终于要开端搞了

先把代码 clone 下来

git clone https://github.com/AbdBarho/stable-diffusion-webui-docker.git

build step 1: 下载模型,需求十几个G的模型

(只需网络晓畅,一次搞定没问题的)

cd stable-diffusion-webui-docker
docker compose --profile download up --build

build step 2: 运转本体

这儿是挑选一套 UI 来发动,这个 auto 就是 UI 的名称,除了这个,还有 auto-cpu (没显卡用的)、 invokesygil 这几个,我试了之后还是 auto 最好,功用最多。

invoke 的界面比较简练,好像速度也比较快,但许多模型和LORA之类的都没法用了~

直接 auto 吧,不要纠结

docker compose --profile auto up --build

驱动、网络没问题的话,等它构建完能够看到类似的信息

stable-diffusion-webui-docker-auto-1  | Creating model from config: /stable-diffusion-webui/configs/v1-inference.yaml
stable-diffusion-webui-docker-auto-1  | LatentDiffusion: Running in eps-prediction mode
stable-diffusion-webui-docker-auto-1  | DiffusionWrapper has 859.52 M params.
stable-diffusion-webui-docker-auto-1  | Applying xformers cross attention optimization.
stable-diffusion-webui-docker-auto-1  | Textual inversion embeddings loaded(1): pureerosface_v1
stable-diffusion-webui-docker-auto-1  | Model loaded in 41.4s (calculate hash: 38.2s, load weights from disk: 1.6s, create model: 0.3s, apply weights to model: 0.3s, apply half(): 0.2s, load VAE: 0.8s).
stable-diffusion-webui-docker-auto-1  | Running on local URL:  http://0.0.0.0:7860

然后浏览器翻开 http://ip:7860 就能够看到这个界面

快来玩AI画图!StableDiffusion模型搭建与使用入门~

输入 prompt 就能够画图了,这儿我用了一个风光图的模型,画一幅风景画

快来玩AI画图!StableDiffusion模型搭建与使用入门~

假如跑不起来也没事,能够看看后面的「疑难解答」部分。

如何运用

刚开端必定一脸懵逼,咋画不出巨大上的作用啊?

  • prompt
  • 模型

首要,得学会运用 prompt,也就是生成图片的描绘,Stable Diffusion 通过英文文字内容来描绘场景或物体,以此来决议生成的图画中会出现什么。文字描绘是决议图画生成质量的关键因素。详细如何写 prompt 不在本文评论规模,请自行搜索相关文章,网上许多。

模型是个总称,其中包含了Checkpoints、LORA、Texture之类的,不细说了,按照模型网站上的教程装置运用就行。

这几个网站能够按提示组合生成 prompt:

  • promptomania.com/stable-diff…
  • weirdwonderfulai.art/resources/d…

这几个网站有许多人分享的制品图和描绘文案:

  • prompthero.com/
  • openart.ai/

然后模型的话,能够去这几个网站下载:

  • civitai.com/
  • huggingface.co/

疑难解答

failed to solve: rpc error:

报错信息

failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to solve with frontend gateway.v0: rpc error: code = Unknown desc = dockerfile parse error on line 8: unknown instruction: cat (did you mean cmd?)

解决方案

github.com/AbdBarho/st…

修改 stable-diffusion-webui-docker/services/AUTOMATIC1111/Dockerfile

将第一行

# syntax=docker/dockerfile:1

改为

# syntax=docker/dockerfile:1.3-labs

然后加上 DOCKER_BUILDKIT=1 参数进行 build

DOCKER_BUILDKIT=1 docker compose --profile auto up --build

pip依靠装置失利

网络问题,尽管前面现已装备好了 docker 的署理,但 build 过程中不会走装备好的署理,需求增加 build args 再装备一次。

在 docker compose 装备中增加 build args 装备署理服务器。

参阅文档: docs.docker.com/compose/com…

修改 docker-compose.yml 文件

auto: &automatic
  <<: *base_service
  profiles: ["auto"]
  build: ./services/AUTOMATIC1111
  image: sd-auto:49
  environment:
    - CLI_ARGS=--allow-code --medvram --xformers --enable-insecure-extension-access --api

改为

auto: &automatic
  <<: *base_service
  profiles: ["auto"]
  build:
    context: ./services/AUTOMATIC1111
    args:
      - HTTP_PROXY=http://host:port/
      - HTTPS_PROXY=http://host:port/
  image: sd-auto:49
  environment:
    - CLI_ARGS=--allow-code --medvram --xformers --enable-insecure-extension-access --api

显卡驱动问题

报错信息

Error response from daemon: could not select device driver "nvidia" with capabilities: [[gpu]]

需求装置 NVIDIA Container Toolkit

参阅文档: docs.nvidia.com/datacenter/…

注意这个东西要求 cuda 版别 11.6 以上,假如没有请先更新 cuda 版别。

增加软件源

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

注意假如是运用 LinuxMint 之类的 Ubuntu 衍生版,请手动指定 distribution 环境变量为对应的 Ubuntu 发行版,比如我现在用的 Mint 21 相当于 Ubuntu 22.04,所以需求设置 distribution=ubuntu22.04

装置

sudo apt install -y nvidia-container-toolkit

装备

sudo nvidia-ctk runtime configure --runtime=docker

重启 docker daemon

sudo systemctl restart docker

参阅资料

  • 项目地址 – github.com/AbdBarho/st…
  • 根底入门博客 – newzone.top/posts/2022-…