2023年6月5日 星期一

在樹莓派玩AI算圖,使用篇(模型轉檔)

這兩篇文章都只是隨筆等級的,之後有要補充什麼可能會回來編輯

安裝篇提到的參考來源,裡面的範例程式app.py是使用上的基礎,要算圖就先去看他怎麼寫的

因為用diffusers的關係,模型必須符合diffusers的格式,也就是包含一個model index和scheduler、text encoder、tokenizer、unet、vae等資料夾的型態...不符合也沒關係,可以轉檔

並且在各資料夾內的檔案格式,避免是bin檔,而是使用safetensors檔來免除載入記憶體的大麻煩

先講個小地方:model_index.json裡面的scheduler,如果是PNDMScheduler,個人偏好改成DDIMScheduler,我覺得PNDM的表現實在不怎樣

這裡是很重要的參考資料:

https://huggingface.co/docs/diffusers/index

轉檔的時候會用到這裡面的scripts,不過好像有檔案相依,所以把整個專案用zip壓縮抓下來,找個妥當地方解開備用,然後切換到你下載模型的資料夾去,這裡假定你下載了一個單檔safetensors的模型:

python /home/pi/diffusers-main/scripts/convert_original_stable_diffusion_to_diffusers.py --from_safetensors --checkpoint_path='v1-5-pruned.safetensors' --to_safetensors --dump_path='output/'

這樣模型就會拆開成適合diffusers使用的型態,並且各資料夾內的檔案會是safetensors

如果下載回來的是ckpt,就不要加--from_safetensors,如果有特殊需求要拆成各資料夾是bin檔,就不要加--to_safetensors

有些時候,模型需要搭配特定的VAE,但是又沒有包好,導致拆出來的模型算圖顏色不對,可是diffusers也不吃.vae.pt?轉檔,不過這次事情稍微複雜一點:因為轉VAE的script沒有考慮到要轉成safetensors的需求,所以不能帶參數要它轉出safetensors,轉出來也固定是bin。這也不難解決:

去scripts目錄找出convert_vae_pt_to_diffusers.py,複製貼上改成convert_vae_pt_to_diffusers_safetensors.py方便辨識使用,然後打開新的檔案,把140行vae.save_pretrained(output_path)改成vae.save_pretrained(output_path, safe_serialization=True),就有一個可以轉出safetensors格式VAE的工具了

題詞太長怎麼辦?webui可以設定題詞強度,diffusers可以嗎?
可以裝lpw來達成,參考https://self-development.info/%E3%80%90stable-diffusion%E3%80%91%E9%95%B7%E3%81%84%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

在樹莓派玩AI算圖,安裝篇

這篇文章是我開玩一段時間以後,才憑印象寫的,可能會多少有點小錯誤,不過大方向應該沒問題啦

stable diffusion最常見的操作界面往往是個網頁,一般叫他webui,這對樹莓派來說有點太重了...事實上目前為止我也沒有成功把webui裝起來

因此樹莓派需要的,是使用名叫diffusers的工具來簡化操作,並且所有算圖操作都會用寫python指令的方式完成

 一開始的參考文章是這篇:

https://github.com/straczowski/raspberry-pi-stable-diffusion

使用的硬體是樹莓派4 8GB版本,有裝散熱片。512GB的記憶卡(不要小於128G,至少256G,模型很吃空間的)

第一件他沒講的事情:把樹莓派的swap(虛擬記憶體)改大一點,改法先自己查,我是直接改到16G,這和顯卡算圖不同,因為是cpu算圖,吃的是主記憶體,所以記憶體不足的時候,是可以把硬碟(SD卡)拉來坦的...但是這種行為對快閃記憶體來說會扣血,所以比較像是備而不用,偶爾用一下沒關係,不要拼命用就好

其他還有幾個地方不要完全照做:

    總之先把python盡量更新一下,寫文章時樹莓派最新是3.9版

    不要急著進文字模式,其實可以在gui模式做完所有事情。如果你是讓視窗養大的希望這句話可以讓你安心點(?

    雖然裝了git lfs,可是在我實戰的時候,下一行git clone會直接把記憶體塞滿然後死當(????);改打git lfs clone可以迴避問題(不過會跟你說這方法以後遲早會拔掉。另外,上面講的swap改大有可能解決這問題

所以到這邊為止要敲的指令是

git lfs install

git clone https://huggingface.co/runwayml/stable-diffusion-v1-5

pip install --upgrade diffusers 

 繼續往下的時候,電腦會說要安裝transformsers和pytorch,照著提示安裝就行(以下憑印象):

pip install transformers

pip install torch torchvision torchaudio

這裡有個地雷要迴避:pytorch2.0版的arm執行檔是壞的 ,請手動裝1.3版或者去抓最新的2.01版(寫文章時最新)來裝(看到討論有人回報說在AWS的arm伺服器上一樣會炸掉我快笑死)

接下來有個跟記憶體使用量非常有關係的東西要裝:

pip install safetensors

這元件能讓diffusers可以直接吃safetensors格式的檔案。這有多重要?

裝了這個,算圖階段不需要把模型讀到記憶體佔空間!程式只會在需要的時候,直接去讀SD卡上的safetensors檔案需要的部份。我說不需要進文字模式,也是因為這個元件的存在。參考文章的老兄如果有裝到這個應該玩瘋了吧w

2020年8月16日 星期日

UBUNTU存取網芳的「掛載資料夾發生錯誤:已逾時」

 解答可能也不是第一次出現在我面前了,但是顯然我現在的心臟比較大顆(?

步驟1:找這個檔案出來,用管理權限編輯他

/etc/samba/smb.conf

我是先在檔案管理程式爬到這裡,再用終端機開啟目前路徑,再敲sudo pcmanfm搞出一個管理員權限的檔案瀏覽,才去點開用記事本之類的編輯。有點爛XD

步驟2:在[global]那區找個適當的地方,加上這行然後存檔:

client max protocol = SMB3

其實不太確定這在幹嘛,可能跟smb1被各種攻擊針對,最後終於死了,但是samba的預設設定檔沒調整之類的吧

步驟3:重開機或者重開SMB服務

sudo service smbd restart

就很一般的重開服務XD smb服務重新被啟動的時候,會去看設定檔來工作,就會套到剛才新增的設定了


參考資料:

https://forums.linuxmint.com/viewtopic.php?t=255204

https://askubuntu.com/questions/890499/connection-timeout-on-windows-share-network


說實在的,這篇有一點知其然不知其所以然,同時這又是更換nas之後(可惡前一台是故障,資料還沒撈...)一邊設定一邊想到這個宿疾該修了...(前一台的時候點錯路徑會噴錯誤,但是有權限的資料夾就可以正常進入,當初到底怎麼設定到能用的現在不可考了w)

2020年5月17日 星期日

arduino 2.4inch TFT LCD touch calibration ,touch誤差修正

程式是用  TFTLCD-Library 的範例改的
The code is base on  TFTLCD-Library example code

另外,雖然範例寫說不能在LEONARDO跑,可是我用起來沒什麼問題,一直到現在才發現這句提示XD
This code run on my LEONARDO is well, I don't know why code say "DOES NOT CURRENTLY WORK ON ARDUINO LEONARDO"


2019年2月11日 星期一

Raspberry pi 3B+,node red連接小米溫溼度計的flow

其實還有另一個flow是控制我以前用esp8266做的小燈的開關啦...

Raspberry pi 3B+,node red安裝、node red支援藍牙節點

這步可以很簡單,我卻雷殘好多次