简介:这份实战教程面向希望快速上手检索增强生成系统的开发者与运维人员,聚焦基于DeepSeek模型搭建RAG系统的完整环境部署流程。内容从技术栈概要切入,依次讲解Dify服务器、Rerank与Embedding模型服务器、DeepSeek模型服务器的分步安装部署,并覆盖CUDA驱动、vLLM推理库、Docker容器化、xinference推理框架以及bge-reranker-large、bge-large-zh-v1.5等中文模型的落地配置,帮助读者打通从环境准备到模型验证的关键环节。资源包为1个docx文档,约580KB,目录结构清晰,按技术栈概要与安装部署两大模块组织,便于对照查阅。目前已有326人学习,适合需要系统掌握RAG环境搭建、排查部署细节的中高级开发者参考。
1. 三台机器、三个模型:这套 RAG 环境为什么总在 CUDA 版本上翻车
RAG 系统环境搭建这件事,说简单也简单,说坑也真坑。我见过太多人把 Dify、Xinference、vLLM 装在同一台机器上,结果 CUDA 版本打架、Python 依赖冲突、显存不够,最后连模型都加载不起来。这套基于 DeepSeek 的 RAG 系统,核心思路是拆成三台服务器各司其职:ECS-1 跑 Dify 做应用编排,ECS-2 跑 Rerank 和 Embedding 模型做知识库检索,ECS-3 跑 DeepSeek 大模型做推理生成。三台机器环境不同、CUDA 版本不同、Python 版本也不同,装之前不把版本对齐,后面全是玄学报错。这篇笔记适合正在搭 RAG 环境、被 CUDA 和 vLLM 折磨过的开发者,照着走能少踩几个血泪坑。
2. 装之前先定版本:三台服务器的环境对照与选型逻辑
2.1 三台 ECS 的角色划分与硬件要求
这套 RAG 系统的部署架构是典型的模型分离思路。Dify 作为应用开发平台,负责流程编排、智能体创建和知识库管理,对显卡没什么要求,用 Docker 部署就行。ECS-2 承担 Rerank 和 Embedding 两个模型的推理,选的是 NVIDIA Tesla T4,16GiB 显存,跑 bge-reranker-large 和 bge-large-zh-v1.5 这两个模型刚好够用。ECS-3 跑 DeepSeek-R1-Distill-Qwen-14B,这个模型参数量大,需要 Tesla V100 32GiB 显存,用 vLLM 做推理加速。
为什么要把 Embedding 和 Rerank 放在同一台机器?因为这两个模型在 RAG 流程里是前后脚调用的——先 Embedding 把知识库文本向量化,检索时再用 Rerank 对候选结果重排序。放一起能减少网络往返,T4 的 16G 显存同时加载这两个模型也扛得住。DeepSeek 单独放一台,是因为 14B 模型对显存和算力要求高,混部容易把 Embedding 服务挤爆。
| 服务器 | 角色 | 镜像 | 显卡 | Python |
|---|---|---|---|---|
| ECS-1 | Dify 应用平台 | CentOS 7.5 64bit | 无要求 | Docker 内置 |
| ECS-2 | Rerank + Embedding | Ubuntu 20.04 + Tesla Driver 470.223.02 + CUDA 11.4 | T4 16GiB | 3.8 |
| ECS-3 | DeepSeek 推理 | CentOS 7.9 + CUDA 11.4 | V100 32GiB | 3.10 |
2.2 版本选型的三个关键决策
第一个决策是CUDA 版本。ECS-2 直接用镜像自带的 CUDA 11.4,省事。ECS-3 虽然镜像也是 CUDA 11.4,但 vLLM 0.43 对 CUDA 12.1 支持更好,所以需要手动升级驱动到 530.30.02,再装 CUDA 12.1。这里有个坑:驱动和 CUDA 要分开装,一起装会失败。
第二个决策是Python 版本。ECS-2 用 3.8,因为 Xinference 在这个版本上最稳。ECS-3 用 3.10,vLLM 0.43 要求 Python 3.9 以上。两个环境不要混用 conda 环境,各管各的。
第三个决策是模型精度。DeepSeek 启动时用--dtype half,半精度推理,显存占用减半,效果损失很小。如果你的 V100 显存紧张,这个参数必加。
提示:装之前先用
nvidia-smi确认驱动版本,用nvcc -V确认 CUDA 版本,两个版本号要能对上。驱动版本决定 CUDA 上限,CUDA 版本决定 PyTorch 和 vLLM 能不能装。
3. 部署 ECS-2:Xinference 安装与 Rerank/Embedding 模型注册
3.1 Xinference 安装与环境变量配置
ECS-2 上要跑两个模型,用 Xinference 做推理框架。安装命令很直接:
# 安装 Xinference 完整版,包含所有推理后端依赖 pip install "xinference[all]" # 配置模型存储路径,避免默认路径磁盘空间不足 export XINFERENCE_HOME=/tmp/xinference # 验证安装是否成功 xinference --helpxinference[all]会装一堆依赖,包括 transformers、accelerate、sentence-transformers 等。如果磁盘空间紧张,可以只装需要的后端,但 RAG 场景建议全装,省得后面缺库。XINFERENCE_HOME指定模型缓存和配置文件的存放位置,默认在用户目录下,生产环境建议改到大盘。
启动 Xinference 有两种方式:
# 前台启动,调试时用,能看到实时日志 xinference-local --host 0.0.0.0 --port 9997 # 后台启动,生产环境用 nohup xinference-local --host 0.0.0.0 --port 9997 &> nohup.out &端口 9997 是 Xinference 的默认端口,不要改,因为后面 Dify 配置模型时要用这个端口。--host 0.0.0.0让服务监听所有网卡,否则 Dify 服务器访问不到。
3.2 注册 bge-reranker-large 自定义模型
Xinference 内置了一些模型,但 bge-reranker-large 需要手动注册。先准备 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指向本地模型文件路径,需要提前从 HuggingFace 下载好上传到服务器。type填normal表示标准模型。
注册命令:
# 将自定义模型注册到 Xinference xinference register --model-type rerank --file model.json --persist # 检查注册是否成功 xinference registrations --model-type rerank--persist参数让注册信息持久化,重启 Xinference 后不用重新注册。注册成功后,用xinference launch启动:
xinference launch --model-name custom-bge-reranker-large --model-type rerank如果需要注销模型重新注册,用xinference unregister --model-type rerank --model-name custom-bge-reranker-large。
3.3 注册 bge-large-zh-v1.5 自定义模型
Embedding 模型的注册流程类似,但 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是单次输入最大 token 数,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 会在 9997 端口暴露 OpenAI 兼容的 API 接口。Dify 配置模型时,填 ECS-2 的内网 IP 加 9997 端口就行。
注意:模型文件下载后要检查完整性,特别是 bin 文件和 config.json 是否齐全。我遇到过下载中断导致模型加载失败的情况,重新下载后正常。
4. 部署 ECS-3:CUDA 12.1 升级、vLLM 安装与 DeepSeek 启动
4.1 驱动与 CUDA 分开安装的步骤
ECS-3 的镜像自带 CUDA 11.4,但 vLLM 0.43 需要 CUDA 12.1。升级过程分两步,先装驱动,再装 CUDA,一起装会失败。
第一步,安装 NVIDIA 驱动 530.30.02:
# 下载驱动安装包,选择 x86_64 架构的历史版本 530.30.02 # 安装驱动,过程中会提示禁用 nouveau 驱动 sh NVIDIA-Linux-x86_64-530.30.02.run第二步,安装 CUDA 12.1。驱动装好后,CUDA 安装程序不会再尝试装驱动:
# 下载 CUDA 12.1 runfile sh cuda_12.1.0_530.30.02_linux.run --toolkit --silent --override--toolkit只装 CUDA 工具包,不装驱动。--silent静默安装,--override跳过编译器版本检查。
第三步,配置环境变量:
# 编辑 ~/.bashrc,在末尾添加 export PATH=/usr/local/cuda-12.1/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH # 刷新环境变量 source ~/.bashrc # 验证 CUDA 版本 nvcc -Vnvcc -V输出应该是 CUDA 12.1。再用nvidia-smi看驱动版本,右上角显示的 CUDA 版本是驱动支持的最高版本,只要不低于 12.1 就行。
4.2 Python 3.10 环境与 PyTorch 依赖安装
用 conda 创建独立环境:
# 创建 Python 3.10 虚拟环境 conda create -n myenv python=3.10 -y # 激活环境 conda activate myenv安装 PyTorch 时要注意版本匹配。vLLM 0.43 对 torch 版本有要求,直接装最新版会报错:
# 安装指定版本的 PyTorch,匹配 CUDA 12.1 pip install torch==2.3.0 torchvision==0.18.0 torchaudio==2.3.0 --index-url https://download.pytorch.org/whl/cu121--index-url指定 PyTorch 官方 CUDA 12.1 的 wheel 源。如果网络慢,可以换成国内镜像源,但要注意镜像源同步是否及时。
4.3 vLLM 0.43 安装与 DeepSeek 模型启动
安装 vLLM:
pip install vllm==0.43安装过程中会出现依赖版本冲突的报错,比如 pydantic、fastapi 版本不匹配。按照报错提示逐个安装指定版本,不要强行忽略。常见的是pip install pydantic==1.10.13这类命令。
模型文件提前下载好上传到服务器,路径假设为/root/work/ds/pretrained。启动命令:
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:半精度推理,显存占用减半,V100 上效果损失很小。--trust-remote-code:DeepSeek 模型有自定义代码,必须加这个参数。--tensor-parallel-size 1:单卡推理,如果是多卡可以改成卡数。--max-model-len 5120:最大上下文长度,根据显存调整,V100 32G 跑 5120 比较稳。--enforce-eager:禁用 CUDA graph,避免某些环境下的兼容性问题。--gpu-memory-utilization 0.95:GPU 显存利用率,0.95 表示用 95% 显存。--max-num-batched-tokens 5120:单批次最大 token 数,和 max-model-len 保持一致。--max-num-seqs 5:最大并发序列数,显存紧张就调小。--served-model-name DeepSeek-R1-14B:API 调用时的模型名称。--port 8008:服务端口,Dify 配置时填这个。
启动后,用curl http://localhost:8008/v1/models检查模型是否加载成功。
5. 避坑记录:CUDA、依赖和显存最容易翻车的五个地方
5.1 nvcc 和 nvidia-smi 版本不一致
现象:nvcc -V显示 CUDA 11.4,nvidia-smi显示 CUDA 12.1,PyTorch 装完提示 CUDA 不可用。
原因:驱动和 CUDA 工具包版本不匹配。nvidia-smi显示的是驱动支持的最高 CUDA 版本,nvcc -V显示的是当前工具包版本。两者不一致时,PyTorch 编译时用的 CUDA 版本可能和运行时不一致。
解决:确保nvcc -V的版本和 PyTorch 安装时指定的 CUDA 版本一致。如果驱动版本够高,可以装多个 CUDA 工具包,用环境变量切换。
5.2 vLLM 安装时依赖冲突
现象:pip install vllm==0.43报错,提示 pydantic、fastapi、uvicorn 等包版本不兼容。
原因:vLLM 对依赖版本要求严格,现有环境里的包版本不满足要求。
解决:按照报错提示逐个安装指定版本。常见的是pip install pydantic==1.10.13、pip install fastapi==0.111.0。如果冲突太多,建议新建干净的 conda 环境重装。
5.3 模型加载时显存不足
现象:vLLM 启动时报CUDA out of memory,或者 Xinference 加载模型时卡住。
原因:模型太大,显存不够。DeepSeek 14B 半精度需要约 28G 显存,V100 32G 刚好够,但如果--gpu-memory-utilization设太高,留给 KV cache 的显存就不够了。
解决:降低--gpu-memory-utilization到 0.85,或者减小--max-model-len。如果还是不够,考虑量化模型。
5.4 Xinference 注册模型后启动失败
现象:xinference launch报错,提示模型文件不存在或 config.json 格式错误。
原因:model_uri路径写错,或者模型文件下载不完整。
解决:检查model_uri指向的目录下是否有config.json、pytorch_model.bin等文件。用ls -lh看文件大小是否正常,bge-large-zh-v1.5 大约 1.3G。
5.5 Dify 连接模型服务超时
现象:Dify 配置模型后,测试连接一直转圈,最后提示超时。
原因:ECS-2 或 ECS-3 的安全组没开放对应端口,或者 Xinference/vLLM 监听地址不是0.0.0.0。
解决:检查安全组规则,确保 9997 和 8008 端口对 Dify 服务器开放。检查启动命令里的--host参数是否为0.0.0.0。
6. 装完怎么验证:从模型加载到 RAG 全链路跑通
环境装完只是第一步,能不能跑通才是关键。我一般按这个顺序验证:
第一步,验证 Xinference 服务。在 ECS-2 上执行:
# 查看已注册模型列表 xinference registrations --model-type rerank xinference registrations --model-type embedding # 查看正在运行的模型 xinference listxinference list会显示模型名称、类型、状态和 API 地址。状态是RUNNING才算正常。
第二步,验证 vLLM 服务。在 ECS-3 上执行:
# 检查模型是否加载 curl http://localhost:8008/v1/models # 测试推理接口 curl http://localhost:8008/v1/completions \ -H "Content-Type: application/json" \ -d '{"model": "DeepSeek-R1-14B", "prompt": "你好", "max_tokens": 10}'如果返回 JSON 格式的推理结果,说明 vLLM 正常。
第三步,验证 Dify 连接。在 Dify 后台的模型供应商设置里,分别添加 Xinference 和 vLLM 的 API 地址。Xinference 填http://ECS-2内网IP:9997,vLLM 填http://ECS-3内网IP:8008/v1。添加后点测试连接,显示绿色对勾才算通。
第四步,跑一个完整的 RAG 流程。在 Dify 里创建一个知识库,上传一个测试文档,然后创建一个聊天助手应用,关联这个知识库。提问一个文档里有的问题,看能不能检索到相关内容并生成回答。
| 验证项 | 命令/操作 | 预期结果 |
|---|---|---|
| Xinference 模型 | xinference list | 两个模型状态 RUNNING |
| vLLM 模型 | curl /v1/models | 返回 DeepSeek-R1-14B |
| Dify 连接 | 后台测试连接 | 绿色对勾 |
| RAG 全链路 | 知识库问答 | 返回相关内容 |
这套验证流程走完,基本能确认环境没问题。如果哪一步卡住,回到对应的避坑章节排查。
从那以后我每次装完环境,都会先跑一遍这个验证清单,确认每个服务都正常再往下走。希望帮到你。
本文还有配套的精品资源,点击获取