2023年12月23日 星期六

自架 aws 雲端主機上的 stable diffusion

[2023/12/30] 改推另一篇: 用亞馬遜的 ec2 雲端主機自架 stable diffusion

終於架好自己的 stable diffusion! 簡單筆記一下參考的連結。 因為我有 aws 的優惠, 所以基本上就照著這篇做: 用 AWS CloudFormation 架設 AUTOMATIC1111 版的 SD。 我這篇的篇名應該加上 「補遺」 才對, 因為重點根本都在 koding work 的文章裡面, 請大家自己去讀 :-)

準備 yaml 檔時, 因為我的帳號內已有自己常用的 ssh key 跟 SecurityGroup, 所以 "Resources" 那一章底下 (建立新的) EC2Key 跟 SecurityGroup 兩節直接省略。 然後 "EC2Instance" 那一節底下的 "Properties" 小節裡面的 KeyName 欄位直接填既有的 ssh key 名稱; SecurityGroups 欄位也是。

我喜歡在本機的 ~/.ssh/config 設定好一些參數, 這樣等一下建立 ssh tunnel 時, 命令列才不會太長:

Host sdlab
  User ubuntu # <== 其實我都會改 user, 當然 /etc/sudoers.d/90-cloud-init-users 也要跟著設定
  HostName 99.99.99.99
  Port 22 # <== 其實我都會改 ssh port, 當然 SecurityGroup 也要跟著設定
  IdentityFile ~/.ssh/id_rsa
  IdentitiesOnly yes

這樣就可以很簡單地 ssh sdlab 。 成功登入 ec2 之後, 先用 root 的身份 dpkg-reconfigure tzdata 改成台北時區、 稍微 強化一下 ssh 安全防護。 然後檢查一下 GPU 硬體是否存在 (Amazon 對我翻白眼):

lspci
lshw -C display

不知道為什麼, 在我第一次開機時有看到 GPU; 第二次卻消失了。 總之如果沒有 nvidia-smi 指令可用, 就 手動安裝驅動程式

add-apt-repository ppa:graphics-drivers/ppa
apt search nvidia-driver | grep server
# 我現在看到的最新版是 535; 請以你看到的最新版為主):
apt install nvidia-driver-535-server python3-venv
nvidia-smi

要執行 webui.sh 啟動服務之前, 需要知道幾件事/作一些準備:

  1. 必須 cd 進到它所在的目錄, 也就是從 github clone 回來的 stable-diffusion-webui 那個專案目錄, 這樣執行: ./webui.sh 。 如果是從其他目錄用絕對路徑的方式去執行它, 它會找不到專案內的其他檔案, 於是會在原來的 stable-diffusion-webui/ 底下再 clone 一份新的 stable-diffusion-webui/ , 後續新增的各種檔案就會跑這個第二層裡面,害我頭好昏。
  2. webui.sh 的完整命令列參數列表
  3. 想要分享給別的電腦使用, 需要用 --listen 或 --share 選項; 但如此一來, 未來在安裝套件時會遇到 extension access disabed 的錯誤, 所以不建議這麼用。 後來我都採用 ssh 正向隧道 或是 ssh 反向隧道
  4. 模型簡介 的頁面挑幾個喜歡的模型, 開始下載, 放到 stable-diffusion-webui/models/Stable-diffusion/ 底下。
  5. 補安裝幾個套件: apt install libgoogle-perftools4 libtcmalloc-minimal4 如果沒裝的話, 等一下可能會遇到 "Cannot locate TCMalloc" 的錯誤, 還是可以執行, 但會執行效率會較差。

然後從本地桌機 建立 ssh 正向隧道, 並且 透過隧道啟動 chromium:

ssh -4fND localhost:12074 sdlab
chromium --proxy-server="socks5://localhost:12074" &

如果你在 sdlab 上啟動時有指定 port, 例如: cd ~/stable-diffusion-webui ; ./webui.sh --port 32158 那麼在 chromium 裡面就造訪這個網址: 0.0.0.0:32158 預設的 port 是 7860。 如果你的模型己經下載完、 放到正確位置, 就可以從網頁介面選一個模型、 開始玩囉! 如果有喜歡的圖片, 按下圖片下方存檔按鈕後, 咒語跟圖片會一起存放到 log/images/ 底下。

我另外還設定 用 systemd 開機時自動啟動。 又在 /etc/crontab 最後面加一句: 00 23 * * * root shutdown -h now 每天晚上 11 點自動關機, 以免忘記關機, 睡覺時還一直燒錢。

以後要玩的時候, 就這樣啟動: aws ec2 start-instances --region ap-northeast-1 --instance-ids i-fffffffffffffffff 其中 instance id 是這樣查出來的: aws ec2 describe-instance-status --region ap-northeast-1 --include-all-instances 每次玩完之後, 就 sudo shutdown -h now

接下來要讀 stable diffusion art 這個網站的文章, 學怎麼下咒語囉!

ps. 我也用 ~/.ssh/authorized_keys 把 ssh 帳號分享給我弟弟, 但後來才發現: 不能多人同時使用

* * * * *

先前 成功測試 AMD 顯卡。 後來照著 SD on AMD GPU 做, 中間也解決了 No module named 'pytorch_lightning.utilities.distributed'AttributeError: config 等等問題, 但最後 SD (或是底下某個函式庫, 忘記了) 還是抓不到 GPU。 翻到某個 shell script 讀了一下, 覺得可能是我的顯卡太舊。 總之租用雲端的 GPU 省時又省錢, 未來 aws 有新的 GPU 時也可以重建 ec2 免費升級, 而且不論我在哪個城市都可以玩, 方便多了。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。