Ollama 是基于 LlamaCpp 开发的 CPU 上的推理引擎,通过 LlamaCpp 提供的脚本可以将大语言模型装换为 gguf 的二进制跟是文件,从而通过 Ollama 就行推理。Ollama 支持HuggingFace 大多开源模型,例如 Llama、Qwen、Gemma 和 Phi3 等等。
GGUF 是一个二进制格式,目标是将所有模型相关文件组装成为单个文件易于传输和管理。HuggingFace 通常使用的是 Pytorch 的 bin 格式或者是 Safetensors 格式,对于大语言模型转换比较简单,做好相应的 ChatTemplate 配置既可。
本文主要是讲述如果转换 Embedding Model,Embedding 也是基于 Transformer 框架的,但是 Embedding 分词器通常和 LLM 不太一样,在转换是我们需要进行调整。本文转换的是腾讯的 Embedding 模型,Conan-embedding-v1 目前这个模型在 MTEB 上综合排名第一。
首先,看一下模型的分词配置,使用的 BertTokenizer,需要模型并指定 WordPiece 分词器。
如果直接使用 LlamaCpp 的转换程序进行,转换会报如下错误。
NotImplementedError: BPE pre-tokenizer was not recognized
需要在 convert_hf_to_gguf_update.py 中配置模型
{"name": "conan-embedding-v1", "tokt": TOKENIZER_TYPE.WPM, "repo": "https://huggingface.co/TencentBAC/Conan-embedding-v1", },
下载模型,并在模型的目录下运行转换命令
python ../llama.cpp/convert_hf_to_gguf.py --outtype q8_0 .
模型配置文件
FROM ./Conan_Embedding_V1-324M-Q8_0.gguf
编译模型,模型编译完成之后,使用 Ollama 客户端调用模型
ollama build -f conan
总结
Ollama 使用时要特别注意分词器和 ChatTemplate, 否则对于语言模型输出结果会产生异常,对于 Embedding 模型会出现转换错误。