用筆電就能跑 LLaMA ! llama.cpp 教學
更新: 11/02/2024
隨著人工智能的快速發展,大型語言模型(LLM)如 Llama 2, 3 已成為技術前沿的熱點。然而,Llama 2 最小的模型有7B(Llama 3 最小為 8B),需要 14G 左右的記憶體,這不是一般消費級顯卡跑得動的,因此目前有很多方法在研究如何減少其資源使用,例如 llama.cpp,號稱可以樹莓派上進行推理; 還有 pyllama 等。經過處理,最低只用 4G 的 RAM 就可以推理。
這篇文章將向你展示如何使用 llama.cpp 量化模型並架設 server,使用你專屬的 LLM。
步驟1. clone llama.cpp 專案
把 llama.cpp 的 repo clone 下來
git clone https://github.com/ggerganov/llama.cpp.git
步驟2. 使用 Makefile 進行編譯
使用 make
對 llama.cpp 專案進行編譯,過程中會生成
- ./main:用於推理
- ./quantize:用於量化二進位檔案
上述的方式只能使用 CPU 運行,如果你要使用 GPU:
- Windows/Linux用戶:建議與BLAS(或cuBLAS如果有GPU)一起編譯,可以提高prompt處理速度
make GGML_CUDA=1 # LLAMA_CUBLAS 已棄用
- macOS用戶:無需額外操作,llama.cpp已對ARM NEON做優化, 並且已自動啟用BLAS。 M系列晶片建議使用Metal啟用GPU推理,顯著提升速度。
LLAMA_METAL=1 make
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
如果 make
時遇到以下錯誤:
: not foundld-info.sh: 2:
: not foundld-info.sh: 4:
: not foundld-info.sh: 9:
scripts/build-info.sh: 31: Syntax error: end of file unexpected (expecting "then")
make: *** [Makefile:676: common/build-info.cpp] Error 2
這是由於檔案結尾字元不一樣導致,wins Git clone下載得到資料夾(CRLF)後,上傳至 linux 系統中(LF),便會造成這種錯誤,可以使用以下方式修復:
sudo apt install dos2unix
find -type f -print0 | xargs -0 dos2unix
步驟4. 準備環境
建議使用 conda 來管理
conda create --name llamaCpp python=3.9
conda activate llamaCpp
python3 -m pip install -r requirements.txt
步驟5. 量化模型
使用 convert.py
來對模型進行量化。這邊示範如何把 Llama2-chat 7B 量化:
a). 下載 meta Llama 27B chat
這邊可以參考我之前的文章,你也可以依照你的需求下載 Llama 3。假設你照著我之前的做法做,那麼你會有一個 clone 下來的 llama 專案,並且裡面載了 llama-2–7b-chat/,看一下這個資料夾中有哪些檔案:
b). 使用 convert-hf-to-gguf.py 轉換為 GGUF 格式
llama.cpp 能夠執行的模型文件格式被稱為 GGUF 格式。可以使用 llama.cpp 提供的 convert-hf-to-gguf.py
工具,來將 llama-2–7b-chat 模型轉換為 GGUF 格式。
convert-hf-to-gguf.py
已經在上面準備環境的步驟中安裝,因此只需要執行以下指令。
註:舊版 llama.cpp 使用convert.py
- 注意要使用
— vocab-dir
來指定 tokenizer.model 的位置,如果沒有指定會遇到 ErrorFileNotFoundError: spm tokenizer.model not found.
- 使用
--outtype
參數來決定資料的型態,一般來說會自動偵測可以不指定。!注意這不是量化 - 使用
— outfile
來指定轉換後模型的位置
cd llama.cpp
python3 convert-hf-to-gguf.py models/llama-2-7b-chat --vocab-dir ../llama --outtype fP16
--outfile models/llama-2-7b-chat/llama-2-model.gguf
執行後我遇到一個 Error:
ValueError: The model's vocab size is set to -1 in params.json. Please update it manually. Maybe 32000?
這個問題需要改 llama-2–7b-chat/ 中的 params.json
,將 vocab_size 從 -1 改成 32000。
{"dim": 4096, "multiple_of": 256, "n_heads": 32, "n_layers": 32, "norm_eps": 1e-06, "vocab_size": -1} # 原始
{"dim": 4096, "multiple_of": 256, "n_heads": 32, "n_layers": 32, "norm_eps": 1e-06, "vocab_size": 32000} # 更改
再執行一次:
python3 convert.py models/llama-2-7b-chat --vocab-dir ../llama --outtype fP16
--outfile models/llama-2-7b-chat/llama-2-model.gguf
便會在 — outfile
中生成 llama-2-model.gguf。
c). 使用 llama-quantize 進行量化
使用 ./llama-quantize 可以對模型進行量化,可以選擇的量化尺度有: 8-Bit、6-Bit 到 2-Bit 都可以進行。使用方法如下:
註:舊版 llama.cpp 使用 quantize
./llama-quantize models/llama-2-7b-chat/llama-2-model.gguf models/llama-2-7b-chat/llama-2_q4.gguf Q4_K
檔案大小由原始的12.5 GB 變成 Q8: 6.66 GB;Q4: 3.79 GB。若不想要量化,網路上滿多已經幫你做好的量化模型,可以下載直接使用。
步驟6. 載入模型
之後便可以使用 llama.cpp 的 llama-cli,來做一些最基礎的用法:
註:舊版 llama.cpp 使用 main
./llama-cli -m models/llama-2-7b-chat/llama-2_q4.gguf --color -f prompts/alpaca.txt -ins -c 2048 --temp 0.2 -n 256 --repeat_penalty 1.3
./llama-cli -m models/llama-2-7b-chat/llama-2_q4.gguf -n 256 --repeat_penalty 1.0 --color -i -r "User:" -f prompts/chat-with-bob.txt
-c
控制上下文的長度,數值越大越能參考較長的對話歷史,default=512-f
指定prompt模板-n
控制回復產生的最大長度,default=128-b
控制batch size,default=512-t
控制線程數量,default=8— repeat_penalty
控制中對重複文字的懲罰力度— temp
溫度係數,數值越低迴復的隨機性越小,反之越大— top_p
,top_k
控制解碼取樣的相關參數-m
指定模型路徑-ngl
指定 GPU 讀取層數
步驟7. 伺服器 server
llama.cpp 也提供架設 server 的功能,通過 HTTP API 來存取模型,只要使用./llama-server
就可以快速架設,預設會在 http://127.0.0.1:8080/
開啟一個 LLM Service,參數的部分與 .main/
差不多,也可以進到 server 再調整。
註:舊版 llama.cpp 使用server
./llama-server -m models/llama-2-7b-chat/llama-2_q4.gguf -ngl 100 #使用 GPU 版