本地部署大模型

系统:ubuntu 128h256g

显卡:4090D(48G) *2

llm模型:QwQ-32B-AWQ

模型说明评价
DeepSeek-R1-Distill-Qwen-32B-Int4-W4A16Deepseek的32B,4bit量化版70token/s,准确率很低,没法用
QwQ-32B-AWQQwQ的32B,4bit量化版速度非常快单用户70token。多用户并发300无压力,准确率不低,就是思考内容过多
QwQ-32BQwQ的8bit版本25token/s,准确率高
DeepSeek-R1-Distill-Qwen-32BDeepseek的32B,8bit量化25token/s,准确率高
Deepseek-R1 70B70B版本没法用,10token/s

这里也测试了几款不同的模型,效果如上,最终还是选择了准确率高的,速度快的QwQ-32B-AWQ。过度思考的问题还需要解决

embedding模型:bge-m3

rerank模型:bge-reranker-v2-m3

1、基础环境

安装docker && docker compose

推荐直接安装1panel,https://1panel.cn/
会自动安装好docker和docker compose环境

验证是否安装成功
(base) root@ubuntu:~# docker --version
Docker version 28.0.1, build 068a01e
(base) root@ubuntu:~# docker compose version
Docker Compose version v2.33.1

docker代理设置

编辑daemon.json文件添加以下内容

vi /etc/docker/daemon.json

{
    "dns": [
        "8.8.8.8",
        "233.5.5.5"
    ],
    "log-driver": "json-file",
    "log-opts": {
        "max-file": "3",
        "max-size": "10m"
    },
    "proxies": {
        "http-proxy": "http://10.0.0.199:7897",
        "https-proxy": "http://10.0.0.199:7897"
    },
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    }
}

重新加载并重启docker

systemctl daemon-reload
systemctl restart docker

安装conda

下载miniconda安装脚本
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

运行安装脚本
bash Miniconda3-latest-Linux-x86_64.sh

激活miniconda
source ~/miniconda3/bin/activate

验证安装
conda --version

安装screen

apt install -y screen

验证安装
screen --version

安装显卡驱动

参考英伟达官方文档安装(根据实际系统版本、显卡型号选择)

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=24.04&target_type=deb_network

使用nvidia-smi验证,查看显卡信息

2、模型引擎安装

Ollama:性能差,使用方便,适合个人用户

vllm:性能调度好,兼容性好,支持embedding、rerank模型

Xinference平台:集成了vllm、transformer、sg-lang

vllm安装

创建一个conda环境,python版本至少3.11或者以上,vllm_env是虚拟环境的名称可以自定义。
conda create -n vllm_env python=3.12 -y

进入创建的conda环境
conda activate vllm_env

安装pytorch(CUDA 版本)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

安装vllm(CUDA 版本)
pip install vllm[triton]

验证vllm是否正确安装,成功会输出vllm的版本号
python -c "import vllm; print(vllm.__version__)"

3、模型权重下载

模型库备注
https://modelscope.cn/国内环境建议用modelscpoe模型库
https://huggingface.co/模型库很全,当下最火的开源模型站,缺点是国内下载可能需要梯子

安装modelscpoe

官方文档https://modelscope.cn/docs/intro/quickstart

pip install modelscope

下载模型

创建一个文件夹来存放模型
cd /mnt/vllm-models
mkdir QwQ-32B

下载模型到指定路径
modelscope download --model 'Qwen/QwQ-32B' --local_dir '/mnt/vllm-models/QwQ-32B'

--model:模型的名称,请在modelscpoe搜索后复制过来

--local_dir:下载到指定路径(尽量不要使用默认路径,因为模型文件较大 占根目录空间)

4、运行模型

LLM模型

这里使用QwQ-32B-AWQ举例,不通模型参数要求可能不通,请参考modelscpoe官方文档

创建一个screen进程
screen -S vllm

后续进入screen进程
screen -r vllm

进入conda环境
conda activate vllm_env

运行模型(以兼容OpenAI API方式运行)
vllm serve /mnt/vllm-models/QwQ-32B-AWQ   \
    --served-model-name QwQ-32B-AWQ \
    --host 0.0.0.0 \
    --port 8000 \
    --tensor-parallel-size 2 \
    --max-model-len 100000

参数解释(如有不对 请以官网文档为准):

vllm serve:运行模型权重的路径为/mnt/vllm-models/QwQ-32B-AWQ(注意是路径,而非文件名称)

--served-model-name:给这个模型进程命名为QwQ-32B-AWQ,这一步是为了方便与Dify对接

--host:可以访问接口的地址,0.0.0.0表示允许所有

--port:端口指定为8000

--tensor-parallel-size:使用的显卡数量为2(这个应该是模型同时运行在两张显卡上 来增加效率,我实际用的时候发现 一张只需要40G显存就能跑起来的模型,会把两张48G的显存都占满,大概84G左右。 没太明白他的工作原理,但是对模型的提速确实很明显)

--gpu-memory-utilization 0.95:将显存最大使用率设置为百分之95,不设置默认就是0.90左右。一般不用加这个参数

--swap-space:显存爆了的时候,可以将一部分运行在内存上,分配内存为64G。这个一般也不用加 一般用不到

--max-model-len 110000:这是上下文最大值,大部分模型默认是132k。有时候提示显存不足以运行132k,就可以把这个值改小110000就是110K左右。一般也不需要去改

运行时可以新开一个窗口观察显卡使用情况

nvidia-smi

embeding模型 && rerank模型

使用ollama、vllm、huggingface、transformer、Jina的方式,来运行embedding和rerank模型实在是太麻烦了,且需要一定的编程基础。而Xinference集成了这些引擎环境,所以这里借助Xinference来部署模型。

docker部署Xinference可以参考文档https://blog.csdn.net/jsyzliuyu/article/details/145831288

拉取镜像
docker pull xprobe/xinference:latest

启用GPU加速方式运行
docker run --name xinference -d -p 9997:9997 -e XINFERENCE_HOME=/data -v /mnt/xinference:/data --gpus all xprobe/xinference:latest xinference-local -H 0.0.0.0

安装完成后,浏览器访问http://localhost:9998 可访问WebUI进行验证

由于web没有进度条显示,所以这里选择在容器内用命令行的方式运行模型

进入容器
docker exec -it xinference bash

安装运行embeding模型
xinference launch --model-name bge-m3 --model-type embedding --replica 1 --download-hub modelscope

下载运行
xinference launch --model-name bge-reranker-v2-m3 --model-type rerank --replica 1 --download-hub modelscope

参数解释

--model-name:xinference上的模型名称

--model-type:模型的类型llm、embedding、rerank

--replica 1:副本数,不用改

--download-hub:指定模型下载站为modelscope

--n-gpu:指定模型以GPU方式运行,可选参数为GPU的数量auto、1、2 。如果不加该参数,则使用CPU运行(我们这里的embedding和rerank指定使用CPU运行 所以未加该参数)

也尝试用xinference并指定vllm引擎运行llm模型,但实际使用下来效果并不好。

模型速度很慢,每秒的token数只有原生vllm的三分之一。 并且显存的调用也不理想,两张GPU显存(每张48G)都只使用了30G左右。

可能是我启动参数需要调整(这个问题记录下,之后解决了就把llm模型也迁过来)

xinference launch --model-name deepseek-r1-distill-qwen --model-type LLM --model-engine vLLM --model-format pytorch --size-in-billions 32 --quantization none --n-gpu 2 --replica 1 --n-worker 1 --download-hub modelscope --reasoning-content false

5、集中调用模型的平台

评价一下用过的几个平台

平台描述推荐
OpenWebUI界面好看,知识库也好用,支持多用户分组分权。不支持工作流不需要工作流的情况下,非常推荐
FastGPT界面好看,操作直观,支持工作流,响应很快,知识库专业有提问的特点。(就是Embedding增强索引要收费????简直不能理解)不推荐。除非买了商业版
Ragflow界面好看,操作直观,支持工作流,知识库可以根据文件类型选择多种解析格式,但是回答响应很慢。推荐
Dify功能看似很全,实际一运行,性能差,检索一趟能花一分钟。甚至直接未响应非常不推荐
Anythingllm功能全,就是界面不太友好了,配置有难度。性能不错的推荐
MaxKB速度快,UI简洁,知识库匹配的准确性不太行。推荐

Dify

git克隆Dify源代码到本地,假设版本是1.1.2(也可以选择手动到github上下载zip包上传到服务器上)
git clone https://github.com/langgenius/dify.git --branch 1.1.2


进入 Dify 源代码的 Docker 目录
cd dify/docker

复制环境配置文件
cp .env.example .env

运行Dify
docker compose up -d

访问Dify
http://server_ip

修改.env环境变量值

vi .env

上传文件大小限制,单位是M,默认是15
UPLOAD_FILE_SIZE_LIMIT=10000

同时上传的文件数量,默认是5
UPLOAD_FILE_BATCH_LIMIT=100

Dify默认向量数据库是weaviate,如果想切花Milvus向量数据库需要修改以下参数
milvus数据库有问题可以参考这个issues  https://github.com/langgenius/dify/issues/14770
MILVUS_URI=http://milvus-standalone:19530
MILVUS_USER=root
MILVUS_PASSWORD=Milvus

以上是几个建议修改的值参数,其他按需修改

修改完后重启Dify
docker compose down
docker compose up -d

Ragflow

确保 vm.max_map_count 不小于 262144

vi /etc/sysctl.conf
vm.max_map_count=262144

验证配置
sysctl vm.max_map_count

克隆仓库
git clone https://github.com/infiniflow/ragflow.git

克隆失败可以挂代理
export http_proxy="http://proxy_ip:port"
export https_proxy="http://proxy_ip:port"

修改环境变量安装带embeding模型的版本
vi .env
v0.17.2-slim修改为v0.17.2

安装以CPU版本运行embedding模型
cd ragflow/docker
docker compose -f docker-compose.yml up -d


Anythingllm

官网的部署命令有问题。数据库文件夹没有给权限,用下面这个命令

export STORAGE_LOCATION=$HOME/anythingllm
mkdir -p $STORAGE_LOCATION
chmod -R 777 $STORAGE_LOCATION
touch "$STORAGE_LOCATION/.env"
docker run -d -p 3006:3001 \
--cap-add SYS_ADMIN \
-v ${STORAGE_LOCATION}:/app/server/storage \
-v ${STORAGE_LOCATION}/.env:/app/server/.env \
-e STORAGE_DIR="/app/server/storage" \
mintplexlabs/anythingllm

添加模型

image-20250323232404184

模型供应商添加OpenAI-API-compatible和Xorbits Inference

image-20250323232536145

添加运行率在vllm中的llm模型

image-20250323232631772

添加embedding和rerank模型

image-20250323232758322

image-20250323232817084

设置系统默认模型

image-20250323232907674

6、搭建知识库

文件上传:

web读取:

embedding模型 向量化文本

MaxKB各个组件参数设置建议

组件参数1参数2参数3
多路召回(rerank)Score 0.7分段Top10
知识库检索相似度高于 0.300分段Top10混合检索

7、工作流

image-20250326150147634

8、WebUI(可选项)

  • Dify的前端对话界面,过于简洁了 并且 手机端似乎有bug。不能向下滑动
  • Dify并不能实现用户验证使用,且多用户分权

所以可以借助api的方式,使用其他WebUI。比如:open-webui,界面好看,可以多用户分权。

安装OpenWebUI

在安装openwebui之前还需要先安装一个插件,将dify的api转换为openai api格式,这里使用dify2openai这个项目

安装dify2openai

vi docker-compose.yml

version: '3.5'
services:
  dify2openai:
    container_name: dify2openai
    build:
      context: .
      dockerfile: Dockerfile
    network_mode: bridge
    ports:
      - "3000:3000"
    restart: always
    environment: 
      - DIFY_API_URL=https://server_ip/v1
      - BOT_TYPE=Chat

dcoker compose up -d

参数解释:

DIFY_API_URL:地址替换为Dify的地址即可,http://10.0.0.201/v1

BOT_TYPE:API的类型,跟dify中的,Chat、agent、workflow对应,如果是workflow还需填写INPUT_VARIABLE和OUTPUT_VARIABLE。请参考这篇文档https://zhuanlan.zhihu.com/p/17873627322

安装OpenWebUI,使用官网的支持英伟达GPU的命令 一键安装即可

docker run -d -p 3001:8080 --gpus all --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:cuda

浏览器访问http://server_ip:3001

对接Dify

在设置--外部连接,添加OpenAI API

image-20250323235157254

添加Dify中的模型名称

image-20250323235437641

image-20250323235746217

对话测试

image-20250323235556613

用户的创建的分权

image-20250323235717367

image-20250323235732743

这里每次回答都需要挺长时间,不知道是什么原因。可能跟中间转了一层API格式有关。

这个问题还没找到原因
image-20250326220605167