前言

第一次完全离线部署一个东西,遇到很多以前从来没遇到的问题。离线部署难度真的比在线部署难度大好多😖但是经过一段时间的尝试最后还是成功了。

部署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,显存只有24GB,只能运行较小的模型,所以主要的LLM考虑选择了较小参数量的模型。Aliyun的QwQ推理模型在较小参数量的前提下拥有超过GPT4oClaude 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中添加了QwQbge-large等等提前部署好的模型,测试发现可以正常使用。

将MaxKB开放给内网中其他用户

本以为直接用服务器的内网IP:端口即可访问,但是却发现只能访问直接运行在Windows上面的服务,运行在WSL中的服务无法访问。最后使用了Windows的端口转发实现了外部访问MaxKB。

netsh interface portproxy add v4tov4 listenaddress=[localaddress] listenport=[localport] connectaddress=[destaddress]

到这一步部署过程基本可以说是完成了。

看起来过程并不复杂,但是其实过程中有很多试错的经过,花费了不少时间才部署成功。