尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

昇腾NPU上部署Dify:国产算力跑通LLM应用全链路

昇腾NPU上部署Dify:国产算力跑通LLM应用全链路 简介面向国产昇腾推理服务器与加速卡的大模型部署场景该可运行源码包提供了在华为硬件上搭建Dify平台的完整参考。内容涵盖大模型推理引擎MindIE以及Embedding、Rerank组件的部署测试并给出Qwen模型在双卡环境下的配置与验证结果包括实际运行效果和显存占用情况适合需要将Dify接入国产AI算力的开发者和运维人员。资源共两个文件包括项目配置和说明页面整体仅四KB轻量便携可对照源码快速梳理部署步骤规避镜像启动、模型调用等常见问题也适合用于国产化部署方案的预研与最小验证。已有八十六人学习下载可作为昇腾环境下部署Dify的起步模板帮助节省环境调试时间快速验证国产化平台运行大模型应用的可行性。 最近把Dify完整跑在了华为昇腾环境里前后折腾了小一周终于把从应用编排到模型推理的整条链路打通了。Dify本身是个开源智能体平台负责工作流编排、知识库管理、Agent对话这些事情昇腾是国产AI芯片负责真正的模型推理。这两个放在一起就构成了一套完全跑在国产算力上的LLM应用底座。写这篇文章主要是因为有类似需求的人其实不少但网上能查到的资料要么是Dify接OpenAI官方接口要么是接国外推理框架针对昇腾的完整实操记录非常少。如果你手里有昇腾开发板、训推一体机或者服务器想把Dify这类平台跑起来做私有化智能体应用这篇内容可以直接照着做。我会把环境配置、源码部署、模型对接、常见坑全部梳理一遍尽量做到每一步都说得明白。1. 部署前先看全局这套组合到底需要哪些角色1.1 Dify在整条链路里扮演什么角色先说清楚一个容易搞混的概念Dify不是一个模型推理引擎它不直接调用NPU也不负责跑大模型的forward过程。它是一个LLM应用开发与编排平台提供的是对话应用、工作流、Agent、知识库、工具调用、模型管理这些层能力。你可以把它理解成餐厅的前台和后厨之间的传菜员——它负责接单、配菜、安排出餐流程但真正炒菜的后厨得另外找。所以部署Dify这件事天然分成两半一半是让Dify自己的Web服务、API服务、数据库、缓存跑起来另一半是准备一个可以被Dify调用的模型推理服务。Dify通过OpenAI兼容的接口格式把用户的请求转发给推理服务拿到结果后再做后续的工作流处理和展示。这个认知很重要因为我见过不少人在部署的时候Dify页面起来了但一问模型就报错到处找问题最后发现是推理服务那一半压根没配。下面所有的部署工作都是围绕这两半来展开的。1.2 昇腾侧推理方案怎么选昇腾上跑推理目前主流的有三条路MindIE、vLLM-Ascend、以及llama.cpp在昇腾上的移植版本。这里面我实际用的是MindIE也就是华为官方提供的昇腾推理引擎。选择理由很简单它跟CANN底层的适配最深多卡并行、量化、连续批处理这些关键特性都做得比较完善而且官方会提供配套的容器镜像和部署文档对于生产环境来说是最稳的选项。vLLM-Ascend我也试过它在API接口风格上跟原版vLLM几乎一致用惯了vLLM的人上手更快但当时我在模型权重格式转换和设备映射上遇到了一些麻烦版本匹配没有MindIE那么直觉。llama.cpp那条路适合轻量级、低资源场景但功能完整度和并发能力偏弱用于Dify这种需要稳定服务化调用的场景不是首选。所以最终架构是Dify的api服务和web前端跑在应用层后端接MindIE启动的推理服务模型跑在昇腾NPU上中间走OpenAI兼容的HTTP接口。这样一个组合既能保留Dify完整的工作流编排能力又能把算力底座换成国产芯片整个链路可控性非常强。2. 环境和软件栈准备一步错步步错2.1 硬件与系统要求先说硬件。昇腾设备目前在市面上比较常见的是910B系列和310P系列310P算力偏入门适合跑7B左右的模型做轻量推理910B性能强很多跑14B甚至更大模型、或者需要较高并发的时候建议直接上910B。显存方面7B模型用FP16精度大概需要16GB以上显存加上推理过程中的KV Cache和中间激活值单卡32GB会比较从容。如果你的模型更大或者想跑长上下文最好上多卡或者直接选更大显存的型号。系统层面官方对openEuler和Ubuntu的支持比较好我用的Ubuntu 22.04 LTS整体很顺利。内存建议至少64GB因为除了模型本身前端构建、后端服务、中间缓存都要吃内存如果机器配置太低后面编译前端的时候容易直接被OOM干掉。存储建议准备至少100GB可用空间Dify源码、依赖包、模型权重文件加起来体积比你想象的大得多。2.2 驱动、CANN、MindIE的版本配对昇腾这套软件栈最让人头疼的其实是版本配对。驱动、固件、CANN Toolkit、MindIE每一个都有版本号而且它们之间必须匹配不能随便乱装。这一点跟CUDA生态不太一样CUDA至少是向下兼容的昇腾这边版本不匹配轻则某个API找不到重则设备直接识别不到。操作顺序是这样的先装NPU驱动和固件再装CANN Toolkit最后装MindIE。驱动安装一般是一个.run文件以root权限执行后用npu-smi info这个命令检查芯片是否被系统识别。如果这个命令能正常列出昇腾芯片的型号、显存、温度这些信息说明驱动层已经通了。接下来设置环境变量把CANN和MindIE的库路径加进去source /usr/local/Ascend/ascend-toolkit/set_env.sh source /usr/local/Ascend/mindie/set_env.sh这一步很多人会漏。尤其是直接用systemd或者脚本启动服务的时候如果忘了source环境变量后面跑模型服务会报一堆libascendcl.so找不到之类的错但其实库都是装好的纯粹是环境变量没生效。版本方面我举一个我实际用过的组合NPU驱动23.0.rc1 CANN 8.0.RC1 MindIE 1.0.RC2跑Qwen2.5系列没有问题。不同型号的昇腾芯片驱动包不一样千万别装错。拿不准的时候去查官方发布的兼容矩阵比对好芯片型号和系统版本再选包这一步能省下大量排查时间。3. 获取可运行源码把Dify应用层搭起来3.1 源码部署还是容器部署Dify官方推荐的是Docker Compose方式一行命令拉起所有依赖很省事。但在昇腾环境里我更推荐源码方式部署。原因是推理服务通常也需要在容器或者特殊环境里跑如果Dify本身用Docker要考虑容器网络、NPU设备映射、环境变量传递一堆问题调试起来非常绕。源码部署的话所有进程都在宿主机上日志直接在终端里刷哪里出错一眼就能看到。Dify的源码可以从GitHub官方仓库拉取。拿到源码后先看目录结构重点是有三个api是后端Python服务web是前端Next.js应用docker里面是各个依赖组件的编排文件。源码部署本质上就是先把api跑起来再把web构建出来跑起来中间依赖PostgreSQL、Redis这两个基础组件。3.2 后端服务和依赖组件启动后端和依赖组件的顺序我建议是先起PostgreSQL和Redis再起Dify的api服务。数据库和缓存如果直接用源码方式不好装可以偷懒用Docker把这两个组件先跑起来业务进程保持源码方式这样兼顾了调试便利和依赖管理的省心。大致步骤是# 启动PostgreSQL和Redis容器 docker run -d --name dify-pg -p 5432:5432 \ -e POSTGRES_PASSWORDdifyai \ -e POSTGRES_DBdify \ postgres:15-alpine docker run -d --name dify-redis -p 6379:6379 redis:7-alpine然后进入api目录创建虚拟环境安装Python依赖cd api python3 -m venv venv source venv/bin/activate pip install -r requirements.txt依赖安装这块有个经验如果网络环境比较慢千万别硬等配置好镜像源再装。Dify的依赖列表里有不少重量级包直接装可能要半小时以上用国内镜像源能快很多。接下来需要配置环境变量。源码目录里有一个.env.example文件先把它复制成.env然后重点改几个值数据库连接地址、Redis地址、以及SECRET_KEY。SECRET_KEY是Dify用来加密会话和敏感信息的随便生成一串随机字符就行但不要用默认值。改完之后执行数据库迁移flask db upgrade这个命令会把Dify的所有数据表结构初始化到PostgreSQL里。如果这里报错九成是.env里的数据库连接地址写错了或者PostgreSQL没起来。3.3 前端构建与整体启动后端跑起来之后还需要启动前端。前端是Next.js项目依赖pnpm管理先确认环境里有Node.js 18或20版本太老或太新都可能出问题。构建命令如下cd web pnpm install pnpm build pnpm start前端构建的时间取决于机器性能一般在五到十分钟左右。构建完成后pnpm start会默认监听3000端口这时候浏览器访问http://localhost:3000就能看到Dify的安装引导页面了。首次访问会让你设置管理员邮箱和密码走完引导平台主体就算部署完成。到这里Dify应用层已经通了但还差最关键的模型推理服务。下一步是把昇腾上的MindIE跑起来再让两边对接上。4. 昇腾推理服务的配置与模型对接4.1 用MindIE启动一个开源模型服务模型选型上我以Qwen2.5-7B-Instruct为例这个模型在昇腾上的适配情况比较成熟效果也不错。你要做的第一件事是拿到模型权重文件可以是HuggingFace格式的原始权重。MindIE支持直接加载这类权重但如果追求更高推理性能可以先把它转换成MindIE IR格式转换这一步官方提供了工具和文档这里不展开直接启动的话用原始权重也没问题。启动推理服务前先确认显存和模型占用情况可以用npu-smi info查看。然后通过MindIE提供的启动脚本指定模型路径、设备编号、上下文长度这些参数mindie --model /data/models/qwen2.5-7b-instruct \ --port 8000 \ --device 0 \ --max-seq-len 4096参数含义说一下--model指定权重目录--port是服务监听端口Dify之后会通过这个端口来访问--device指定使用哪张NPU卡多卡机器从0开始编号--max-seq-len是最大序列长度这个值决定了模型能处理多长的上下文但也会直接影响显存占用不是越大越好。启动之后可以用curl快速验证服务是否正常curl http://127.0.0.1:8000/v1/models如果返回一个包含模型名称的JSON列表说明推理服务已经就绪。这一步成功昇腾上的模型推理就算是跑通了。4.2 在Dify后台配置自定义模型供应商推理服务就绪后接下来让Dify认识它。登录Dify管理后台进入“设置”里的“模型供应商”页面选择添加自定义模型接口格式选OpenAI API兼容。这里需要填几个关键参数Base URL填推理服务的地址例如http://127.0.0.1:8000/v1API Key填一个占位符就行比如EMPTY因为MindIE服务本身不做鉴权模型类型选LLM模型名称填你在MindIE启动时指定的模型ID比如qwen2.5-7b-instruct上下文长度根据你启动服务时设置的--max-seq-len来填建议保守一点填比实际值稍小配置完成后先别急着用点一下“测试”按钮确认连通性。如果测试通过说明模型对接成功。如果失败最常见的原因是Base URL没拼对检查一下是不是少了/v1后缀。如果你后续还要用知识库功能记得在同一个页面再添加一个Embedding模型。知识库做文档分段和向量化的时候需要用到Embedding模型来把文本转成向量没有它上传文档后检索会直接报错。Embedding模型可以选一个小尺寸中文模型比如bge-large-zh同样按OpenAI兼容格式配置。4.3 创建应用进行端到端验证这些都配置好之后最后做一个端到端验证。在Dify首页创建一个新的对话应用在提示词编排页面把模型切换到刚才配置的模型然后直接在调试框里输入一句话比如“用一句话介绍你自己”如果模型能正常回复恭喜整条链路已经通了。我第一次跑通的时候看到回复刷出来还是有点感慨的。从浏览器里的Dify界面到后端的API服务再到昇腾NPU上的推理进程整条链路中间跨越了好几个软件层每一步都有坑但打通之后的体验非常顺滑。后面你完全可以基于这个底座去搭建自己的工作流、Agent、知识库问答应用。5. 实际部署中踩过的坑和排查方法5.1 高频问题速查表这部分我把部署过程中遇到的高频问题和排查思路整理成了一张表希望能帮你快速定位问题。很多问题不是配置复杂而是出错的地方和表象离得太远让人想不到。现象可能原因排查和解决前端页面能打开但对话一直转圈无响应推理服务没启动或Dify模型配置错误先确认MindIE服务进程是否在跑再用curl直接请求推理服务看是否返回结果模型返回401或认证失败API Key配置问题MindIE不校验key填EMPTY之类的占位符即可不要留空请求推理服务时报连接拒绝Base URL或端口配置不对检查Dify后台填的地址确认端口和MindIE启动时一致注意有没有遗漏/v1模型加载到一半进程退出显存不足或权重文件路径错误回头看npu-smi info显存占用降低max-seq-len或换成量化权重数据库迁移失败PostgreSQL连接信息错误检查.env里的数据库地址、端口、用户名和密码确认PostgreSQL容器状态环境变量找不到运行时报动态库错误启动时没有source昇腾环境变量确认source /usr/local/Ascend/ascend-toolkit/set_env.sh并检查启动脚本中的环境变量多卡机器上模型始终跑在0号卡未指定设备编号在MindIE启动参数中通过--device指定目标卡号5.2 几个不容易注意但很关键的经验除了表里的这些问题还有几个经验想单独说一说。第一个是版本一致性。昇腾这套软件栈驱动、CANN、MindIE三个版本必须严格匹配。我见过一个比较典型的场景用户CANN装的是8.0但MindIE还是老版本结果跑推理服务的时候各种莫名其妙的行为有的接口报错有的参数不生效。后来升级MindIE到对应版本问题全消失了。所以拿到一个新环境第一时间把三个版本号列出来比对兼容矩阵确认没问题再动手。第二个经验是关于日志的。Dify的api服务日志、MindIE的推理日志你都要知道在哪看。排查问题最怕的就是只在Dify界面看到一个大大的错误提示无从下手。我第一次遇到对话无响应时爬上服务器把journalctl翻了一通又看了api服务的输出才发现是MindIE服务的进程不知什么原因退了。从那以后我把推理日志统一输出到固定文件Dify后端也保持前台运行出问题几秒钟就能定位。第三个经验源码部署不要手动硬扛进程管理。直接用systemd或者Supervisor把api服务和web服务管起来设置好环境变量、启动命令、开机自启。这样即使某个进程异常退出也能自动拉起不用每次都手动跑到命令行里敲命令。尤其是生产环境这个方法能省非常多的事。最后说一个容易被忽略的小地方知识库的Embedding模型尽量选小尺寸的比如bge系列的中等版本。因为Embedding模型和对话模型共用NPU显存主模型已经吃掉了一大半如果再放一个大尺寸Embedding模型很容易把显存挤爆。小尺寸Embedding模型在检索效果上差距不大但对显存的压力会小很多整体运行会更从容。我个人实际操作下来的体会是这套组合跑通之后日常用来搭工作流、做企业知识库问答、甚至跑一些轻量级Agent应用完全够用。整个过程虽然有不少坑但只要把环境版本对上、部署顺序理清、模型接口接好后面再用起来就非常顺手了。还有一个建议是第一次部署最好在终端前台启动服务看着日志一步一步过不要急着做后台化。一旦整条链路验证通过再考虑用systemd做成服务托管这样既能保证可维护性也能避免在出错时被一堆间接信息带偏方向。本文还有配套的精品资源点击获取
返回列表