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