在ollama和Xinference上使用最新的Conan-embedding-v1

软硬通吃 · 10-19 · 256 人浏览

书接上回(传送门)。公司的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

参考文档

AI 知识库 模型
京ICP备2023019113号-1 ◎ Theme by Jasmine