
记一次本地离线部署MaxKB
前言
第一次完全离线部署一个东西,遇到很多以前从来没遇到的问题。离线部署难度真的比在线部署难度大好多😖但是经过一段时间的尝试最后还是成功了。
部署LLM
MaxKB作为一个LLM RAG的工具,在部署它之前肯定是要先部署一个运行LLM的工具。这里部署了较为常用的Ollama。为了更方便和高效地调用显卡,我把Ollama部署在了Windows上。
下载Ollama
直接从官网下载。
部署模型
一般在线部署只需要 ollama run qwq
之类就好了,但是离线部署是无法直接拉取模型的。看了教程都说是要先从HuggingFace下载模型文件,然后按照Ollama官网写好模型配置。但是我发现qwq
以及更大的模型,它们在HuggingFace上都不是以单个模型文件的方式呈现的,而是很多模型文件。我不知道这种模型文件怎么合并,但是我想到一种更简单的方法,我找到了Ollama存储模型的位置,就在 $USER$/.ollama
,从有网的电脑上面进行ollama pull
之后直接把.ollama
文件夹复制到离线的服务器上面即可。
模型选择
模型选择方面,由于服务器上使用了NVDIA A10
GPU,显存只有24
GB,只能运行较小的模型,所以主要的LLM考虑选择了较小参数量的模型。Aliyun的QwQ
推理模型在较小参数量的前提下拥有超过GPT4o
和Claude 3.5 Sonnet
的性能,甚至接近o1-preview
,所以最终选择了这个模型作为语言模型。图像识别模型选择了LLaMA
,embedding模型选择了表现不错的bge-large
。
部署Docker
MaxKB官方只提供了Docker部署方式,所以想部署MaxKB需要先部署Docker。一开始的打算是先下载好WSL2更新包之后安装,然后使用Docker Destop部署Docker。但是Docker Destop一直提示需要运行wsl --update
,但是因为没有网络所以一直无法运行。所以考虑将Docker Desktop卸载后用回更熟悉的Linux上的Docker。先安装了ArchWSL,然后离线部署了Docker。
下载
Docker离线包可以从这里下载。
解压/部署
tar xzvf docker-x.x.x-ce.tgz
cp docker/* /usr/bin/
配置开机启动
nano /usr/lib/systemd/system/docker.service
输入以下内容:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
启动dockerd服务进程
systemctl daemon-reload
systemctl start docker.service
部署MaxKB
这部分就比较简单,MaxKB官方提供了一键部署包,直接使用一键部署包就部署成功了。
tar -zxvf maxkb-v1.x.x-offline.tar.gz
# 进入安装包解压缩后目录
cd maxkb-v1.x.x-offline
# 执行安装命令
bash install.sh
即可。
MaxKB连接Ollama
这一部分花费的世界也比较长。本来以为直接使用127.0.0.1
即可连接,但是由于服务器端Windows版本较低,并不支持镜像网络。然后使用cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'
获取到WSL中的Windows IP之后发现仍然无法连接。折腾了一段时间之后发现是策略中11434端口没有开放。开放后即可正常连接。
然后在MaxKB中添加了QwQ
,bge-large
等等提前部署好的模型,测试发现可以正常使用。
将MaxKB开放给内网中其他用户
本以为直接用服务器的内网IP:端口即可访问,但是却发现只能访问直接运行在Windows上面的服务,运行在WSL中的服务无法访问。最后使用了Windows的端口转发实现了外部访问MaxKB。
netsh interface portproxy add v4tov4 listenaddress=[localaddress] listenport=[localport] connectaddress=[destaddress]
到这一步部署过程基本可以说是完成了。
看起来过程并不复杂,但是其实过程中有很多试错的经过,花费了不少时间才部署成功。