Ollama 导入自定义模型

在前面 Spring AI 使用本地 Ollama Embeddings 中查找 Embedding 模型的时候,首先看到了 mofanke/dmeta-embedding-zh 模型,这才发现 Ollama 中除了官方模型外还有用户自己上传的其他模型,搜索 dmeta-embedding-zh 找到了抱脸网上的对应模型:

https://huggingface.co/DMetaSoul/Dmeta-embedding-zh

探索发现

模型介绍有 MTEB Chinese list 评分排名,打开该地址可以看到排名:

https://huggingface.co/spaces/mteb/leaderboard

在最新排名中第一的 acge_text_embedding 能不能在 Spring AI 中使用呢?在 Ollama 中搜索这个模型没有找到,然后就开始搜索如何在 Ollama 中使用自定义模型,然后找到了官方文档。

查找资料

Ollama 官方的文档都在 github 仓库中,有一篇 Import a model 文档介绍如何导入自定义的模型:
https://github.com/ollama/ollama/blob/main/docs/import.md

在 [[👌002.谷歌 Colab:学习 Python 和大模型的利器]] 中介绍了谷歌 Colab,使用 Colab 非常方便,可以很快速的下载模型和执行代码(如果无法访问也可以调整命令在本地执行)。

我使用谷歌在线的 Gemini,让他根据 Import a model 文档给我生成 python 的 notebook 代码。

生成如下结果:

在分享和导出按钮中可以选择【导出到Colab】:

经过一番操作之后,遇到了各种错误,最终失败。

寻求帮助

既然有人可以将类似 pytorch_model.bin 转换成功,说明路是通的,遇到的具体的 python 问题 AI 也无法帮我解决,因此从 mofanke/dmeta-embedding-zh 模型入手,搜索作者的信息找到了 github,找到了作者 2018 年还在更新的博客: https://mofanke.github.io/ ,在博客关于我中找到了作者的邮箱,然后给作者发邮件寻求帮助:

同时还添加了 huggingface 上原模型作者的微信,寻求作者的帮助。

很幸运的是我收到了他们的回应,和原作者沟通时可能是我表达的不准确,原作者最终也提供了一份支持 Ollama 使用的模型:

https://ollama.com/shaw/dmeta-embedding-zh
大家也可以试试上面的模型。

mofanke 在回复的邮件中指出要修改一处代码,修改代码如下:

除此之外我还遇到了依赖版本的问题,修改了几处版本号,然后就转换成功了,下载到本地进行测试也很顺利。

Colab 转换模型

在写转换代码时,一开始以 Google Gemini 生成的为基础来写,发现要改的地方太多,脚本也写的很复杂,所以我就从源头出发,直接 Fork https://github.com/ggerganov/llama.cpp 进行了修改。可以从 https://github.com/abel533/llama.cpp/tree/b2581 (b2581分支)下载修改后的版本,改动可以查看提交历史。

这样改动之后的最终脚本从满满的几页变成了短短的几行:

1
2
3
4
5
6
7
8
# 下载源码
!git clone -b b2581 https://github.com/abel533/llama.cpp.git
%cd llama.cpp
# 安装依赖,安装完不用选择重启
!pip install -r requirements.txt
# 编译
!make -C ./ quantize
!git lfs install

上面代码是准备环境,执行过程中会出现如下提示,选择【取消】:

下面是下载模型并进行转换,这部分可以多次执行:

1
2
3
4
5
6
# 下载模型
!git clone https://huggingface.co/aspire/acge_text_embedding model
# 转换模型
!python convert-hf-to-gguf.py ./model --outtype f16 --outfile converted.bin
!./quantize converted.bin quantized.bin q4_0
# 下载 quantized.bin 到本地

上面代码是转换 acge_text_embedding,后来看到 Dmeta 模型作者又发布了新的轻量版本:

我又针对这个版本转换进行测试:

1
2
3
4
5
6
# 下载模型
!git clone https://huggingface.co/DMetaSoul/Dmeta-embedding-zh-small dmetasoul
# 转换模型
!python convert-hf-to-gguf.py ./dmetasoul --outtype f16 --outfile dmetasoul-converted.bin
!./quantize dmetasoul-converted.bin dmetasoul-quantized.bin q4_0
# 下载 dmetasoul-quantized.bin 到本地

Ollama 导入模型

上面转换后的模型可以从 Colab 下载下来,下载后放到一个任意目录中,在目录中创建 Modelfile,编写内容如下:

1
2
FROM quantized.bin
TEMPLATE """{{ .Prompt }}"""

由于 Embedding 模型无法进行对话,这里 TEMPLATE 的内容对使用没有任何影响。

在模型和 Modelfile 的目录下面打开终端,输入下面的命令创建模型:

1
ollama create acge_text_embedding -f Modelfile

默认会自动添加到 .ollama 目录下面,后续就可以参考 Spring AI 使用本地 Ollama Embeddings 中介绍的方式进行使用了。

本文内容经历一番波折,最终得到了这8,9行代码,越少越难得。


Ollama 导入自定义模型
https://blog.mybatis.io/post/dd562857.html
作者
Liuzh
发布于
2024年6月26日
许可协议