這篇文章記錄嘗試在Android手機跑Stable Diffusion,用於AI繪圖的過程,免Root。
Why? 因為你值得,寶礦力水得。
看到Github有人用8GB的樹莓派4跑Stable Diffusion。同為ARM架構的裝置,那照理說高階手機應該也可以如法炮製。
1. 系統資訊
- 手機:Sony Xperia 5 II (Android 13)
- CPU:高通Snapdragon 865 (Adreno 650)
- RAM: 8GB
- 準備30GB以上的空間,還有很快的4G網路。
2. 設定Linux環境
安裝Termux
安裝proot Debian環境,只要下載步驟1的最小系統,使用root帳號,不用裝桌面環境。
安裝git, vim, Python, Pip
|
|
3. 安裝Stable Diffusion
我下載的是最接近原始的版本,沒有圖形界面,要自己寫Pyhton程式呼叫Stable Diffusion算圖。
- 從runwayml的儲存庫下載全部模型,約30GB
|
|
- 接著安裝Python依賴套件
|
|
4. 撰寫Stable Diffusion算圖程式
用預設的512x512像素下去算Termux會直接崩掉,恐怕需要16GB RAM的電競手機才負荷得了。我的8GB RAM手機最多試到320x320就是極限了(圖片長寬需為2的N次方)。
至開發人員選項,禁止一切程式背景運作,以將資源集中給Termux。另外啟用充電時螢幕不休眠的選項。
Android預設會殺死佔用過多CPU的行程,參見此篇於電腦安裝ADB工具,並執行以下指令,將
max_phantom_processes
的值設高一些。
|
|
- 回到Termux,進入stable-diffusion-v1-5的上層目錄,新增
app.py
|
|
- 填入以下內容。
|
|
- 開始算圖
|
|
用CPU算大約需要30分鐘。
算圖時RAM幾乎是吃滿的狀態,Termux可能會隨時崩潰,不行的話就嘗試降低圖片長寬。
算好後,要取出proot裡的圖檔,將其移動至手機內部儲存空間。
|
|
- 成品像這樣。算圖下限是256x256像素,在那之下的圖片基本不能看。
5. 使用Aderno GPU算圖
藉由實驗性的virglrenderer專案,就能讓Stable Diffusion吃到Vulkan,進而使用手機GPU加速算圖。
- 在Termux中編譯virglrenderer,執行virgl伺服器。
|
|
- 登入Proot,在執行算圖程式前加上
GALIIUM_DRIVER=virpipe
讓其使用GPU,程式碼不用改。
|
|
GPU加速大約能降低一點點算圖時間。
算出來的結果差距不大。
6. 在chroot裡跑Stable Diffusion
如果手機RAM不足,何不用SWAP就好了?
仿造上面Debian的步驟安裝Python和Stable Diffusion,或者直接從proot-distro複製檔案 (路徑為
/data/data/com.termux/files/usr/var/lib/proot-distro/installed-rootfs/debian/root
)。建立8GB的SWAP檔案,這樣手機就有8+4+8=20GB的RAM了。如果不做此步驟,chroot硬算下去手機會直接重開機。
|
|
試著將圖片大小調整為標準的512x512像素,嘿,可以運算了。RAM吃多兇可想而知,所以得用ADB Shell或SSH進入chroot防止Termux崩掉。
算一小時後的成品。好像在說:你為什麼要花這麼多時間幹這種事情