ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

昇腾服务器+Dify+one api部署DeepSeek-R1-Distill-Qwen-32B W8A8:RAG本地知识库与双实例负载均衡实战

昇腾服务器+Dify+one api部署DeepSeek-R1-Distill-Qwen-32B W8A8:RAG本地知识库与双实例负载均衡实战 1. 昇腾服务器上跑 DeepSeek-R1-Distill-Qwen-32B W8A8 到底难在哪先说清楚这套东西是什么、能做什么、适合谁。昇腾服务器Atlas 800 9000、Atlas 800T A2、推理卡、嵌入式开发板这一系列是 aarch64 架构的 NPU 硬件平台DeepSeek-R1-Distill-Qwen-32B 是 DeepSeek 用 R1 蒸馏出来的 32B 稠密模型W8A8 指的是权重和激活都量化到 8bit 的版本显存占用和推理延迟都会明显下降。Dify 是开源的大模型应用编排平台负责 RAG 知识库、工作流、对外应用one api现在多叫 new-api / one-api 这类 OpenAI 兼容网关负责把后端多个推理实例聚合成一个统一入口做渠道分发和负载均衡。适合谁适合手里已经有昇腾算力、又想把本地知识库问答跑成生产服务的团队尤其是对数据不出内网有硬要求的场景。我自己在 Atlas 800 9000 上从零走了一遍最大的感受是昇腾这套链路和 NVIDIA 生态差别很大坑集中在三个地方。第一是架构整套华为昇腾处理架构是 aarch64你从网上随手拉的 docker 镜像大概率是 x86_64跑不起来必须找 arm64 镜像或者自己 tag 重命名。第二是驱动和固件版本昇腾官方镜像对驱动版本有强绑定驱动不对MindIE 服务起不来。第三是量化Atlas 800 9000 不支持 bf16config.json 里的 torch_dtype 必须改成 float16否则加载权重直接报错。整个链路的角色分工是这样的昇腾 NPU 提供算力MindIE 作为推理框架把 DeepSeek-R1-Distill-Qwen-32B-W8A8 跑起来暴露一个 OpenAI 兼容接口bge-m3、bge-large-zh-v1.5 做文本嵌入bge-reranker-large 做重排序这三个是 RAG 的检索底座Dify 把这些模型接进去负责知识库切分、召回、编排one api 放在最前面把两个 MindIE 实例聚合成一个入口做负载均衡。下面我按实际部署顺序拆开讲每一步都给可复制的命令和配置。2. 昇腾 NPU 驱动固件与 MindIE 推理环境前置准备这一步是整个部署的地基驱动版本不对后面全白搭。先确认你的设备型号本文以 Atlas 800 9000 为例其他昇腾推理卡、嵌入式开发板流程类似但镜像和驱动要按昇腾官网对应机型选。先更新驱动和固件。昇腾官方镜像需要指定版本的驱动固件我这次是把 23.0.rc2 升到 23.0.0。把驱动包传到 /home/HwHiAiUser 下然后执行[rootdify HwHiAiUser]# pwd /home/HwHiAiUser [rootdify HwHiAiUser]# ls -l -rw------- 1 root root 134251528 Dec 7 16:16 Ascend-hdk-910-npu-driver_23.0.0_linux-aarch64.run [rootdify HwHiAiUser]# chmod 777 Ascend-hdk-910-npu-driver_23.0.0_linux-aarch64.run [rootdify HwHiAiUser]# sudo ./Ascend-hdk-910-npu-driver_23.0.0_linux-aarch64.run --full --force Verifying archive integrity... 100% SHA256 checksums are OK. All good. Uncompressing ASCEND DRIVER RUN PACKAGE 100% [Driver] [INFO]base version is 23.0.rc2. [Driver] [WARNING]Do not power off or restart the system during the installation/upgrade [Driver] [INFO]Driver package has been installed on the path /usr/local/Ascend, the version is 23.0.rc2, and the version of this package is 23.0.0,do you want to continue? [y/n] y [Driver] [INFO]upgradePercentage:100% [Driver] [INFO]Driver package installed successfully! Reboot needed for installation/upgrade to take effect! [rootdify HwHiAiUser]# sudo reboot重启后确认版本变成 23.0.0。这里有个细节安装过程中会提示是否继续输入 y 即可装完必须重启才生效别偷懒跳过。接着下载基础模型。DeepSeek-R1-Distill-Qwen-32B 原始权重从魔搭社区拉用 modelscope 的 snapshot_download 最省事[rootdify HwHiAiUser]# pip3 install modelscope1.18.0 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple [rootdify HwHiAiUser]# cat down.py #模型下载 from modelscope import snapshot_download model_dir snapshot_download(deepseek-ai/DeepSeek-R1-Distill-Qwen-32B,cache_dir.) [rootdify HwHiAiUser]# python3 down.py下载完目录结构是 /home/HwHiAiUser/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B。如果你不想自己量化也可以直接拉社区已经量化好的 W8A8 权重比如 maozi1905/DeepSeek-R1-Distill-Qwen-32B-w8a8省掉量化那一步。但自己量化能控制校准集效果更可控我建议至少走一遍量化流程。拉取 MindIE 官方镜像。昇腾镜像仓库里按机型选Atlas 800 9000 对应 mindie:atlas_800_9000。如果拉取时报 x509 证书错误改 docker 配置[rootdify HwHiAiUser]# vim /etc/docker/daemon.json { insecure-registries: [https://swr.cn-east-317.qdrgznjszx.com], registry-mirrors: [https://docker.mirrors.ustc.edu.cn] } [rootdify HwHiAiUser]# systemctl restart docker.service [rootdify HwHiAiUser]# docker pull swr.cn-east-317.qdrgznjszx.com/sxj731533730/mindie:atlas_800_9000创建容器时挂两张 NPU 卡给推理用我选 6、7 号卡0-5 号留给后面的嵌入和重排序模型。容器启动脚本[rootdify HwHiAiUser]# cat docker_run.sh #!/bin/bash docker_imagesswr.cn-east-317.qdrgznjszx.com/sxj731533730/mindie:atlas_800_9000 model_dir/home/HwHiAiUser docker run -it --name qdaicc --ipchost --nethost \ --device/dev/davinci6 \ --device/dev/davinci7 \ --device/dev/davinci_manager \ --device/dev/devmm_svm \ --device/dev/hisi_hdc \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /usr/local/Ascend/driver/lib64/common:/usr/local/Ascend/driver/lib64/common \ -v /usr/local/Ascend/driver/lib64/driver:/usr/local/Ascend/driver/lib64/driver \ -v /etc/ascend_install.info:/etc/ascend_install.info \ -v /etc/vnpu.cfg:/etc/vnpu.cfg \ -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ -v ${model_dir}:${model_dir} \ -v /var/log/npu:/usr/slog ${docker_images} \ /bin/bash [rootdify HwHiAiUser]# bash docker_run.sh进容器后 npu-smi info 能看到两张卡就对了。这一步的关键是 --device 挂载要和你实际选的卡号一致挂错卡后面推理会找不到设备。3. W8A8 量化与 MindIE 服务可复制配置量化用昇腾的 msmodelslim 工具。在容器外 git 源码进容器执行量化。注意双卡容器量化会报 NPU 显存不够要么开 8 卡容器要么用 CPU 量化我图省事用了 CPU[rootdify HwHiAiUser]# git clone https://gitee.com/ascend/msit.git [rootdify HwHiAiUser]# docker exec -it b5399c4da202 /bin/bash (Python310) rootdify:/home/HwHiAiUser/msit# cd msmodelslim/ (Python310) rootdify:/home/HwHiAiUser/msit/msmodelslim# bash install.sh (Python310) rootdify:/home/HwHiAiUser# cd /home/HwHiAiUser/msit/msmodelslim/example/Qwen (Python310) rootdify:/home/HwHiAiUser/msit/msmodelslim/example/Qwen# python3 quant_qwen.py \ --model_path /home/HwHiAiUser/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B/ \ --save_directory /home/HwHiAiUser/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B-W8A8 \ --calib_file ../common/boolq.jsonl \ --w_bit 8 --a_bit 8 --device_type cpu量化完生成 DeepSeek-R1-Distill-Qwen-32B-W8A8 目录。这里必须改一个字段Atlas 800 9000 不支持 bf16(Python310) rootdify:/home/HwHiAiUser/msit/msmodelslim/example/Qwen# vim /home/HwHiAiUser/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B-W8A8/config.json # 把 torch_dtype: bfloat16 改为 torch_dtype: float16接下来是 MindIE 服务配置这是整个部署最核心的一段。配置文件在 /usr/local/Ascend/mindie/latest/mindie-service/conf/config.json我贴出关键改动后的完整片段{ Version : 1.0.0, ServerConfig : { ipAddress : 192.168.1.115, managementIpAddress : 192.168.1.115, port : 1025, managementPort : 1026, metricsPort : 1027, httpsEnabled : false, openAiSupport : vllm }, BackendConfig : { backendName : mindieservice_llm_engine, modelInstanceNumber : 1, npuDeviceIds : [[0,1]], tokenizerProcessNumber : 8, ModelDeployConfig : { maxSeqLen : 2560, maxInputTokenLen : 4096, truncation : true, ModelConfig : [ { modelInstanceType : Standard, modelName : DeepSeek-R1-Distill-Qwen-32B-W8A8, modelWeightPath : /home/HwHiAiUser/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B-W8A8/, worldSize : 2, cpuMemSize : 5, npuMemSize : -1, backendType : atb, trustRemoteCode : false } ] }, ScheduleConfig : { templateType : Standard, templateName : Standard_LLM, cacheBlockSize : 128, maxPrefillBatchSize : 50, maxPrefillTokens : 8192, maxBatchSize : 200, maxIterTimes : 4096 } } }几个参数解释一下ipAddress 改成你本机实际 IP后面 Dify 要连这个地址npuDeviceIds 是 [[0,1]]表示容器内逻辑卡 0 和 1对应宿主机挂进来的两张卡worldSize 是 2和卡数一致modelName 必须和后面 Dify 里填的模型名完全一致否则调用会 404openAiSupport 设成 vllm这样暴露的是 OpenAI 兼容接口。改完权限启动服务(Python310) rootdify:/usr/local/Ascend/mindie/latest/mindie-service# chmod -R 750 /home/HwHiAiUser/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B-W8A8/ (Python310) rootdify:/usr/local/Ascend/mindie/latest/mindie-service# ./bin/mindieservice_daemon Daemon start success!看到 Daemon start success 就说明推理服务起来了。调试阶段可以开日志export MINDIE_LOG_TO_STDOUT1 export MINDIE_LOG_LEVELdebug4. 验证请求与 Dify 接入 RAG 知识库先验证 MindIE 服务本身能不能出结果。开另一个终端用 curl 打 /generate 接口[rootdify ~]# curl -H Accept: application/json -H Content-type: application/json -X POST \ -d {inputs:如何赚大钱,parameters:{do_sample:true,max_new_tokens:50,temperature:0.5,top_p:0.95}} \ http://192.168.1.115:1025/generate返回里能看到 generated_text 字段有内容说明推理链路通了。注意这是原生接口Dify 走的是 /v1 的 OpenAI 兼容接口两个都能用。接着部署嵌入和重排序服务。拉 mis-tei 镜像下载 bge-m3、bge-large-zh-v1.5、bge-reranker-large 三个模型同样把 config.json 里的 torch_dtype 改成 float16。然后创建三个容器分别绑不同 NPU 卡[rootdify ~]# docker run -u root -e TEI_NPU_DEVICE0 -itd --namebge-reranker-large --nethost \ -e HOME/home/HwHiAiUser --privilegedtrue \ -v /home/data:/home/HwHiAiUser/model \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ --entrypoint /home/HwHiAiUser/start.sh \ swr.cn-east-317.qdrgznjszx.com/sxj731533730/mis-tei:6.0.RC3-910-aarch64 \ BAAI/bge-reranker-large 192.168.1.115 8001 [rootdify ~]# docker run -u root -e TEI_NPU_DEVICE1 -itd --namebge-m3 --nethost \ -e HOME/home/HwHiAiUser --privilegedtrue \ -v /home/data:/home/HwHiAiUser/model \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ --entrypoint /home/HwHiAiUser/start.sh \ swr.cn-east-317.qdrgznjszx.com/sxj731533730/mis-tei:6.0.RC3-910-aarch64 \ BAAI/bge-m3 192.168.1.115 8002 [rootdify ~]# docker run -u root -e TEI_NPU_DEVICE2 -itd --namebge-large-zh-v1___5 --nethost \ -e HOME/home/HwHiAiUser --privilegedtrue \ -v /home/data:/home/HwHiAiUser/model \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ --entrypoint /home/HwHiAiUser/start.sh \ swr.cn-east-317.qdrgznjszx.com/sxj731533730/mis-tei:6.0.RC3-910-aarch64 \ BAAI/bge-large-zh-v1___5 192.168.1.115 8003三个服务端口记好reranker 8001、bge-m3 8002、bge-large-zh 8003。TEI_NPU_DEVICE 是容器内逻辑卡号从 0 开始连续映射别和宿主机卡号搞混。Dify 部署因为 aarch64 架构官方 x86 镜像不能用得找 arm64 镜像。拉源码切到稳定版本改 .env 端口改 docker-compose.yaml 加 --ignore-warnings ARM64-COW-BUG把 sandbox 版本从 0.2.10 改成 0.2.1[rootdify HwHiAiUser]# git clone https://gitee.com/dify_ai/dify.git [rootdify HwHiAiUser]# cd dify git checkout 0.15.3 [rootdify dify]# cd docker/ [rootdify docker]# cp .env.example .env [rootdify docker]# vim .env # NGINX_PORT80 改为 NGINX_PORT8004 # NGINX_SSL_PORT443 改为 NGINX_SSL_PORT442 # EXPOSE_NGINX_PORT80 改为 EXPOSE_NGINX_PORT8004 # EXPOSE_NGINX_SSL_PORT443 改为 EXPOSE_NGINX_SSL_PORT442 [rootdify docker]# docker-compose up -d启动后浏览器访问 http://服务器IP:8004注册所有者账号。进设置-模型供应商添加三类模型第一类OpenAI-API-compatible类型选 LLM模型名填 DeepSeek-R1-Distill-Qwen-32B-W8A8URL 填 http://192.168.1.115:1025/v1密钥随便填。第二类Text Embedding InferenceURL 填 http://192.168.1.115:8002模型名 bge-m3再加一个 URL http://192.168.1.115:8003模型名 bge-large-zh-v1___5。第三类RerankURL 填 http://192.168.1.115:8001模型名 bge-reranker-large。保存时只要后台服务在跑前端就能存成功。然后建知识库上传文档选 bge-m3 做嵌入、bge-reranker-large 做重排序测试召回。我实测下来不挂知识库问专业问题模型会泛泛而谈挂了知识库后能准确引用文档里的内容并给出解释RAG 链路是通的。5. 昇腾 Dify 部署常见报错排查部署过程中我踩了几个典型坑对照报错说下解法。第一个docker pull 报x509: certificate signed by unknown authority。这是私有镜像仓库证书问题改 /etc/docker/daemon.json 加 insecure-registries把仓库地址加进去重启 docker 即可。如果还是拉不动换备用地址比如阿里云个人仓库的镜像。第二个MindIE 启动报模型加载失败日志里出现torch_dtype相关错误。九成是 config.json 里还是 bfloat16Atlas 800 9000 不支持改成 float16 重启服务。第三个Dify 里保存模型报local proxy failed或连接超时。先确认 MindIE 服务在跑curl 本机 1025 端口能通再确认 Dify 容器网络能访问到 192.168.1.115因为 Dify 跑在 docker 里如果 MindIE 在宿主机用宿主机 IP 而不是 127.0.0.1。第四个调用返回 401。Dify 里 OpenAI-API-compatible 的密钥字段虽然 MindIE 不校验但不能留空随便填个字符串留空有些版本会直接判 401。第五个返回体里reading choices报错或解析失败。这是接口格式不匹配确认 MindIE 的 openAiSupport 设成了 vllmDify 里 URL 带 /v1 后缀模型名和 MindIE 的 modelName 完全一致。第六个量化时报 NPU 显存不够。双卡容器量化 32B 模型确实吃紧换 8 卡容器或者加 --device_type cpu 用 CPU 量化慢但稳。第七个嵌入服务容器起来但请求无响应。检查 TEI_NPU_DEVICE 指定的卡有没有被其他容器占用同一张卡不能挂两个容器会报错。另外个别卡和宿主机有权限问题可以进容器手动 bash start.sh 模型路径 IP 端口 启动看日志。如果你不想在本地维护这套昇腾推理环境或者想先用云端 API 把 Dify 的 RAG 流程跑通再迁到本地可以先用 TaoToken 的模型对话服务验证提示词和知识库切分策略接入文档里有 OpenAI 兼容的 Base URL 和 Key 申请方式等本地 MindIE 调通了再把渠道切过去这样排障压力小很多。6. 双实例负载均衡与 one api 渠道配置单实例跑通后上双实例做负载均衡。思路很简单再起一个 MindIE 实例绑另外两张卡暴露不同端口然后用 one api 把两个实例配成同一模型的两个渠道请求会自动分发。第二个实例的 config.json 复制一份改三个地方port 改成 1026或别的空闲端口npuDeviceIds 改成 [[2,3]]对应另外两张卡modelName 保持一致这样 one api 才能把它们当成同一个模型。启动方式和第一个实例一样。one api 这边进渠道管理新建渠道类型选 OpenAIBase URL 填 http://192.168.1.115:1025/v1模型填 DeepSeek-R1-Distill-Qwen-32B-W8A8密钥随便填。再建一个渠道Base URL 填 http://192.168.1.115:1026/v1模型名相同。两个渠道都启用后one api 会按权重轮询分发请求。验证负载均衡是否生效最直接的办法是压测。用脚本并发打 one api 的 /v1/chat/completions同时观察两个 MindIE 实例的日志和 npu-smi 的利用率。如果两个实例都在处理请求说明分发成功。也可以临时停掉一个实例看请求是否自动切到另一个验证故障转移。Dify 这边把模型供应商的 URL 从直连 MindIE 改成指向 one api 的地址比如 http://192.168.1.115:3000/v1模型名不变。这样 Dify 的所有请求都经过 one api 分发前端无感知。如果你用的是 Coding Plan 这类长期编码或 Agent 场景把 one api 作为统一入口会更方便管理多模型和多实例。几个负载均衡的调优点one api 渠道的权重可以按实例算力分配比如两张卡强一点就设高权重MindIE 的 maxBatchSize 和 maxPrefillBatchSize 要根据实际并发调设太小吞吐上不去设太大显存爆压测时关注首 token 延迟和吞吐两个指标双实例的意义就是把并发压力摊开。最后说个实际经验昇腾这套链路版本耦合很紧驱动、CANN、MindIE、镜像版本要成套升级任何一个都要重新验证。我建议把当前能跑通的版本组合记下来包括驱动 23.0.0、MindIE 镜像 tag、Dify 0.15.3下次重装直接照抄能省掉大量排障时间。知识库文档格式方面Dify 默认的 ETL 对复杂格式支持有限如果文档里有大量表格和 PPT可以把 ETL_TYPE 改成 Unstructured起一个 unstructured 容器接进去解析质量会好不少。
返回列表