首页 / 资讯中心 / 文章详情

从裸机到推理服务:国产NPU服务器GPU编排平台部署实战

从裸机到推理服务:国产NPU服务器GPU编排平台部署实战 ★ FEATURED ARTICLE
先说明一下这篇指南里的目标机型我用“IA服务器”代指方案本身我用“GPU编排平台”代指省去中间各种商标和型号的纠结。之所以取这个标题是因为我最近真刀真枪在一台IA服务器上把这套开源的GPU编排平台跑通了从裸机到能对外提供推理服务中间踩的坑比我想象中多得多。网上关于这个组合的资料要么模棱两可要么直接绕开国产NPU只讲普通显卡真正能照着抄作业的不多。所以这篇我打算写成保姆级从硬件清点、驱动核对、服务端安装、节点纳管、跑通模型推理到问题排查和性能调优全部走一遍真实流程。适合手里正好有国产加速卡、想把卡池化交给团队共享的同学也适合刚接触这类平台、想了解部署全貌的新手。1. 方案与场景一台加速服务器怎么变成团队可用的算力池1.1 目标场景与需求拆解先聊聊我为什么要折腾这套东西。我们团队有10来个人手里有一台双路服务器插了8张国产AI加速卡算力规模说大不大说小不小。最开始大家各用各的谁要跑训练谁自己写脚本申请然后手动切卡、手动销毁环境。维护成本高不说资源利用率也很差。经常出现一个人占了4张卡跑实验另外几个人排队等卡的情况到了晚上大家下班了卡又在空转。我需要的是一个“算力池”的概念把8张卡统一注册到一个平台上平台负责分配、隔离、调度。不同的人提交任务时平台自动挑选空闲的卡哪怕每张卡被拆成多个小实例也没问题。团队里权限分开谁能看到哪些卡、能跑多大显存的任务都由管理员统一配置。这个需求听起来很重其实用一个轻量级的开源GPU编排平台就能搞定不需要上整套K8s也不需要专职运维。1.2 为什么选开源编排平台而不是自研脚本或重K8s在真正动手之前我也做过方案对比。自研脚本的坑太明显了多用户并发、权限隔离、显存超卖、单卡故障处理每一条都要自己造轮子造完还不一定稳。直接上K8s加GPU插件又太重光维护控制平面就得单独一个精力而且我们的场景主要是模型推理和中小规模训练不需要那么复杂的工作负载编排能力。这个开源编排平台的优势在于三个点。第一架构简单一个服务端加若干个代理端代理端把本机的卡信息上报给服务端服务端对外提供统一入口学习成本很低。第二它天然支持“把一张卡拆成多个小卡”的调度能力可以给不同任务划分不同的显存和算力配额。第三社区活跃度不错遇到问题有地方查。还有一点很关键它对国产NPU的适配情况在社区里已经开始有人讨论了基于通用设备接入的思路适配起来比想象中好操作。这里插一句如果你的服务器只有英伟达卡那是开箱即用的部署难度会低一半。但像我这样折腾国产IA服务器需要额外处理驱动识别和设备映射后面第3部分我会详细讲。1.3 IA服务器上部署的最大变数NPU识别和驱动IA服务器和普通x86服务器最大的区别就是它带了一组专用AI加速卡。这类卡本身有自己的一套驱动栈和用户态库跑推理时还需要独立的环境变量来切换算子库。这套编排平台本来是为通用GPU设计的它默认走的是显卡那套识别逻辑读卡的数量、显存大小、利用率等指标。要让平台认识国产NPU得额外做一层“适配桥接”。我理解这层适配的本质是让平台在枚举设备时看到的还是那个“标准设备对象”只是底层的健康检查、显存读取、进程注入手段换成了NPU自己的命令。比如查卡状态用npu-smi类似的工具指定设备时用设备节点路径切计算资源主要靠平台自身的容器隔离能力。换句话说NPU的适配不是推翻平台而是在平台和硬件之间加几行配置。搞清楚了这一点后面所有部署动作其实都有思路可循。注意部署前一定要确认IA服务器上的NPU驱动和固件和操作系统版本匹配。很多卡不被识别的案例起因不是平台配置错而是驱动版本本身就装错了。后面第2部分我会给出一个核对流程。2. 部署前准备硬件清单、驱动核对与目录规划2.1 硬件与驱动规格核对表上手之前先把硬件情况摸清楚能省掉后面90%的排查时间。我的做法是列一张表逐项打勾。核对项需要记录的内容我的实际值举例服务器型号品牌、型号、CPU颗数、内存大小IA服务器双路512GB内存NPU卡型号加速卡型号、数量、显存大小8张单卡64GB驱动版本驱动包版本、固件版本、安装路径驱动22.x固件22.x操作系统发行版、内核版本、架构社区版Linux内核5.10x86_64依赖库Python版本、容器运行时、curl等Python 3.10已装容器运行时网络环境管理IP、对外服务端口、内网互通情况管理网和业务网分离端口8080对外开放这块我吃过大亏。当时驱动版本和固件版本有一项对不上结果NPU卡在系统里偶尔能识别、偶尔掉线平台这边看到的卡数一会8张一会6张排查了整整一个晚上。后来发现是固件和驱动配套版本不兼容重新安装匹配版本后问题消失。建议安装完驱动以后先把驱动自带的查询命令跑一遍确认所有NPU卡都稳定在线再往下走。2.2 网络端口、存储路径与安全策略网络规划没那么复杂但必须提前定好。服务端需要监听一个端口我会建议先用8080或者自定义端口不要用默认值避免跟服务器上已有的业务冲突。代理端到服务端走的是HTTP或单向连接不需要额外开很多端口代理端主动上报给服务端反向连接和主动注册的逻辑由平台自动完成。这一点特别适合跨内网分段部署省去了很多麻烦。存储路径也需要想清楚。服务端的数据目录建议放在大容量数据盘上比如/data/gpu-stack里面会存放用户、令牌、任务记录等模型文件建议单独放一个目录让平台能直接读取宿主机挂载进来的模型仓库。代理端最好也统一一个目录存放日志和临时缓存否则后面查日志时日志散在各个家目录下会很痛苦。安全策略方面最基本的几条服务端端口不直接暴露公网前面套一层内网反向代理或者只对办公网段开放管理页面设置强密码如果有多台节点服务端和代理端的通信令牌要妥善保管不要外泄。平台本身有Token体系和用户分权能力但那是应用层安全网络层的隔离还是要自己做。2.3 先把单机NPU环境跑通验证驱动的三个命令这一步是保姆级部署的关键前置条件。我给你一套极简验证流程每条命令都代表一类检查。查看加速卡设备列表。执行这类命令应该列出所有NPU卡编号、名称、驱动版本。如果发现卡的数量不对或者有Failed字样先修驱动再继续。查看设备健康状态和能耗。或类似的工具能看到每张卡的实时利用率、内存占用。正常情况下卡的利用率是0%内存占用也很低。跑一个临时容器在你的容器运行时里加入NPU设备的映射参数在容器内执行第一步的命令。这一步验证的是运行时能不能穿透设备给容器。这三步跑通说明从系统层到虚拟化层都通。后面平台的代理端本质上也是通过类似语义做设备映射前置环境稳部署就成功了一半。实操心得不要在一个节点上一次性插满8张卡来测试驱动我第一次图省事一股脑全插结果系统日志刷屏反而找不到到底哪张卡有问题。先插一张卡验证单卡环境确认无误后关机再插满。3. 手把手实操服务端安装、节点纳管与首个推理任务3.1 服务端部署下载、初始化与启动先到项目仓库把服务端二进制或者容器镜像拉下来。这一步没什么技术含量但注意选择正确的架构版本IA服务器通常是x86_64不要下错arm版。服务端支持两种方式二进制直接跑或者容器方式跑。我建议正式环境用二进制方式少一层容器嵌套排查问题更快。下载完成后先给它一个数据目录比如mkdir -p /data/gpu-stack ./gpu-stack-server --data-dir /data/gpu-stack --listen :8080 --token my-secret-token这里有个重要的参数token。它是服务端和代理端之间、用户登录时使用的基础凭证。初始化服务端后在页面上创建一个管理员账号进入管理后台就能看到当前节点列表还是空的。接下来要做的就是把NPU服务器作为节点纳管进来。启动服务端之后最好先确认一下进程日志有没有异常访问管理页面能不能正常出来。如果页面打不开优先排查端口占用和防火墙规则。这一步卡住的话后面全白搭。3.2 纳管IA服务器代理端安装与设备映射在IA服务器上安装代理端是整套流程里最需要仔细的地方。我的做法是把代理端安装包传到服务器上执行安装命令。安装过程中代理端会尝试自动检测当前机器上的加速设备。检测的原理是遍历设备节点目录、读取设备状态然后把结果上报给服务端。对上国产NPU检测脚本可能会漏因为它们的设备命名跟通用显卡不一样。解决办法是在代理端配置里手动指定设备发现方式。实际操作中我用的是“自定义设备映射”方案把NPU卡的设备节点全部列进代理端的设备参数里再指定调用健康检查的命令让平台把每张卡当作一个独立的加速设备来管理。配置完成后重启代理端再到服务端页面看节点状态。正常情况下页面会显示这台服务器、卡的数量以及每张卡的显存和空闲状态。如果代理端报告设备数为0不要急着怀疑平台先用系统命令确认设备节点是不是真的在预期路径下。我之前遇到过一次代理端起来后设备数一直为0排查半天发现是系统里多装了一个老版本驱动设备节点路径被老驱动占用新驱动注册不进去。卸载老驱动、清理干净设备节点后重启代理端就好了。3.3 让一台“卡”真正可被调度显存划分与任务下发设备纳管之后平台已经“看见”了卡。但要让团队真正用起来还需要理解平台的调度模型。它允许管理员给每张卡设置虚拟显存配额也就是把一个物理卡切成多个逻辑卡。切分粒度可以按百分比也可以按绝对显存大小。我在实际配置时把8张64GB的卡按照团队需求做了一张“卡池策略表”卡编号切分数量单实例显存适用场景0-3号卡每张2实例30GB中型模型推理、微调实验4-6号卡每张4实例15GB小模型并发推理、测试任务7号卡不切分64GB大模型训练预留这里的切分动作全部在管理页面操作不需要改配置文件。切分是否真的有效取决于平台是否通过显存隔离来调度任务。如果底层实现是靠进程分配显存那么同一张卡上两个实例之间确实能做到互不抢占。我在实测中两个30GB实例同时跑模型显存分别锁在各自配额内没有再出现互相挤爆的问题。3.4 从0到1跑通一个推理任务的完整流程平台搭好以后第一个推理任务往往是试金石。我以跑一个常见的图片分类模型为例拆解完整流程。第一步把模型权重放到宿主机模型目录比如/models/my-model.bin。第二步在管理页面创建推理服务选择使用哪个模型、需要几张卡实例、每个实例多大显存。第三步平台会自动在对应的卡实例上拉起来一个容器容器内加载模型并监听推理端口。第四步通过HTTP接口发一个图片请求观察返回结果。如果页面提交后任务一直是Pending状态大概率是资源不足比如没有空闲实例可分配。这时回到节点页面看卡的剩余显存曲线确认切分配额后确实有可用空间。整个流程跑通后团队其他人只要拿到服务地址就能直接调用不再关心底层卡被谁占用。注意这里我说的都是通用的操作路径实际产品界面的按钮名和字段可能会有些差异。但核心思路是一致的模型入库、选择资源、提交服务、调用验证。照着这个思路界面再变也不会迷路。4. 部署中的三座大山卡不被识别、任务卡死、性能减半的排查实录4.1 第一座大山卡没被识别现象代理端状态是Online但设备列表为空。我遇到过两种原因。一种就是设备节点路径不对平台默认去找设备目录而国产NPU的设备节点在另一个路径下需要通过映射参数指定正确路径。另一种是权限问题代理端服务运行的系统账户没有权限访问设备控制文件。排查顺序非常固定先看系统有没有设备节点再看代理端日志里枚举设备时报什么错最后手动用系统用户跑一遍设备查询命令。如果查询命令报Permission Denied说明要调整服务运行用户或者设备节点的权限组。把代理端关掉将运行用户加入设备访问组再重启代理端问题基本能解决。4.2 第二座大山任务提交后一直Pending现象任务创建了但一直排队不运行。这个问题的核心是调度器认为资源不满足。我遇到过一种很隐蔽的情况平台显示卡的空闲显存是30GB但实际任务要求至少31GB就差这1GB调度器不给放行。所以表面上“看起来有空闲”实际上一直不满足条件。解决办法是动态调整任务显存要求或者把卡实例切分成更大的块。另外有些平台在调度时还会检查CPU核数、内存大小这类额外参数就曾经遇到过卡够但容器内存不够的情况。遇到Pending任务直接点开任务详情看调度日志里面会写清楚缺什么资源照着补就行。4.3 第三座大山推理性能只有预期一半这是最让人头疼的。任务能跑结果也对但吞吐量只有预期的一半甚至出现单卡多实例互相拖慢的情况。我推测是算力没有做好隔离或者调度时把同一张卡的触发任务都压到了同一个计算核心上。后来我强制把任务分布在多张物理卡上跑性能立刻恢复正常。如果是多卡通信的场景性能减半往往和卡间通信拓扑有关。平台对多实例调度时默认不一定最优会分配到通信路径较远的组合上。针对这个问题我在平台里手动把设备集合做了分组同一组内的卡必须物理相邻通信延时就低很多。设置之后多卡推理任务的稳定性和吞吐都有明显提升。4.4 常见问题速查表现象可能原因排查思路代理端在线但设备数为0设备节点路径不对、用户权限不足检查设备节点手动执行设备查询命令调整运行用户任务一直Pending显存、内存、CPU配额不满足看任务日志确认剩余资源是否满足要求推理速度只有一半算力没有隔离、卡间通信拓扑不优调整调度策略按物理拓扑分组多任务打散到不同物理卡NPU卡在线数不稳定驱动与固件版本不匹配重新安装配套驱动和固件清理老驱动页面打不开端口占用、防火墙未放行检查监听端口调整防火墙规则容器内无法访问NPU容器映射参数缺失重新配置设备映射重启容器这份速查表其实是我踩坑过程中的顺手记录后面部署第二台、第三台服务器时直接拿着表比对效率高了很多。实操心得排查问题的顺序一定是“自下而上”先系统层再平台层最后应用层。很多人一上来就翻平台日志结果问题出在系统驱动白忙活。我的习惯是做一次问题定位先把NPU卡在系统里是否正常跑一遍确认没问题后再往上看平台。5. 多卡调度与性能调优的实战心得5.1 多卡任务调度从单机单卡到单机多卡IA服务器装了8张卡最大的价值就是多卡并行。但平台默认的调度策略不一定最优。我做了几个实验同一个模型分别跑在1张、2张、4张卡上记录每秒处理请求数。结果发现一个反直觉的现象不是卡越多越快。2张卡时吞吐比1张提升接近1.8倍但4张卡时只比2张提升1.3倍再往上增加反而波动更明显。原因在于模型本身的并行策略、通信开销、以及卡间互联带宽共同作用。所以实际操作时我会用“先测后调”的方式不是盲目把一张卡切成很多小实例而是根据模型对显存和通信的需求决定用整卡还是切分。5.2 吞吐与延迟的调优参数并发、批大小、实例数推理服务的调优核心就三个旋钮请求并发数、批处理大小、实例数量。我在平台里对同一个模型跑了十几组对比最终得到一个比较稳的参数组合参数推荐值说明单实例批大小8-16批太大延迟会明显升高批太小吞吐上不去并发请求数与实例数持平或略高并发过高时队列排队反而拖高延迟实例数量按显存和模型需求折中宁可少切不要切得太碎我遇到过一个小经验当并发请求数大于实例数时平台内部会把请求排队这时平均延迟上升不明显但尾部延迟会急剧恶化。如果业务对P99延迟敏感建议预留至少30%的实例余量。说白了不要把一个卡池用满留点缓冲。5.3 日常运维脚本状态巡检、日志清理、备份部署完成只是开始日常运维才是持久战。我自己写了一套极简脚本每天定时跑一遍内容包括三类任务。第一是巡检通过平台API拉取节点状态统计空闲卡数、当前任务数、异常任务数发到告警群里。第二是日志清理平台日志和容器日志会持续增长我设置每3天清理一次超过7天的日志文件避免把系统盘塞满。第三是备份服务端的数据目录很小我每天打包一次滚动保留最近7份。这套组合下来基本能做到“不出现故障不知道一出现故障能快速回滚”。5.4 我把这套方案复用到其他场景的体会这套方案折腾完以后我不但把这台IA服务器纳进了平台后来又陆续把一台老的普通GPU服务器也加了进来。平台本身对异构设备的管理能力比我想象中好只要设备能被系统识别理论上都能通过设备映射纳管进来。最近团队里有人问我能不能把开发用的小测试卡也纳管进来我专门试了一下。配置思路完全一样确认驱动、映射设备节点、给代理端授权。区别只是卡的算力小适合分给小任务用不适合跑大模型。实践证明这套编排平台的抽象层设计足够通用国产NPU能用普通卡也能用统一抽象成“算力资源”对外提供一致的接入体验。我个人在实际操作中的体会是部署这东西最难的不是命令本身而是理解每一层组件之间的关系硬件驱动让系统认识卡代理端让平台认识卡调度器让用户用上卡。一旦你顺着“硬件层-平台层-用户层”这条线去理解遇到任何问题都能快速定位不会再被日志里的各种表象牵着走。如果这篇指南能让你少走几个弯路那我这一晚上的折腾就没白费。
阅读完成 · 觉得有帮助?
咨询建站