[折腾]Anything+Ollama部署自己的大模型
本文记录在本地利用Ollama后端和AnythingLLM前端,部署自己私有化大模型的过程,方便日后查找。
采用docker镜像安装的形式,方便管理和版本更新。
一、前期准备
确保主机上安装有docker,且能正常访问docker hub官网(或者自行更改镜像源使用国内镜像站)。
Autogguf是写文档时使用的safetensor转gguf工具。工具有可能长久没有更新,不保证在工具之后的大模型可以被工具正确转换。
从docker hub处获得ollama和anythingllm的最新版本镜像。
1 | |
有些时候,主机是实验室服务器不太可能能直连外网,需要用自己的机器先下载好相关的镜像再上传。这里记录docker导出和导入镜像的两种方式。
1、镜像迁移
docker有两组指令用于容器与镜像的迁移工作,其中export和import用于容器的导出与加载,save和load用于镜像的导出与价值,注意不要混用两组指令。
这里我们只是用自己的机器下载了镜像,没有对原始镜像做修改,因此使用save和load命令组。下面的[image ID]自行修改为实际ID,[XXX]修改为任意名字均可。
1 | |
利用各种工具上传到服务器上后,利用load指令加载镜像。
1 | |
注意,load的镜像是没有对应的tag和repository名,需要手动重新指定。导入镜像时最好同时指定镜像名字,将来便于进行镜像的管理。
1 | |
二、启动镜像
anythingllm启动镜像,注意对于STORAGE_LOCATION变量的赋值,将来的聊天记录以及设置等等配置文件均会存放在宿主机的这个目录下。
1 | |
ollama启动镜像,注意-v参数后面的$HOME/ollama指定宿主机模型文件存放位置,/root/ollama是映射到容器内部的位置,稍后在这个目录下找到宿主机存放的模型文件。
1 | |
三、转化模型
Ollama使用onnx作为大模型推理后端,使用的模型文件格式为onnx定义的
gguf格式。一般从HuggingFace或者其他地方下载的是safetensor或者pt的pytorch保存格式。需要经过转化后才能正常使用。
- 选择已经量化好的模型下载也是一种途径。
- 其中使用ollama提供的指令来部署模型也是一种方案。优点是不需要自己去折腾模型格式转化的问题;缺点是个性化程度低。
这里选择Qwen2.5作为示例,主要是因为Qwen在阿里自家的modelscope(魔搭)社区上有全套,且服务器在国内,容易下载。本文找到魔搭一个用户,他制作一系列Qwen2.5的GGUF优化模型。并从中选择7B-GGUF-V3-LOT格式。文章很早开始写,但是写到一半发现新发布的deepseek火遍全球,这里火速改成deepseek蒸馏的Qwen作为教程。
打开链接会发现里面包含多个模型,这里简单介绍一下各个后缀的量化含义。首先模型的名字DeepSeek-R1-Distill-Qwen-7B,然后是字母数字和下划线构成的后缀。
后缀遵循特定的命名约定:“Q”+权重的精度(bit位数)+特定量化变体。以下举例各种后缀代表的含义。来源llama.cpp。
- 定义基础量化后缀
- F32:权重为32位浮点数
- F16:权重为16位浮点数
- Q4_0:代表第0种类型的4位量化,$w=d*q$,其中$d$是缩放因子。
- Q4_1:代表第1种类型的4位量化,$w=d*q+m$,其中$d$是缩放因子,$m$是一个量化块中最小的数字。
- 基于以上基础后缀组合
- K系列后缀
- 二重量化基础说明
- Q2_K:(1类型)对包含16个量化块的超级块进行2bit量化,每个量化块包含16个权重,块的$q$和$m$则是4bit。平均
2.5625bit每个权重参数。 - Q3_K:(0类型)对包含16个量化块的超级块进行3bit量化,每个量化块包含16个权重,块的$q$则是6bit。平均
3.4375bit每个权重参数。 - Q4_K:(1类型)对包含8个量化块的超级块进行4bit量化,每个量化块包含32个权重,块的$q$和$m$则是6bit。平均
4.5bit每个权重参数。 - Q5_K:(1类型)类似
Q4_K,平均5.5bit每个权重参数。 - Q6_K:(0类型)对包含16个量化块的超级块进行6bit量化,每个量化块包含16个权重,块的$q$则是8bit。平均
6.5625bit每个权重参数。 - Q8_K:(0类型)相比
Q8_0量化,块大小变成256,且所有的点积结果都被量化到2-6bit。
- Q2_K:(1类型)对包含16个量化块的超级块进行2bit量化,每个量化块包含16个权重,块的$q$和$m$则是4bit。平均
- 基于K系列后缀的混合量化说明issue1684
- LLM-Q2_K:用
Q4_K量化attention.wv和feed_forward.w2,其余部分用Q2_K进行量化。 - LLM-Q3_K_S:使用
Q3_K量化所有张量。 - LLM-Q3_K_M:用
Q4_K量化attention.wv,attention.wo和feed_forward.w2,其余部分用Q3_K量化。 - LLM-Q3_K_L:用
Q5_K量化attention.wv,attention.wo和feed_forward.w2,其余部分用Q3_K。 - LLM-Q4_K_S:使用
Q4_K量化所有张量。 - LLM-Q4_K_M:使用
Q6_K量化attention.wv和feed_forward.w2一半的张量,其余部分用Q4_K。 - LLM-Q5_K_S:用
Q5_K量化所有张量。 - LLM-Q5_K_M:使用
Q6_K量化attention.wv和feed_forward.w2一半的张量,其余部分用Q5_K。 - LLM-Q6_K:使用6bit的
Q8_K量化所有权重。
- LLM-Q2_K:用
- 二重量化基础说明
- IQ系列,带重要性矩阵的量化SOTA 2-bit quants by ikawrakow · Pull Request #4773 · ggerganov/llama.cpp · GitHub
- K系列后缀
四、配置调试
配置期间可能需要启动多个终端以同时开展多个工作,这里记录下如何在一个容器内启动多个终端的方法。
1 | |