在定這個文章標題的時候,我也是很困惑。我另外也想定成 pytorch 模型轉成 gguf,總之就是要轉成可以量化的模型。gguf 檔應該是由 meta 所制定的,因為需要由 llama.cpp 這個專案來轉換。
轉成 gguf 的好處,就是其支援了量化的功能,可以大量的減少推論時佔用的記憶體。一般就是轉換成 8bit, 4bit, 2bit 甚至有 1bit 的,從通義千問的模型說明來看,轉換成4bit對跑分的影響,應該就在 1~2%之間,但可同比的降低記憶體的需求。
本文主要是參考這裡,其標題就是將 huggingface 模型轉成 gguf。
下載編譯 llama.cpp
下載與編譯指令如下
1 2 3 4 5 6 7 8 9 |
conda create -n llama.cpp python=3.10 conda activate llama.cpp git clone https://github.com/ggerganov/llama.cpp.git pip install -r llama.cpp/requirements.txt cd llama.cpp mkdir build cd build cmake .. cmake --build . --config Release |
這樣可以下載基本的先在模型轉化成 fp16 和 int8 的工具,後續再轉化成其它更小的參數。
範例1: 轉換 llama3 8b instruct
假設目前的目錄就llama.cpp.git/build下面,用下面指令來下載 llama3 的模型。此處的下載源是中國 (Great China) 的 modelscope,這樣就不用進行註冊的動作,比較方便。
1 |
git clone https://www.modelscope.cn/LLM-Research/Meta-Llama-3-8B-Instruct.git |
然後先將其轉換成 fp16 的格式,再轉成 4bit 格式。
1 2 |
python ../convert-hf-to-gguf.py Meta-Llama-3-8B-Instruct/ --outfile llm3-8b.gguf --outtype f16 bin/quantize llm3-8b.gguf llm3-8b-q4_0.gguf q4_0 |
範例2: 轉換 QWEN 1.8B
基本上是一樣的指令, 只是修改了下載的路徑和檔名。
1 2 3 |
git clone https://huggingface.co/Qwen/Qwen1.5-1.8B python ../convert-hf-to-gguf.py Qwen1.5-1.8B/ --outfile qwen.gguf --outtype f16 in/quantize qwen.gguf qwen_q4_0.gguf q4_0 |
導入 Ollama
取得所需要的 llm gguf 檔後,下一步就是要將其匯入 Ollama 中。匯入 Ollama 時,需要先編寫一個Modelfile 來讓 Ollama 知道怎麼使用這個模型。Llama3 的 modelfile 如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Modelfile generate by "ollama show" # To build a new Modelfile based on this, replace FROM with: # FROM llama3-chat-8b-chinese.gguf:latest FROM /usr/share/ollama/.ollama/models/blobs/sha256-2146687a065401f0331b1599e2d139b65b352758fb91830d8847b1705b2519a2 TEMPLATE "{{ if .System }}<|start_header_id|>system<|end_header_id|> {{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|> {{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|> {{ .Response }}<|eot_id|>" PARAMETER num_keep 24 PARAMETER stop <|start_header_id|> PARAMETER stop <|end_header_id|> PARAMETER stop <|eot_id|> |
QWen 的 modelfile 如下
1 2 3 4 5 6 7 8 9 10 11 12 |
# Modelfile generate by "ollama show" # To build a new Modelfile based on this, replace FROM with: # FROM qwen:14b-chat-v1.5-q4_K_M FROM /usr/share/ollama/.ollama/models/blobs/sha256-1e3212e3c496e2519ede52ed6df6b33b0234b4e5982ff3fba4a722656d3e2d3a TEMPLATE "{{ if .System }}<|im_start|>system {{ .System }}<|im_end|>{{ end }}<|im_start|>user {{ .Prompt }}<|im_end|> <|im_start|>assistant " PARAMETER stop <|im_start|> PARAMETER stop <|im_end|> |
將上面的當案依據自己模型的種類,存到一個 modelfile.txt,並將裡面的 FROM 後面的檔案改成你的 gguf,再用以下命令來創建一個新的 ollama 模型。這樣就可以創建出一個自己的模型了。
1 |
ollama create myllm -f modelfile.txt |
取得 modelfile 內容
modelfile 的內容,看的出來是該模型訓練時所使用的一些 keyword。為了取得方便,我都是先到 ollama library 拉下該類的模型,再將其 modelfile 印出,指令如下。
1 |
ollama show OLLAMA_MODEL --modelfile |
這似乎是有點蛋生雞,雞生蛋的感覺。modelfile 當然也可以由自己來撰寫,但是要瞭解該模型訓練時所用的參數,這顯然不是我在行的,所以現在我也只能拿 ollama 支援的模型來使用。
用途
由於本文介紹的內容,只能套用在 ollama library 已提供的模型上,這似忽沒什麼用。但主要可用的地方,還是在於從 huggingface 拉下未量化的模型,經微調後再放上自己的 ollama 做使用。
若有更進一步的需要,讀者可以學習一下怎麼撰寫 ollama 的 modelfile 來套用新的大模型語言上。
參考
本文參考這裡