摘要:最近看到K8s啟動stable-diffusion的文章,想著在自己開發環境復現一下。沒想到在內網環境還遇到這麼多問題,記錄一下。
本文分享自華為雲社群《內網Docker啟動Stable-Diffusion(AI作畫)》,作者:tsjsdbd 。
最近看到K8s啟動stable-diffusion的文章,想著在自己開發環境復現一下。沒想到在內網環境還遇到這麼多問題,記錄一下。
「AI作畫」就是你給一段文字,AI自動生成影象;或者你給一張影象,AI自動生成另一種風格(比如自拍照=>漫畫風)。這個方向的AI框架以開源的stable-diffusion為代表,著名的Midjourney則是商業版的「AI作畫」。
由於「AI作畫」一般是GPU為主,雖然CPU也可以,但是速度相較GPU會慢很多(見下圖)。所以這裡我們準備一個帶GPU的Docker環境。
根據文章裡面提到的gpu版映象地址(注:它這個映象其實來自於開源社群:stable-diffusion-webui),直接:
docker pull zibai-registry.cn-hangzhou.cr.aliyuncs.com/gpt/stable-diffusion:v1.gpu
這裡要連外網+非官方倉庫,所以有2個設定需要為docker設定
vi /etc/systemd/system/docker.service.d/http-proxy.conf [Service] Environment="HTTPS_PROXY=http://ip:3128"
類似這樣,然後重啟docker
vi /etc/docker/daemon.json "insecure-registries": ["zibai-registry.cn-hangzhou.cr.aliyuncs.com"],
類似這樣。
由於需要開啟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
在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:這裡證書問題不知道怎麼解,有思路的同學,給點建議。
實在沒辦法,搜到的資料說可以在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。
瀏覽器輸入開發機的地址,即可開啟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"]