自從看過保哥的教學使用 VSCode 的 Remote Container 打造 Java 開發環境後,就很想把各種東西都丟進容器中,最近 Stable Diffusion 很紅,也跟風玩看看,之前有先在 Colab 上跑,觀摩好幾個 Colab 筆記本,寫出自己的 Colab 版本,但要轉移到容器上跑,還是遇到一些問題
要怎麼讓容器使用外部環境的 GPU
編輯devcontainer.json
,在跟build
同層級(也就是最外層的大括號內的第一層)的地方新增runArgs
鍵,值設定為["--gpus","all"]
,就能在呼叫 Docker 執行時自動加上參數,這樣就能讓容器使用外部 GPU,不需要在容器內裝驅動程式
ImportError: libGL.so.1: cannot open shared object file
網路上解決這問題的方法很多,試過後比較喜歡也有用的解法是pip install opencv-contrib-python-headless
,但想要解決下面提到的問題時,卻一直卡在這個問題上
要怎麼讓容器重建時不需要重新下載需要的各種檔案
原本以為只需要編輯Dockerfile
就好,但為了提高自動化程度,devcontainer.json
也需要修改,過程中最想不通的就是上面那問題的解法不是每次都有用,為了確保每次都能重建成功,開始了漫長的試錯過程,原來是因為要先移除opencv-contrib-python-headless
再重裝才不會失敗,而且移除重裝opencv-contrib-python-headless
的順序一定要擺在指令最後,先把其他相依套件都裝完最後再來移除重裝才不會遇到ImportError
An error occured setting up the container
如果沒修改過Dockerfile
卻常常在按下容器重建時跳出這訊息的話,我猜是因為把舊容器刪掉到開始重建新容器需要一段時間,但 VSCode 關掉再開的速度太快,導致太早去讀取容器內的資源,所以一直跳錯誤訊息,目前解法就是過一段時間再按retry
,或是狂按retry
直到 VSCode 得知容器開始重建就不會再跳錯誤訊息了,也就是右下角會出現可以查看 Docker 紀錄通知的時候。如果出現可以查看紀錄的訊息卻還是有這個錯誤訊息,那就是修改過的Dockerfile
有問題
移除套件時跳出沒有權限的訊息pip uninstall
前面加上sudo
Dev Containers
套件Access Tokens
Python 3.10(bullseye)
,feature
都不用選,不需要Nodejs
stableDiffusion
,那麼在本機stableDiffusion
目錄下或容器內/workspaces/stableDiffusion
的目錄下執行git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
,若本機沒裝git
就等進到容器內再下這行指令header
,下載回來的檔案都放在stableDifusion
資料夾底下,也就是 VSCode 預設的開啟位置,這也是COMMANDLINE_ARGS
參數設為--ckpt-dir ./
的原因
wget --header="Authorization: Bearer access_token_string" https://huggingface.co/CompVis/stable-diffusion-v-1-4-original/resolve/main/sd-v1-4.ckpt
wget --header="Authorization: Bearer access_token_string" https://huggingface.co/hakurei/waifu-diffusion-v1-3/resolve/main/wd-v1-3-full.ckpt
wget --header="Authorization: Bearer access_token_string" https://huggingface.co/naclbit/trinart_stable_diffusion_v2/resolve/main/trinart2_step115000.ckpt
stableDifusion
目錄結構
.
├── .devcontainer
│ ├── Dockerfile
│ └── devcontainer.json
├── scripts
│ └── pipInstall.sh
└── stable-diffusion-webui
├── .git
├── .github
├── .gitignore
底下省略
devcontainer.json
部分內容
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
+ "postCreateCommand": "cd stable-diffusion-webui && git pull && COMMANDLINE_ARGS=$COMMANDLINE_ARGS python launch.py",
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
+ "runArgs": ["--gpus","all"
+ ],
"remoteUser": "vscode"
}
Dockerfile
部分內容
+ENV COMMANDLINE_ARGS="--ckpt-dir ./"
# [Choice] Node.js version: none, lts/*, 16, 14, 12, 10
ARG NODE_VERSION="none"
RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi
# [Optional] If your pip requirements rarely change, uncomment this section to add them to the image.
+COPY stable-diffusion-webui/requirements.txt /tmp/pip-tmp/
+COPY stable-diffusion-webui/repositories/CodeFormer/requirements.txt /tmp/pip-tmp/CodeFormer
+COPY scripts/pipInstall.sh .
+RUN bash -i pipInstall.sh
# [Optional] Uncomment this section to install additional OS packages.
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
# && apt-get -y install --no-install-recommends <your-package-list-here>
pipInstall.sh
由於內容全是新增的,因此markdown
就不用diff
改用bash
了
# 自行安裝 torch 是因為有不相容的訊息,如果沒有不相容訊息,可以去掉這段
pip3 --disable-pip-version-check --no-cache-dir install clip torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113 \
&& pip3 --disable-pip-version-check --no-cache-dir install -r \
/tmp/pip-tmp/requirements.txt -r /tmp/pip-tmp/CodeFormer \
&& sudo pip3 uninstall opencv-contrib-python-headless \
&& pip3 --disable-pip-version-check --no-cache-dir install opencv-contrib-python-headless \
&& rm -rf /tmp/pip-tmp
Colab 上我是用webui.sh
跑在虛擬環境中,不過其實這是給那些沒跑在容器中的人使用的,因此這次我就學StableDiffusionUI-Voldemort
連結 的作法,直接呼叫launch.py
讓 web 伺服器跑起來,實際運行後,最高可以一次產 16 * 8 = 128 張圖,會吃掉十幾 G 的系統記憶體,GPU 記憶體則是都維持在九成左右,產完圖之後要在 web 介面顯示出來時,有時會導致卡頓,連在單機都會這樣,也因此在 Colab 平台時,圖一多常常看不到算出來的圖,運算時也能感受到顯示卡有多熱情
嘗試跑兩個模型參數融合,把系統記憶體剩下的十幾 G 幾乎吃光光,SSD 可能因此寫入很多資料,融合模型前要三思,GPU 記憶體反而吃不多,合併時也是很快就結束了,倒是儲存檔案也花了一小段時間;融合後的模型會讓 GPU 記憶體時間曲線圖出現明顯的谷底,也就是資料移入跟移出時間都拉長了,其他模型的記憶體時間曲線圖是 V 字形,融合模型則是 _/
分辨不出圖片哪裡不好,因此也只嘗試了極端參數會有讓產出的圖有什麼變化,CFG Scale
值越小,產出的圖越模糊,反而有種朦朧美,值越大,圖片就幾乎都是色塊,也有模型的取樣步驟(Sampling Steps)拉到最高 150 反而產生都是雜訊的圖
VOLDY RETARD GUIDE
Huggingface
使用 VSCode 的 Remote Container 打造 Java 開發環境
Using GPU in VS code container
StableDiffusionUI-Voldemort V1.2
stable-diffusion-webui
CompVis/stable-diffusion-v1-4
hakurei/waifu-diffusion-v1-3
naclbit/trinart_stable_diffusion_v2
devcontainer.json reference