资讯动态

三台机器搭建RAG环境:Dify+Xinference+vLLM部署实战

发布时间:2026/10/16 21:12:00 来源:尧图企业网站定制
简介这份实战教程面向希望快速上手检索增强生成系统的开发者与运维人员围绕DeepSeek模型系统讲解RAG环境从零搭建的完整流程。内容涵盖技术栈概要、Dify服务器、Rerank与Embedding模型服务器、DeepSeek模型服务器三台ECS的分步部署并涉及CUDA驱动、vLLM推理库、Docker容器化、xinference框架以及bge-reranker-large、bge-large-zh-v1.5等中文模型的安装与调用帮助读者掌握多机协作下的模型部署与排错思路。资源包为1个docx文档约580KB目录结构清晰按技术栈与安装部署两大模块组织便于对照查阅。目前已有326人学习适合具备一定深度学习基础、需要落地RAG系统的技术人员参考。1. 三台机器、三个模型、一条链路这套 RAG 环境搭建到底在解决什么很多团队第一次搭 RAG都会卡在同一个地方模型能跑但检索结果排序不对生成答案就开始胡说。这套教程的核心思路很直接——把 RAG 拆成三个独立环节分别部署在三台服务器上每台只干一件事。Dify 负责流程编排和知识库管理ECS-2 跑 Embedding 和 Rerank 两个检索侧模型ECS-3 用 vLLM 拉起 DeepSeek-R1-Distill-Qwen-14B 做生成。三台机器通过内网 API 串起来哪一环出问题就单独排查不用在同一个环境里反复折腾依赖冲突。适合正在做企业知识库、智能客服、文档问答的开发者尤其是手里有 GPU 但不知道怎么把模型部署和编排平台接起来的场景。2. 技术栈选型为什么是 Dify Xinference vLLM 这套组合2.1 三个模块各管什么这套方案里每个组件都有明确的边界。Dify 是应用开发平台负责知识库上传、分段、检索策略配置、对话流程编排它本身不跑模型推理只通过 API 调用外部模型服务。Xinference 是模型推理框架专门用来部署 Embedding 和 Rerank 这类中小模型支持自定义模型注册适合把 HuggingFace 上的模型拉到本地跑。vLLM 则是大模型推理引擎核心优势是 PagedAttention 和连续批处理能把 14B 级别的模型在单卡 V100 上跑出可用的吞吐。模块部署位置作用关键依赖DifyECS-1流程编排、知识库管理Docker、Docker ComposeXinferenceECS-2Embedding Rerank 推理Python 3.8、CUDA 11.4vLLMECS-3DeepSeek 大模型推理Python 3.10、CUDA 12.1选 Xinference 而不是自己写 Flask 服务是因为它自带模型注册、启动、注销的完整生命周期管理bge 系列模型直接注册就能用省掉大量胶水代码。选 vLLM 而不是 HuggingFace Transformers 直接推理是因为 14B 模型用 Transformers 跑显存碎片严重并发一上来就 OOMvLLM 的显存管理能把这部分压下去。2.2 模型选型的实际考量Embedding 用bge-large-zh-v1.5输出 768 维向量最大 512 token中文场景下检索召回率比 m3e 系列稳。Rerank 用bge-reranker-large对检索回来的 top-k 结果做二次排序把真正相关的文档顶到前面。生成模型用DeepSeek-R1-Distill-Qwen-14B蒸馏自 Qwen-2.5 系列14B 参数量在 V100 32G 上刚好能跑精度用 half 模式显存占用约 28G留一点余量给 KV Cache。注意模型选型不是越大越好。14B 在单卡 V100 上能跑起来换成 32B 就需要多卡或者量化部署复杂度直接翻倍。先跑通链路再考虑升级。3. ECS-2 部署实战Xinference 拉起 Embedding 和 Rerank3.1 环境准备与 Xinference 安装ECS-2 的镜像是 Ubuntu 20.04 with Tesla Driver 470 和 CUDA 11.4Python 用 3.8。这个环境版本不是随便选的——Xinference 对 CUDA 版本有要求11.4 能兼容 bge 系列模型的推理后端再高反而容易遇到 PyTorch 版本不匹配。# 安装 xinference 完整版包含所有推理后端 pip install xinference[all] # 配置模型存储路径避免默认路径磁盘爆满 export XINFERENCE_HOME/tmp/xinference # 验证安装是否成功 xinference --helpXINFERENCE_HOME这个环境变量建议写进~/.bashrc否则每次重启终端都要重新 export。模型文件默认下载到~/.xinference下如果系统盘小一定要改到数据盘。启动 Xinference 有两种方式调试阶段用前台启动看日志稳定后用后台启动# 前台启动端口固定 9997 xinference-local --host 0.0.0.0 --port 9997 # 后台启动日志输出到 nohup.out nohup xinference-local --host 0.0.0.0 --port 9997 nohup.out 端口 9997 是 Xinference 的默认端口Dify 那边配置模型 API 地址时要对应上。--host 0.0.0.0是为了让 ECS-1 能通过内网 IP 访问如果只写 127.0.0.1Dify 就连不过来。3.2 注册自定义 Rerank 模型bge-reranker-large 需要先从 HuggingFace 下载到本地再上传到服务器。这一步和 Xinference 安装可以并行做模型文件大概 1.3G上传时间取决于内网带宽。模型上传后在模型目录下创建config.json{ model_name: custom-bge-reranker-large, type: normal, language: [en, zh], model_id: BAAI/bge-reranker-large, model_uri: file:///path/to/bge-reranker-large }model_name是自定义名称后面启动和调用都用这个名字。model_uri必须用file://前缀加绝对路径相对路径会注册失败。language字段声明支持中英文不影响推理但影响 Xinference 的模型列表展示。注册命令# 将自定义模型注册到 xinference xinference register --model-type rerank --file model.json --persist # 检查注册结果 xinference registrations --model-type rerank--persist参数表示持久化注册信息不加的话重启 Xinference 后模型列表就丢了。注册成功后用registrations命令能看到custom-bge-reranker-large出现在列表里。启动 Rerank 模型xinference launch --model-name custom-bge-reranker-large --model-type rerank启动后 Xinference 会加载模型到 GPUT4 16G 显存跑 bge-reranker-large 大概占 2G 左右余量充足。如果启动报 CUDA out of memory先检查是不是有其他进程占着显卡。3.3 注册自定义 Embedding 模型Embedding 模型的注册流程和 Rerank 几乎一样区别在config.json的字段{ model_name: custom-bge-large-zh-v1.5, dimensions: 768, max_tokens: 512, language: [zh], model_id: BAAI/bge-large-zh-v1.5, model_uri: file:///path/to/bge-large-zh-v1.5 }dimensions必须和模型实际输出维度一致bge-large-zh-v1.5 是 768 维写错了 Dify 那边向量检索会直接报维度不匹配。max_tokens是 512超过这个长度的文本会被截断知识库分段时要注意控制每段长度。# 注册 embedding 模型 xinference register --model-type embedding --file model.json --persist # 验证注册 xinference registrations --model-type embedding # 启动模型 xinference launch --model-name custom-bge-large-zh-v1.5 --model-type embedding两个模型都启动后Xinference 的 API 端点就准备好了。Dify 里配置 Embedding 模型时填http://ECS-2内网IP:9997/v1模型名填custom-bge-large-zh-v1.5Rerank 同理。提示如果后续要换模型先用xinference unregister注销旧模型再注册新的。直接覆盖注册有时候会残留旧配置导致启动时加载错误的模型文件。4. ECS-3 部署实战vLLM 拉起 DeepSeek-14B4.1 驱动、CUDA 与 Python 环境ECS-3 的镜像是 CentOS 7.9CUDA 11.4但 vLLM 0.43 需要 CUDA 12.1所以驱动和 CUDA 都要重新装。这里有个坑如果先装了 CUDA 再装驱动驱动安装程序会检测到已有 CUDA 然后报错退出。正确顺序是先装驱动再单独装 CUDA Toolkit安装时取消勾选驱动选项。驱动选 530.30.02 版本对应 CUDA 12.1。安装完成后验证# 查看驱动版本 nvidia-smi # 查看 CUDA 版本 nvcc -V两个命令输出的 CUDA 版本要一致不一致说明环境变量没配好。CUDA 安装后需要手动加环境变量# 编辑 ~/.bashrc vim ~/.bashrc # 在文件末尾添加路径根据实际安装位置调整 export PATH/usr/local/cuda-12.1/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH # 刷新环境变量 source ~/.bashrcPython 用 conda 创建独立环境版本 3.10conda create -n myenv python3.10 -y conda activate myenvPyTorch 必须装和 CUDA 12.1 匹配的版本否则 vLLM 安装时会报错pip install torch2.3.0 torchvision0.18.0 torchaudio2.3.0 --index-url https://download.pytorch.org/whl/cu121这个命令里的--index-url指定了 PyTorch 官方 CUDA 12.1 的 wheel 源不指定的话默认装 CPU 版本后面 vLLM 跑起来会提示找不到 GPU。4.2 vLLM 安装与模型启动pip install vllm0.43安装过程中如果报依赖版本冲突按照报错信息逐个指定版本安装。常见的是pydantic和fastapi版本不兼容vLLM 0.43 要求pydantic2.0如果环境里有旧版本先卸载。DeepSeek 模型文件提前下载好上传到服务器14B 的 half 精度模型大约 28G上传前确认磁盘空间足够。启动命令python -m vllm.entrypoints.openai.api_server \ --model /root/work/ds/pretrained \ --dtype half \ --trust-remote-code \ --tensor-parallel-size 1 \ --max-model-len 5120 \ --enforce-eager \ --gpu-memory-utilization 0.95 \ --max-num-batched-tokens 5120 \ --max-num-seqs 5 \ --host 0.0.0.0 \ --served-model-name DeepSeek-R1-14B \ --port 8008 逐项说明关键参数--dtype half用 FP16 精度加载显存占用减半V100 对 FP16 有硬件加速。--tensor-parallel-size 1单卡推理如果是多卡就改成卡数。--max-model-len 5120最大上下文长度设太大 KV Cache 会吃掉大量显存。--enforce-eager禁用 CUDA Graph牺牲一点性能换稳定性V100 上建议开启。--gpu-memory-utilization 0.95显存利用率上限留 5% 给系统。--max-num-seqs 5最大并发序列数根据实际并发调整设太高会 OOM。--served-model-name DeepSeek-R1-14BAPI 调用时的模型名称Dify 里填这个。启动后看到Uvicorn running on http://0.0.0.0:8008就说明服务起来了。用 curl 测一下curl http://localhost:8008/v1/models返回模型列表里有DeepSeek-R1-14B就正常。4.3 Dify 侧对接与链路验证Dify 用 Docker 部署在 ECS-1 上安装流程参考官方文档。部署完成后进入设置页面在模型供应商里添加 OpenAI-API-compatible 类型Embedding 模型API Base 填http://ECS-2内网IP:9997/v1模型名custom-bge-large-zh-v1.5Rerank 模型API Base 同上模型名custom-bge-reranker-largeLLM 模型API Base 填http://ECS-3内网IP:8008/v1模型名DeepSeek-R1-14B配置完成后创建一个知识库上传一个测试文档用默认分段策略。然后在应用编排里把检索策略设为混合检索加 Rerank生成模型选 DeepSeek。问一个文档里有的问题如果回答准确且引用了原文说明整条链路通了。5. 避坑与排查三台机器联调时最容易翻车的几个点5.1 Xinference 注册模型后启动报 “model not found”现象是xinference launch时提示模型不存在但registrations列表里明明有。原因通常是注册时--persist没加或者XINFERENCE_HOME在注册和启动时指向了不同路径。解决方法是先确认echo $XINFERENCE_HOME输出一致然后重新注册并加上--persist。5.2 vLLM 启动时 CUDA out of memoryV100 32G 跑 14B half 模型权重占约 28G如果--gpu-memory-utilization设成 0.95留给 KV Cache 的空间只有 1.6G 左右。--max-model-len 5120和--max-num-seqs 5的组合下KV Cache 需求可能超过这个值。解决办法是降低max-model-len到 4096或者把max-num-seqs降到 3。如果还是不够检查是不是有其他进程占着显卡nvidia-smi看一下。5.3 Dify 调用 Embedding 接口超时Dify 默认的模型请求超时是 60 秒如果 ECS-2 和 ECS-1 之间网络延迟高或者 Embedding 模型首次加载慢就会超时。在 Dify 的模型配置里把超时时间调到 120 秒。另外确认 ECS-2 的安全组开放了 9997 端口只允许 ECS-1 的内网 IP 访问。5.4 Rerank 模型返回分数全部接近检索回来的文档经过 Rerank 后分数都在 0.5 左右区分度很低。这通常是因为bge-reranker-large对输入文本的长度敏感如果知识库分段太长超过了模型的最佳处理长度分数就会趋同。把 Dify 里的分段长度从默认的 500 调到 300 左右重叠 50重新索引后再试。5.5 vLLM 服务启动后 Dify 调用返回 404Dify 里配置的模型名和 vLLM 启动时的--served-model-name不一致会导致 404。检查 Dify 模型配置里的模型名称是否严格等于DeepSeek-R1-14B大小写和连字符都不能差。另外确认 API Base 填的是http://IP:8008/v1末尾的/v1不能少。6. 二次开发与调优从跑通到跑好的几个改造方向链路跑通只是第一步真正用到生产环境还要做几件事。第一是 Embedding 和 Rerank 的批处理优化。Xinference 默认单条推理如果知识库文档量大索引速度会很慢。可以在 Dify 的知识库设置里把批处理大小调大同时确认 Xinference 那边的--batch-size参数如果有也相应调整。我一般会先用 100 篇文档测一下索引耗时再决定批大小。第二是 vLLM 的并发调优。--max-num-seqs设成 5 是保守值实际能跑多少取决于请求的平均生成长度。如果用户问题短、回答也短可以逐步往上调每次加 2观察nvidia-smi的显存占用和 vLLM 日志里的吞吐数据。调到显存占用稳定在 90% 左右就差不多了。第三是 Rerank 的 top-k 策略。Dify 默认检索 top-10 然后 Rerank 取 top-3如果发现回答经常漏掉关键信息可以把 Rerank 后的 top-k 调到 5。但注意上下文长度限制top-k 越大塞进 DeepSeek 的 token 越多超过max-model-len就会被截断。第四是加一层缓存。Embedding 和 Rerank 的结果对相同输入是确定的可以在 Dify 前面加一个 Redis 缓存把 query 的 embedding 向量和 rerank 分数缓存起来重复问题直接命中缓存减少 GPU 压力。验证改造效果的方法很简单准备 20 个测试问题覆盖知识库里不同文档的内容记录每个问题的回答准确率和响应时间。改一个参数跑一遍对比数据。不要凭感觉调参血泪经验是感觉往往不准。从那以后我每次部署新环境都会先用一个最小知识库跑通全链路再逐步加文档、调参数。先保证链路通再谈优化这个顺序不能反。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑