圈起來的是call API的部分
剩下的流程會需要一個統一的控制介面來控制
最早的控制台我是用tkinter寫,然後使用llama2 7b作為核心模型
但是tkinter有一個問題,這東西對emoji支援不完整
這導致了字幕中的emoji會變成"黑白emoji"
我開發與實現功能的順序也是照著流程圖來的
因此當我注意到字幕的問題是tkinter本身的設計缺陷時已經太晚了
如果要換GUI引擎那就相當於要把我2000+行的程式碼全部重寫
我最初在寫摳的時候確實有邊寫邊想我將來維護的時候會不會完蛋
因此我都有好好的命名與寫注釋
但我沒想過會需要把整個GUI引擎都換掉
因此我的業務流程的摳與GUI渲染的摳基本上是混在一起的
哭阿
選擇PyQt5的理由:
PyQt5我找到的教學比較多,文檔也比較完善
用這東西建立完GUI後還可以用pyqt提供的工具轉換成python code,真香
我只需要再用一個物件來包裝我的業務邏輯程式碼,這樣就可以輕鬆改完我的摳了
不過,我還需要動態的修改這個GUI
因為我還需要顯示對話泡泡
bruh
因為我的模型是多模態的LLM
所以我也有做圖像輸入
輸入圖像沒有問題
問題出在把圖像顯示在對話泡泡中
只要一顯示圖像PyQt5就直接當機
然後丟一個莫名其妙的錯誤碼後崩潰
這個錯誤碼我拿去stackoverflow與gpt上問
都說是底層的Qt出現了NullPointer錯誤
但我用的是被python封裝起來的Qt啊?
根本除錯不了
後來怎麼解決的?
我上網查說pyside才是Qt官方作的python封裝
pyqt是社群開發者們自己搞的
那就試試pyside看看能不能解決
笑死
一模一樣的摳,只改import路徑改成pyside後
所有問題都消失了
世界突然就和平了
但pyside有一個致命的問題
就是他的文檔就跟沒有一樣
她的文檔是用qt c++"機器翻譯"成python版本的
因此你可以把文檔當不存在
大多數的GUI都是"事件驅動"的方式在實現的
Qt的信號與信號槽在某種程度上也可以這麼認為
至少肯定會有一個主線程迴圈去不停地跑各種更新
我們理所當然的需要將耗時操作轉移到多線程甚至多進程中
不然就會出現"xxx已沒有回應"這種東西
現在離譜的來了
qt的python封裝在啟動GUI後會有一個python主線程與Qt主線程
這兩個線程是各自獨立的
同時是各自使用不同的鎖
因此你在python的多線程的GUI更新事件並不會同步到qt主線程中
你得用信號槽機制把更新從python多線程中塞到qt主線程中
上鎖/解鎖也是
你會需要兩把鎖來保證線程安全
我注意到我的語音合成模型總是會有一個約2~3秒的奇怪延遲
我原本想說是我的語音模型太大
算力不夠才會這樣
但我自己用別的工具測試時卻發現並沒有
我的語音模型已經夠小了
對於短句子可以做到毫秒級合成
經過排查才知道原來request預設每次發請求時都會建立一個session來記錄連接狀態
這個session的建立時間就是約2~3秒
哭阿
刻起來也不複雜,就是0優化而已
她很好心的幫你把你能在github上找到的大多數加速技術都整合在一起
諸如deepspeed、unsloth、flash attention...
畢竟框架本身只是一堆python腳本
但底下的優化技術是實實在在的c/c++
一堆底層優化技術都只支援linux,甚至微軟自己開發的deepspeed也是如此
偉哉WSL
不然就要搞麻煩的雙系統了
我雖然有一張4060ti 16G
4060ti 16G作為AI微調與推理的敲門磚足夠了
用transformers + 8int量化就可以輕鬆順跑
但這速度用在實際直播時可不行
一句話要講個1分鐘這太慢了
若使用gguf量化後,Q8量化可以來到11~16 token/s的速度
狠一點Q4或Q3量化可以達到將近20 token/s的速度
拿來直播綽綽有餘了
而且對VRAM的需求也大大減少
這樣我就有額外的VRAM可以跑語音合成模型了
問題來了:
如何量化一個融合了clip與llama3的全新模型?
gguf支援llava1.5 -> 融合llama2與clip
gguf支援llama3
所以我們需要將用transformers標準格式儲存的權重轉換成gguf格式
直接說結論
我通過魔改llava1.5的gguf轉換腳本使其能把llava-llama3的llama3轉換成正確的gguf格式
但我到現在依舊不知道該怎麼將gguf多模態模型的mm_project轉換出來
去他們的官方dc問只有一個奇怪的傢伙向我展示了他那炫炮無比的個人網站
我到現在依舊不知道怎麼把clip模型與投影矩陣正確地轉換成gguf格式
最後我只能使用xtuner團隊轉換出來的mm_proj作為我的多模態gguf模型
因為我在使用llama-factory微調模型時並不會動到投影矩陣與clip模型
因此湊合著用還行
大概吧...
最後成果長怎樣?