llamafile 是昨天很紅的一個專案,由 Mozilla Internet Ecosystem (MIECO) 弄出來的專案,可以使用一個檔案直接跑起大型語言模型的 HTTP server,讓你可以在瀏覽器裡面直接使用。
直接看官方的 README.md
就可以蠻簡單的跑起來,不過 Simon Willison 也有寫一篇文章介紹一下,可以看看:「llamafile is the new best way to run a LLM on your own computer」。
這邊說的「一個檔案」是指同一個檔案同時可以在 Windows、macOS、Linux、FreeBSD、OpenBSD 以及 NetBSD 上面跑,而且這個檔案也把大型語言模型 (LLM) 的 model 檔案包進去,所以檔案會蠻大的,但畢竟就是方便讓人使用:
下載下來直接執行,預設就會在 port 8080 跑起來,可以直接連到 http://127.0.0.1:8080/ 連進去使用。
llamafile 用到的技術是 Cosmopolitan 專案,可以把多個平台的執行檔包在同一個檔案裡面使用。
另外用到的專案是 llama.cpp,這個蠻多人都用過了,可以很方便的用 CPU 或是 GPU 跑 LLM。
我在 Linux 上面跑剛好遇到幾個問題,都是在 README.md
上面有提到的。
第一個是 zsh 無法直接跑 llamafile (Ubuntu 22.04 內建 zsh 的是 5.8.1),這邊官方的建議是用 sh -c ./llamafile
避開:
If you use zsh and have trouble running llamafile, try saying
sh -c ./llamafile
. This is due to a bug that was fixed in zsh 5.9+. The same is the case for Pythonsubprocess
, old versions of Fish, etc.
另外一個對是 GPU 的支援,這邊跟你說加上 --n-gpu-layers 35
就可以用,所以一開始先用 sh -c ./llamafile --n-gpu-layers 35
試著跑:
On Linux, Nvidia cuBLAS GPU support will be compiled on the fly if (1) you have the cc compiler installed, (2) you pass the
--n-gpu-layers 35
flag (or whatever value is appropriate) to enable GPU, and (3) the CUDA developer toolkit is installed on your machine and the nvcc compiler is on your path.
但可以看到沒有被 offload 到 GPU 上面:
llm_load_tensors: ggml ctx size = 0.11 MB llm_load_tensors: using CUDA for GPU acceleration llm_load_tensors: mem required = 4165.47 MB llm_load_tensors: offloading 0 repeating layers to GPU llm_load_tensors: offloaded 0/35 layers to GPU llm_load_tensors: VRAM used: 0.00 MB
嘗試了不同的方法,發現要跑 sh -c "./llamafile --n-gpu-layers 35"
,也就是把參數一起包進去,這樣就會出現對應的 offload 資訊,而且輸出也快很多:
llm_load_tensors: ggml ctx size = 0.11 MB llm_load_tensors: using CUDA for GPU acceleration llm_load_tensors: mem required = 70.42 MB llm_load_tensors: offloading 32 repeating layers to GPU llm_load_tensors: offloading non-repeating layers to GPU llm_load_tensors: offloaded 35/35 layers to GPU llm_load_tensors: VRAM used: 4095.05 MB
玩了一下像是這樣:
Cosmopolitan 震惊到我了,
llamafile 跑起来效果如何,内存硬盘需求和 llama.cpp 是一致的么?