Skip to content

OLlama模型转换和量化

使用Ollama 对语言模型进行转换和量化(PyTorch 和 Safetensors)

主要链接

Ollama 使用了 llama.cpp 这个库,所以更多的文档要查看 llama.cpp 的文档

1. 准备

Ollama 文档中的环境配置教程 其实 很简单,即创建好一个Python 环境用于 Lama.cpp

git clone [email protected]:ollama/ollama.git ollama
cd ollama

conda create -n ollama python=3.9
conda activate ollama
pip install -r llm/llama.cpp/requirements.txt

make -C llm/llama.cpp quantize

2. 开始转换

这里以 联通Llama3 8B 模型为例子,我下载它花了很大的功夫,导致我下载失败出错好几遍,最好还是手动下载并检查哈希值才成功下载下来。

联通Llama3 8B:https://huggingface.co/UnicomLLM/Unichat-llama3-Chinese-8B

他这里主要使用了 llama.cpp llama.cpp/convert.py 这个脚本,这个脚本的作用是将 Llama 的模型转化为 GGML 文件。

python llm/llama.cpp/convert.py <从抱脸下载的文件目录>  --outtype f16 --outfile converted.bin --vocab-type bpe

这里需要注意的是,这里相对于官方默认的参数添加了 --vocab-type bpe ,llama.cpp/issues/6775 可以找到相关问题的讨论

3. 量化

量化是为了减小模型,但是会减低性能,非必须

llm/llama.cpp/quantize \
converted.bin \
quantized.bin q4_0

4. 创建Modelfile

创建一个 Modelfile 文件用来转换成 ollama 模型

touch ModeFile
nano ModeFile

FROM converted.bin
#TEMPLATE "[INST] {{ .Prompt }} [/INST]"
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|>"

这只是个比较基础的配置文件,实际上部分模型对参数比较敏感,必须补充全参数才可以工作的很好。

5. 生成模型

ollama create unichat-llama3-chinese-8b -f Modelfile

下面可以将自己制作的模型发布到 ollam 社区