当前位置: 首页 > news >正文

CANN-昇腾NPU-推理服务高可用-怎么做到99.99%可用性

  1. 99% 可用性意味着一年宕机时间 < 53 分钟。推理服务要做到这个指标,需要解决:NPU 故障、OOM、网络中断、版本回滚失败。这篇讲在昇腾NPU上的具体做法。

可用性计算

99.9% = 8.76 小时/年 99.99% = 52.6 分钟/年 99.999% = 5.26 分钟/年
  1. 99% 是多数在线服务的目标。99.999%(金融级)需要多机房容灾。

故障域隔离

隔离级别 1:进程级

# 每个推理请求在独立进程处理frommultiprocessingimportProcess,Queuedefworker(queue_in,queue_out,device_id):model=LLM("model_id",device=f"npu:{device_id}")whileTrue:req=queue_in.get()result=model.generate(req.prompt)queue_out.put(result)# 主进程负责调度,worker 崩溃不影响其他 worker

某个请求导致 NPU 崩溃(如 OOM),只影响当前 worker,主进程重启它即可。

隔离级别 2:容器级

# 每个 NPU 一个容器 FROM cann:8.5 # 只暴露推理端口 EXPOSE 8000 # 健康检查 HEALTHCHECK --interval=10s --timeout=5s \ CMD curl -f http://localhost:8000/health || exit 1

Kubernetes 的 Pod 健康检查失败 → 自动重启容器 → 30 秒内恢复。

隔离级别 3:机器级

Load Balancer (SLB) ├── 机器 A(8 卡)→ 容器 1-8 ├── 机器 B(8 卡)→ 容器 9-16 └── 机器 C(8 卡)→ 容器 17-24

某台机器宕机,LB 把流量切到另外两台。需要 3 台机器才能达到 99.99%(1 台宕机不影响服务)。

健康检查

检查项 1:NPU 是否正常

fromfastapiimportFastAPI,HTTPException app=FastAPI()@app.get("/health")defhealth_check():try:# 检查 NPU 是否可访问torch.randn(1,device="npu:0")return{"status":"ok"}exceptExceptionase:raiseHTTPException(status_code=503,detail=str(e))

检查项 2:模型是否加载完成

model=None@app.on_event("startup")defload_model():globalmodel model=LLM("model_id",device="npu:0")@app.get("/health")defhealth_check():ifmodelisNone:raiseHTTPException(status_code=503,detail="Model not loaded")# ... 检查 NPUreturn{"status":"ok"}

检查项 3:推理是否正常

@app.get("/health")defhealth_check():# ... 前面的检查try:# 用简短 prompt 测试推理result=model.generate("Hi",max_new_tokens=5)iflen(result)==0:raiseException("Empty output")exceptExceptionase:raiseHTTPException(status_code=503,detail=str(e))return{"status":"ok"}

优雅降级

NPU 故障时,降级到 CPU 推理(慢但可用):

classFallbackLLM:def__init__(self,model_id):try:self.model_npu=LLM(model_id,device="npu:0")self.npu_available=Trueexcept:self.npu_available=Falsedefgenerate(self,prompt,**kwargs):ifself.npu_available:try:returnself.model_npu.generate(prompt,**kwargs)except:self.npu_available=False# 降级到 CPUifnothasattr(self,"model_cpu"):self.model_cpu=LLM(model_id,device="cpu")returnself.model_cpu.generate(prompt,**kwargs)

CPU 推理速度是 NPU 的 1/50,但总比返回 503 好。

滚动更新

新版本上线时,先启动新版本容器,健康检查通过后,再下线旧版本:

# Kubernetes DeploymentapiVersion:apps/v1kind:Deploymentspec:replicas:8strategy:type:RollingUpdaterollingUpdate:maxSurge:2# 最多多 2 个 PodmaxUnavailable:0# 更新期间不允许不可用template:spec:containers:-name:inferenceimage:inference:v2.0readinessProbe:# 健康检查通过后才接收流量httpGet:path:/healthport:8000initialDelaySeconds:60# 模型加载需要时间periodSeconds:10

更新期间始终有 8 个可用 Pod,零宕机。

监控和告警

关键指标和告警阈值:

# Prometheus 告警规则groups:-name:inference_alertsrules:-alert:InferenceHighLatencyexpr:histogram_quantile(0.99,inference_latency_seconds)>1for:5mannotations:summary:"推理 P99 延迟 > 1s"-alert:InferenceHighErrorRateexpr:rate(inference_requests_total{status="error"}[5m]) / rate(inference_requests_total[5m])>0.01for:2mannotations:summary:"推理错误率 > 1%"-alert:NPUUnavailableexpr:up{job="npu_health"}== 0for:1mannotations:summary:"NPU 不可用"

实测可用性

配置:3 台机器 × 8 卡,K8s 滚动更新,NPU 健康检查。

场景恢复时间对可用性影响
单个 NPU 故障30s(容器重启)可忽略
单台机器宕机0(LB 切流量)0
版本回滚2 分钟(滚动)0
机房断电5 分钟(切换到备用机房)5 分钟

全年宕机时间约 30 分钟 → 可用性 99.994%,达到目标。


推理服务高可用的关键是:故障域隔离(进程/容器/机器)、健康检查(NPU/模型/推理)、优雅降级(NPU → CPU)、滚动更新(零宕机)。三台机器 + K8s 可以做到 99.99%。仓库在这里:

https://atomgit.com/cann/ATB

http://www.cnnetsun.cn/news/2533513.html

相关文章:

  • 使用Taotoken聚合API为创业团队优化AI开发成本与效率
  • AI采购决策再不能靠感觉!Claude ROI模型实测数据:平均12.7天回本,但93%团队用错了基准线
  • (课堂笔记)信贷风控项目:贷前授信、贷中评分、贷后预警
  • Windows git bash找不到conda命令:bash: conda: command not found(conda在安装时只配置了Windows CMD和PowerShell的环境变量)
  • 基于SpringBoot2+vue2的社区养老服务平台
  • 大麦自动抢票终极指南:三步告别手动抢票烦恼 [特殊字符]
  • 从“各卖各的”到“一盘棋”——服装老板用了怎样的ERP+分销系统
  • 突破限制:如何用RDP Wrapper解锁Windows远程桌面多人连接功能
  • nginx中间代理。前端下载资源跨域,太大不想放到服务端处理。
  • 终极Scribd电子书下载指南:3步打造个人离线图书馆
  • 【软件架构师-综合题(3)】软件工程知识点
  • FFXIV国际服汉化终极指南:3步实现中文界面完整教程
  • 《男人来自火星,女人来自金星4:生活篇》第7-9章深度解读:告别节食,30分钟开启健康人生
  • EdgeRemover:3步完成Microsoft Edge浏览器的高效卸载与重装指南
  • 鸿蒙意图框架快速入门:5 分钟实现你的第一个意图
  • 给机器人一个值得信赖的“判断力”
  • 少走弯路:盘点2026年备受推崇的的降AI率平台
  • 用 .NET + Avalonia 打造你的专属 AI Copilot 桌面端
  • RISC-V Linux内核启动:relocate汇编函数与MMU页表切换深度解析
  • 洛雪音乐音源终极指南:三步免费解锁全网高品质音乐资源
  • Claude法律文档分析落地难题全破解:从PDF乱码到条款溯源,7步构建高精度法律AI工作流
  • 3分钟上手跨平台资源下载神器:轻松获取微信视频号、抖音无水印内容
  • 嵌入式TF卡硬核横评:A2/U3性能实测与选型避坑指南
  • 汽车12V电源防护:P6KE TVS二极管选型、设计与实战指南
  • 权威深度指南:使用iperf3 Windows版进行网络性能评估与优化实战
  • 3分钟快速解密:qmcdump让QQ音乐加密音频重获自由
  • 工业视觉光源颜色选型全攻略|白/红/蓝/绿光适用场景、原理与避坑细则
  • Taotoken 模型广场在项目技术选型中的实际应用感受
  • 2026降AI率工具红黑榜:AI智能降重工具怎么选?用数据说话!
  • mysql从5.7升级到8.0后ONLY_FULL_GROUP_BY是升级后应用报错的第一大原因