Mac上LLAMA2大語言模型安裝到使用

青塬科技發表於2024-03-07

LLAMA介紹

LLaMA是由Facebook的母公司Meta AI設計的一個新的大型語言模型。LLaMA擁有70億到650億個引數的模型集合,是目前最全面的語言模型之一。

Llama是目前唯一一個可以進行本地部署和本地訓練的大型模型,對各種提問有非常好的處理能力。非常適合個人和中小型企業,構建自己的大資料模型。

很多人都說是ChatGPT的平替。透過微調來滿足特定小眾行業的使用,將會在未來有非常大的潛力。

Mac上由於沒有Nvidia顯示卡的加持,無法配置CUDA進行深度學習。好在有大神製作了C++的庫,能實現小成本在低配Mac上跑模型的能力。

file

llama.cpp

是一個推理框架,在沒有GPU跑LLAMA時,利用Mac M1/M2的GPU進行推理和量化計算。

Mac跑LLAMA唯一的路。同樣也可以在Windows下面跑起來。

它是ggml這個機器學習庫的衍生專案,專門用於Llama系列模型的推理。llama.cpp和ggml均為純C/C++實現,針對Apple Silicon晶片進行最佳化和硬體加速,支援模型的整型量化 (Integer Quantization): 4-bit, 5-bit, 8-bit等。社群同時開發了其他語言的bindings,例如llama-cpp-python,由此提供其他語言下的API呼叫。

https://github.com/ggerganov/llama.cpp

安裝llama.cpp

本地快速部署體驗推薦使用經過指令精調的Alpaca-2模型,有條件的推薦使用6-bit或者8-bit模型,效果更佳。 下面以中文Alpaca-2-7B模型為例介紹,執行前請確保:
1、系統應有make(MacOS/Linux自帶)或cmake(Windows需自行安裝)編譯工具
2、建議使用Python 3.10以上編譯和執行該工具
3、必裝的mac依賴
xcode-select --install # Mac的Xcode開發者工具,基本是必裝的,很多地方都需要用到。
brew install pkgconfig cmake # c和c++的編譯工具。

1、原始碼編譯

git clone https://github.com/ggerganov/llama.cpp

2、編譯
對llama.cpp專案進行編譯,生成./main(用於推理)和./quantize(用於量化)二進位制檔案。

make

Windows/Linux使用者如需啟用GPU推理,則推薦與BLAS(或cuBLAS如果有GPU)一起編譯,可以提高prompt處理速度。以下是和cuBLAS一起編譯的命令,適用於NVIDIA相關GPU。

make LLAMA_CUBLAS=1

macOS使用者無需額外操作,llama.cpp已對ARM NEON做最佳化,並且已自動啟用BLAS。M系列晶片推薦使用Metal啟用GPU推理,顯著提升速度。只需將編譯命令改為:LLAMA_METAL=1 make,

LLAMA_METAL=1 make

3、檢查
編譯成功會在目錄下產生main等可執行的命令,下面轉換量化模型檔案時,會用到的命令就準備好了。

手動轉換模型檔案為GGUF格式

如果下載的是生成好的gguf模型就不需要手動轉換了。為啥要這個格式。這個格式的LLAMA.cpp才認。其它格式的資料不認。

1、下載 Llama 2 模型
首先,從 Hugging Face https://huggingface.co/meta-llama 上下載你想要使用的 Llama 2 模型,比如 7B-Chat,我的Mac是8G記憶體,M2晶片,估計也只能跑到這個模型,再大的機器跑不動。
值得一提的是:https://huggingface.co/meta-llama/Llama-2-7b-chat 下載時,第一次需要授權,需要到meta官網,下面這個連結
https://llama.meta.com/llama-downloads

去提交一下郵件。這裡選國家時會有意想不到的結果,自己思考一下。

如果要體驗英文原版,就用上面的,會比較麻煩,但是對英文的回覆比較好。
參考教程 https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/wiki/manual_conversion_zh

如果要使用中文語料庫,需要先合併為原始模型和中文的模型,再生成bin,再去轉換為gguf格式。喜歡折騰的可以試試。

如果要使用我這個中文混合模型,可以直接下載gguf格式。下面這幾步都不用了。省事多了。

下載地址:https://huggingface.co/hfl/chinese-llama-2-7b-gguf/tree/main
記得選ggml-model-q4_0.gguf這個模型。

2、下載 llama.cpp 庫,並按上面的流程進行編譯安裝成功

3、轉換模型格式
然後,你需要把模型的檔案轉換成 GGUF 格式,使用 llama.cpp 庫中的 convert.py 指令碼來完成。轉換時需要指定模型的路徑和上下文長度(模型可以處理的最大的文字長度),不同的模型可能有不同的上下文長度。

如果模型是 LLaMA v1,則使用 --ctx 2048,如果你的模型是 LLaMA v2,則使用 --ctx 4096。這裡使用 --ctx 4096。如下所示:

# 轉換模型檔案
python3 convert.py models/7B-Chat --ctx 4096

如果安裝過程缺python包直接pip install 安裝即可。

4、量化模型檔案

使用 llama.cpp 庫中的 quantize 程式來進行模型量化,使用 quantize 命令:

# 執行 quantize 程式,指定輸入和輸出的模型檔案和量化方式
./quantize ./models/7B/ggml-model-f16.gguf ./models/7B/ggml-model-q4_0.gguf q4_0

這樣,在 7B-Chat 資料夾中就生成一個 4 位整數的 GGUF 模型檔案。

5、執行模型

./main -m ./models/7B/ggml-model-q4_0.bin \
        -t 8 \
        -n 128 \
        -p 'The first president of the USA was '

# run the inference 推理
./main -m ./models/llama-2-7b-hf/ggml-model-q4_0.bin -n 128
#以互動式對話
./main -m ./models/llama-2-7b-hf/ggml-model-q4_0.bin --color -f prompts/alpaca.txt -ins -c 2048 --temp 0.2 -n 256 --repeat_penalty 1.3
#chat with bob
./main -m ./models/llama-2-7b-hf/ggml-model-q4_0.bin -n 256 --repeat_penalty 1.0 --color -i -r "User:" -f prompts/chat-with-bob.txt

此步驟過於煩鎖,主要是模型檔案佔了幾十GB。所以我直接下載別人的中文模型進行使用。不需要再手動進行轉換、量化等操作。

以WebServer形式啟動

呼叫手冊:https://github.com/ggerganov/llama.cpp/blob/master/examples/server/README.md

用WebServer形式。可以對接到別的系統裡面,像FastGPT或者一些介面上,就可以無縫使用了。

1、啟動server 引數請./server -h 檢視,或者參考手冊

./server --host 0.0.0.0 -m /Users/kyle/MyCodeEnv/models/ggml-model-q4_0.gguf -c 4096 --n-gpu-layers 1

預設會開到8080埠上,配置可改。不加gpu-layers走CPU,會報錯。設個1就行

2、用CURL進行測試

curl --request POST \
    --url http://127.0.0.1:8080/completion \
    --header "Content-Type: application/json" \
    --data '{"prompt": "給我講個冷笑話:","n_predict": 128}'

3、效果如圖
file

file
感覺 就是訓練的還是量少,有些問題會胡說。理解不了的問題反應會非常慢。會花很長的時間。

Python呼叫介面庫

https://github.com/abetlen/llama-cpp-python
https://llama-cpp-python.readthedocs.io/en/latest/install/macos/

1、Mac使用者,pip編譯,最簡
安裝llama-cpp-python (with Metal support)
為了啟用對於Metal (Apple的GPU加速框架) 的支援,使用以下命令安裝llama-cpp-python:
CMAKE_ARGS="-DLLAMA_METAL=on" FORCE_CMAKE=1 pip install llama-cpp-python

2、程式碼中使用,安裝好之後可以直接用requests呼叫。無需第1步的llama-cpp-python依賴包。使用通用的ChatGPT的問答形式回答。
也可以不經Server直接呼叫模型檔案

# -*- coding: utf-8 -*-
import requests

url = 'http://localhost:8080/v1/chat/completions'
headers = {
    'accept': 'application/json',
    'Content-Type': 'application/json'
}
dataEn = {
    'messages': [
        {
            'content': 'You are a helpful assistant.',
            'role': 'system'
        },
        {
            'content': 'What is the capital of France?',
            'role': 'user'
        }
    ]
}
data = {
    'messages': [
        {
            'content': '你是一個樂於助人的助手',
            'role': 'system'
        },
        {
            'content': '二戰是哪一年爆發的?',
            'role': 'user'
        }
    ]
}

response = requests.post(url, headers=headers, json=data)
print(response.json())
print(response.json()['choices'][0]['message']['content'])

3、直接呼叫模型檔案,需要安裝llama-cpp-python包

# -*- coding: utf-8 -*-
from llama_cpp import Llama

# 加截模型
# llm = Llama(model_path='/Users/kyle/MyCodeEnv/models/ggml-model-q4_0.gguf', chat_format="llama-2") # 可以指定聊天格式
llm = Llama(model_path='/Users/kyle/MyCodeEnv/models/ggml-model-q4_0.gguf')

# 提問
response = llm("給我講一下英國建國多少年了", max_tokens=320, echo=True)
# response = llm.create_chat_completion(
#     messages=[
#         {"role": "system", "content": "你是一個樂於助人的助手"},
#         {
#             "role": "user",
#             "content": "給我講一個笑話"
#         }
#     ]
# )
# print(response)

# 回答
print(response['choices'][0])

最後貼個官方的教程

https://llama-cpp-python.readthedocs.io/en/latest/install/macos/

再慢慢研究研究微調和訓練自己的語料吧。

跟上LLM的步伐。不接觸AI就要落後了。
更多精彩內容,請關注我的公眾號:青塬科技。

相關文章