书接上回(传送门)。公司的AI助手已经启用了一段时间。但普遍反映回答问题不够准确,经过多方查找,发现是大模型的原因。
因为服务器配置不高,之前配置的qwen2.5已经由7b降到了3b,3b的千问用chat还好,但在使用embedding时,检索出的数据命中率实在是惨不忍睹,连0.5都达不到。无奈之下,只好寻找精度更高一些的embedding模型了。在huggingface中文榜单里多方对比,最终决定使用TencentBAC/Conan-embedding-v1这个大模型,主要指标Retrieval Average (8 datasets)的排名也非常靠前!
但,还是要说但是,ollama和Xinference都没办法直接调用Conan-embedding-v1,好在这两个框架都支持从外部自定义导入大模型。于是,曲折的安装之路开始了~
1、在ollama上安装并使用Conan-embedding-v1
因为HuggingFace上并不会直接提供GGUF文件,所以需要把HuggingFace下载的模型文件用ollama的转化程序进行转化。
1.1 从HuggingFace下载Model
首先在hf的个人设置页面找到“Access Tokens”,新建一个ACCESS_TOKEN
(说明文档),然后用huggingface_hub的snapshot_download下载模型:
!pip install huggingface_hub
新增一个python文件并执行。python文件内容如下:
from huggingface_hub import snapshot_download
model_id = "TencentBAC/Conan-embedding-v1" # hugginFace's model name
snapshot_download(
repo_id=model_id,
local_dir="Conan-embedding-v1",
local_dir_use_symlinks=False,
revision="main",
use_auth_token="<YOUR_ACCESS_TOKEN>")
1.2 安装转化程序
首先克隆llama.cpp库到本地(服务器)某个目录下
git clone https://github.com/ggerganov/llama.cpp.git
【可选步骤】使用conda新建一个虚拟环境(也可跳过这一步,直接用系统环境)
conda create -n llama-env python=3.11.0
conda activate llama-env
进入下载的llama.cpp目录,安装相应的库
pip install -r requirements.txt
1.3 修改文件
根据博主hawk2014bj
的说法,Embedding 分词器和LLM不太一样,从Conan-embedding-v1模型的分词配置中可以看到它使用的是BertTokenizer
,所以需要指定WordPiece分词器。
如果直接转化下载下来的模型,会报错。因此要修改llama.cpp根目录下的convert_hf_to_gguf_update.py
文件,对模型进行配置。找到文件中第六十多行 # TODO: add models here, base models preferred
,在后边的 models = [ ]
括号中增加一行:
{ "name": "conan-embedding-v1", "tokt": TOKENIZER_TYPE.WPM, "repo": "https://huggingface.co/TencentBAC/Conan-embedding-v1", },
命令行登入huggingface:huggingface-cli login
在llama.cpp下执行update脚本(需要将下面命令中的<huggingface_token>
替换为步骤1.1中从huggingface中获取的“Access Tokens”):
python convert-hf-to-gguf-update.py <huggingface_token>
另外:如果不想去huggingface拿token,还有一种方法是忽略这一步,先执行步骤1.4中的转化命令。转化过程中会报错,日志中会显示出chkhsh
的值。将这个值复制下来,进入convert_hf_to_gguf.py
文件,搜索def get_vocab_base_pre(self, tokenizer)
这个方法,仿照其他if
条件的格式,把复制下来的这个chkhsh
值作为一个分支增加到此方法中。
1.4 模型转化及量化
使用步骤1.2目录下的convert_hf_to_gguf.py
脚本把步骤1.1下载的模型转化为GGUF
格式
python llama.cpp/convert_hf_to_gguf.py /root/模型生成的目的路径/xxx/ --outfile Conan-embedding.gguf(自定义模型文件名)
【可选步骤】成功生成模型文件后,按照指定精度对模型进行量化,以便在较低的GPU环境运行(参数1:原模型路径+名称;参数2:量化后的模型路径+名称;参数3:量化精度)
llama.cpp/quantize Conan-embedding.gguf Conan-embedding-q4_0.gguf -q4_0
关于量化精度的取值,可参考这篇文章。
1.5 模型创建及运行
创建Modelfile文件,文件内容如下(替换为要使用的模型路径及名称):
FROM ./Conan-embedding-q4_0.gguf
在 Ollama 中创建模型
ollama create conan -f ./Modelfile
这里我给模型起的名字是conan,也可换为其他名字。之后运行模型
ollama run conan
但是!这里我还要说但是!虽然上述步骤都顺利完成,在最后运行时,我的系统仍然报错了,最后还是无法运行!
Error: conan does not support generate
之后查阅了多篇资料,仍然没有找到相关的解决方案,只能放弃ollama框架。这才有了接下来的Xinference!
2、在Xinference上安装并使用Conan-embedding-v1
2.1 模型下载及安装
可参考前篇文章的说明,从魔搭社区下载模型。
模型地址:https://www.modelscope.cn/models/model1001/Conan/summary
2.2 注册模型
因为Conan-embedding-v1并没有在Xinference官方的内置模型列表中,第一次运行的时候报错了,未能成功运行。绝望之时查看官方文档,才发现如果是自定义模型,还需要额外注册一下,才可以运行。
首先在某个路径增加下面的一个.json文件:
{
"model_name": "Conan-embedding-v1",
"dimensions": 1792,
"max_tokens": 512,
"language": ["en", "zh"],
"model_id": "model1001/Conan",
"model_uri": "file:///path/to/Conan-embedding-v1"
}
官网给出的字段说明:
- model_name: 模型名称。名称必须以字母或数字开头,且只能包含字母、数字、下划线或短划线。
- dimensions: 表示 embedding 维度的整型值。
- max_tokens: 表示 embedding 模型支持的最大输入序列长度的整型值。
- model_lang: 一个字符串列表,表示模型支持的语言。例如:[‘en’],表示该模型支持英语。
- model_id: 一个表示模型标识的字符串,类似 HuggingFace 或 ModelScope 使用的标识符。
- model_uri: 表示模型的 URI 的字符串,例如 “file:///path/to/llama-2-7b”。如果模型 URI 不存在,Xinference 将尝试使用 model_id 从 HuggingFace 或 ModelScope 下载模型。
使用命令注册模型(注意将model.json改名,并设置为正确的路径)
xinference register --model-type embedding --file model.json --persist
2.3 启动模型
自定义的模型在注册后,可进入web版的Xinference前端查看。
也可通过命令行进行启动:
xinference launch --model-name Conan-embedding-v1 --model-type embedding --model_path /usr/share/xinference/models/Conan-embedding-v1 --gpu-idx 0 --model-format pytorch
参考文档
- Ollama 自定义导入模型 - https://github.com/datawhalechina/handy-ollama/blob/main/docs/C3/1.%20%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%BC%E5%85%A5%E6%A8%A1%E5%9E%8B.md
- How to convert HuggingFace model to GGUF format - https://github.com/ggerganov/llama.cpp/discussions/7927
- llama.cpp量化部署 - https://github.com/ymcui/Chinese-LLaMA-Alpaca/wiki/llama.cpp%E9%87%8F%E5%8C%96%E9%83%A8%E7%BD%B2
- HuggingFace Embedding 转为 Ollama Embedding - https://blog.csdn.net/hawk2014bj/article/details/142265387
- ollama把huggingface下载下来的模型转换为gguf - https://blog.csdn.net/abments/article/details/138898466
- Xinference的自定义模型 - https://inference.readthedocs.io/zh-cn/latest/models/custom.html#
- 如何对应 UI 界面运行模型和 xinference launch 运行模型的参数 - https://github.com/xorbitsai/inference/issues/2097