記錄內網Docker啟動Stable-Diffusion遇到的幾個坑

2023-05-17 12:00:34
摘要:最近看到K8s啟動stable-diffusion的文章,想著在自己開發環境復現一下。沒想到在內網環境還遇到這麼多問題,記錄一下。

本文分享自華為雲社群《內網Docker啟動Stable-Diffusion(AI作畫)》,作者:tsjsdbd 。

最近看到K8s啟動stable-diffusion的文章,想著在自己開發環境復現一下。沒想到在內網環境還遇到這麼多問題,記錄一下。

1. 背景介紹

「AI作畫」就是你給一段文字,AI自動生成影象;或者你給一張影象,AI自動生成另一種風格(比如自拍照=>漫畫風)。這個方向的AI框架以開源的stable-diffusion為代表,著名的Midjourney則是商業版的「AI作畫」。

2. 環境準備

由於「AI作畫」一般是GPU為主,雖然CPU也可以,但是速度相較GPU會慢很多(見下圖)。所以這裡我們準備一個帶GPU的Docker環境。

3. 下載映象

根據文章裡面提到的gpu版映象地址(注:它這個映象其實來自於開源社群:stable-diffusion-webui),直接:

docker pull zibai-registry.cn-hangzhou.cr.aliyuncs.com/gpt/stable-diffusion:v1.gpu

這裡要連外網+非官方倉庫,所以有2個設定需要為docker設定

  • 為docker設定代理。
vi /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTPS_PROXY=http://ip:3128"

類似這樣,然後重啟docker

  • 將目標倉庫地址設定為docker的信任倉庫。
vi /etc/docker/daemon.json
"insecure-registries": ["zibai-registry.cn-hangzhou.cr.aliyuncs.com"],

類似這樣。

4. 啟動Docker容器

由於需要開啟Web頁面,所以我們的docker需要設定埠對映,否則無法通過瀏覽器存取。

所以docker啟動會帶2個額外的引數:(1)掛載GPU卡。(2)設定埠對映

docker run -it -p 80:7860 --gpus "device=1" zibai-registry.cn-hangzhou.cr.aliyuncs.com/gpt/stable-diffusion:v1.gpu /bin/bash

5. 啟動Stable-diffusion程式

在Docker容器中,按照啟動命令執行:

python3 launch.py --listen

但是會報錯:

這是因為這個映象會聯網下載「模型」。而我的容器無法聯網。所以這裡在容器裡面設定代理:

export proxy=http://10.155.96.xx:3128
export http_proxy=$proxy
export https_proxy=${http_proxy}

類似這樣。但是還是下載失敗,報「證書不合法」

關於這個 「huggingface.co」證書不合法的問題。找了一圈解決方案,都無效。

比如,匯出證書,

然後拷貝到容器中,更新證書列表(2個證書都拷貝了,1個huggingface.co, 1個Huawei Web Secure):

update-ca-certificates

依然報證書不合法。

即使,我直接存取 huggingface.co 是OK的

也搜了類似的問題:https://github.com/huggingface/hub-docs/issues/54,但是仍然不行。

Ps:這裡證書問題不知道怎麼解,有思路的同學,給點建議。

6. 修改程式碼,忽略證書校驗

實在沒辦法,搜到的資料說可以在Python請求HTTP的函數裡面關閉「證書校驗」。

於是找到錯誤呼叫棧

這個request傳送的函數,有個「忽略證書校驗」的引數。

cat /stable-diffusion-webui/venv/lib/python3.8/site-packages/huggingface_hub/utils/_http.py

(ps:容器裡面沒有vi命令,所以我是在主機上改的。因為任意容器裡面的檔案,都可以在主機Host上看到)

於是我將其改為:

response = requests.request(method=method, url=url, **kwargs)

=》

response = requests.request(method=method, url=url, verify=False, **kwargs)

然後終於,可以順利下載「模型」了

模型下載完後,依然報了個錯:

什麼? localhost 不能存取,怎麼可能~ 搜到一個類似的問題:https://github.com/microsoft/TaskMatrix/issues/250

說是代理原因,導致存取本地失敗。

於是加上:

export no_proxy="localhost, 127.0.0.1, ::1"

報錯,看來 ipv6 這個格式不認識。

最終改為:

export no_proxy="localhost, 127.0.0.1"

一切OK。

7. 開啟Stable-diffusion的WEB介面

瀏覽器輸入開發機的地址,即可開啟Web介面(因為我們設定了 80 埠對映)。

試了下效果,一般般,可能是我魔法咒語(Prompt)唸的不太行。

(ps:有個「咒語」參考網站:https://civitai.com 從這裡面下載的模型,生成效果不錯)。

下載後,拷貝至對應目錄:

docker cp ./majicmixRealistic_v4.safetensors 容器id:/stable-diffusion-webui/models/Stable-diffusion/

然後Web介面選擇新下載的模型就行:

僅供參考~

參考:

基於容器平臺 ACK 快速搭建 Stable Diffusion

其中Docker映象對應dockerfile(萬一映象無法下載):

FROM nvidia/cuda:11.3.0-cudnn8-runtime-ubuntu20.04
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
    libgl1 libglib2.0-0 git wget python3 python3-venv && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

ADD . /stable-diffusion-webui
WORKDIR /stable-diffusion-webui/
RUN ./webui.sh -f can_run_as_root --exit --skip-torch-cuda-test

ENV VIRTUAL_ENV=/stable-diffusion-webui/venv
ENV PATH="$VIRTUAL_ENV/bin:$PATH"

VOLUME /stable-diffusion-webui/models
VOLUME /root/.cache

CMD ["python3", "launch.py", "--listen"]

 

點選關注,第一時間瞭解華為雲新鮮技術~