2026年2月27日 星期五

用LLAMA.CPP來跑離線模型與應用

在去年接觸了Ollama之後
它就成為了我離線LLM的主要應用來源
安裝與使用簡易是最大的優點
包含後來更易用的視窗對話功能,可以隨選模型
外加直接拖拉檔案進行上傳,而不是在命令列貼上檔案來源就是超方便的
然後我也靠著ollama本身就有的python支援
寫了一個簡易的翻譯用工具,協助我日常工作上的文件處理

不過好用歸好用
當我整理硬碟,發現它現在本體不含模型就佔了5GB之後
真的有點嚇到,怎麼這麼肥?
換言之,如果只是要拿來翻譯工具進行簡單的翻譯應用
不含模型就是先吃掉5GB去了
當然我用的不只這些,還有加減試很多東西
所以還會繼續使用Ollama
只是這容量對我弄出來的翻譯工具要移殖給他人用來說,阻力太強了

問了AI,給了解套方案,要用llama.cpp
https://github.com/ggml-org/llama.cpp

llama.cpp其實是目前離線大語言模型最主要執行專案
就連Ollama它的底層也是用這個開源專案改來跑的
只是Ollama現在之所以肥成這樣,還是因為把該有的顯示卡(GPU)驅動都包了進來
cuda的12與13版,amd的rocm等等
光是cuda下載個安裝檔就超過3GB,那安裝起來也不會小到哪去
這點就算是跑llama.cpp的Cuda版也跑不掉
咦?那為什麼AI還要推llama.cpp以降低容量呢?

那是因為llama.cpp還有容量更小的純cpu版可以用,幾十MB而已
聽起來不錯,可是CPU版一定很慢(之前跑YOLO訓練時就有領教過了)
不過還好,要同時考慮效能、泛用性以及容量需求,還有一個Vulkan版可以選擇
不但也可以把模型塞到顯示卡(GPU)上
而且通用,不管是Intel, AMD還是Nvidia哪一家的都可用
當然效果是沒有Cuda+Nvidia的搭配來得好
不然就不會現在還是Nvidia獨佔市場了
試著將Vulkan的執行檔下載解壓縮後,約135mb
是也不袖珍了,但已遠比5GB小太多了
所以最後就是選了這個vulkan驅動的llama.cpp來使用

方案訂了之後,朝向目標執行,如預期地撞了一堆障礙
首先,最不是問題的部分,llama.cpp是C/C++專案
沒關係,還有llama-cpp-python可以用
https://github.com/abetlen/llama-cpp-python
然後就都是問題了
主要是llama-cpp-python最新版的wheel(編譯檔)沒有Windows版可以用,要自行編譯
但公司電腦沒辦法裝微軟的免費編譯器工具Visual Studio Build Tools來用
(規模達到一定,只能付錢買Visual Studio來用,這也是為什麼現在都轉python的原因)
找了幾個舊版的wheel來用,發現太舊了,新版的模型跑不了
研究了一下,也問了AI,得到兩條路
1、放棄llama-cpp-python,改成使用llama.cpp的官方編譯執行檔,
  然後叫python用subprocess呼叫裡面llama-server去啟動模型,再用內部網路通訊。
2、用別台不會有問題的電腦把wheel檔編譯出來,然後就可以用llama-cpp-python了。

兩個方案都有實作出來
最簡單的,當然是第1個方案
先到release頁面下載vulkan的windows版執行檔
https://github.com/ggml-org/llama.cpp/releases
找到最新版的Windows x64 (Vulkan)就可以下載了
接下來使用subprocess呼叫下載下來llama.cpp中的llama-server
並載入想使用的模型,就可以像ollama一樣使用了
llama-server也支援OpenAI的格式呼叫,通訊上幾無問題
而且也不用再搞台電腦編譯llama.cpp
未來要更新,看來官方也一直有提供新的Windows執行檔可以下載
完全沒問題
所以是最推薦的作法
之前使用SakuraLLM Launcher也是用類似的作法執行

第2個方案雖然也有實作出來,不過真的太麻煩了
先不論還要用另一台電腦編譯這件事.這部分問題其實最小
反而在使用pyinstaller包裝時,出了問題
就是llama-cpp-pyhton的套件,要另外指定才會包進去
同時numpy的部分也是要再下指令才能包進去
最後整個打包起來,含自己寫的執行檔也是接近130MB,大概只少了第1方案15MB容量
並沒有比官方包還要輕量化到哪裡去,又麻煩
更新上,llama-cpp-python最新的Release版又只到2025年8月,也略舊了
測試過後速度也沒比第1方案快到哪裡

那就將最麻煩的第2方案留個手順後,為這個小專案做個結尾
首先,先安裝好Visual Studio Build Tools,然後記得要將cmake套件給裝上去
這個去年搞漫畫翻譯器時就弄好了,沒問題
接下來還要先下載Vulkan的SDK,並安裝到C槽裡面
這個也還好,反正就裝。
最後就是在Powershell裡執行
$env:CMAKE_ARGS="-DGGML_VULKAN=ON"
pip wheel llama-cpp-python --no-cache-dir
如果像我一樣比較喜歡傳統的cmd的話,請下
set CMAKE_ARGS=-DGGML_VULKAN=ON
pip wheel llama-cpp-python --no-cache-dir
就可以進行編譯,然後就可以得到執行python版本的wheel檔了
llama_cpp_python-0.3.16-cp312-cp312-win_amd64.whl

接著就把這檔案傳給要執行的電腦安裝
安裝指令就是
pip install llama_cpp_python-0.3.16-cp312-cp312-win_amd64.whl
裝完後,就可以使用llama_cpp_python套件了
至於pyinstaller的編譯注意事項,基本上就是看這段就好
"pyinstaller --onedir --noconsole --name "翻譯工具" --add-data "虛擬環境目錄\Lib\site-packages\llama_cpp\lib;llama_cpp\lib" --collect-all numpy  --collect-all llama_cpp   程式檔案名稱.py"
簡單地說就是把llama_cpp套件加入data中,然後numpy的部分要--collect-all包入。
為了避免llama_cpp還有遺漏,也加上--collect-all。
很麻煩對吧,所以才說幹脆用第一個方案就萬事OK了

沒有留言: