CANN-昇腾NPU-推理服务限流-怎么防止雪崩
2026/5/24 1:38:11 网站建设 项目流程

雪崩(Snowball)效应:请求量突然增大 → NPU 利用率 100% → 新请求排队 → 排队超过超时时间 → 客户端重试 → 请求量更大。这篇讲在昇腾NPU推理服务上怎么限流,防止雪崩。

限流层级

客户端 ↓ LB 层限流(SLB/QPS 限制) ↓ 推理服务层限流(并发数/排队时间) ↓ NPU 层限流(显存/利用率)

三层都要有限流,任何一层失效都会导致雪崩。

LB 层限流

# Nginx 限流配置 http { limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; server { location /generate { limit_req zone=api burst=20 nodelay; proxy_pass http://inference_backend; } } }
  • rate=10r/s:每个 IP 每秒最多 10 个请求
  • burst=20:允许突发 20 个请求排队
  • nodelay:突发请求不延迟,立即处理或拒绝

推理服务层限流

策略 1:并发数限流

fromfastapiimportFastAPI,HTTPExceptionimportasyncio app=FastAPI()semaphore=asyncio.Semaphore(32)# 最多 32 个并发请求@app.post("/generate")asyncdefgenerate(prompt:str):ifsemaphore.locked():raiseHTTPException(status_code=503,detail="Server busy")asyncwithsemaphore:result=awaitmodel.generate(prompt)returnresult

并发数 = NPU 能同时处理的请求数。Atlas 800I A2 单卡约 32 个并发(batch=32)。

策略 2:排队时间限流

importtime request_queue=[]@app.post("/generate")asyncdefgenerate(prompt:str):request_id=len(request_queue)request_queue.append(time.time())# 排队超过 5 秒直接拒绝wait_time=time.time()-request_queue[request_id]ifwait_time>5:raiseHTTPException(status_code=503,detail="Queue timeout")result=awaitmodel.generate(prompt)request_queue.pop(request_id)returnresult

策略 3:动态限流(根据 NPU 利用率)

importtorch_npudefis_npu_overloaded():util=torch_npu.npu.utilization(0)returnutil>90# NPU 利用率 >90% 时限流@app.post("/generate")asyncdefgenerate(prompt:str):ifis_npu_overloaded():raiseHTTPException(status_code=503,detail="NPU overloaded")result=awaitmodel.generate(prompt)returnresult

NPU 层限流

策略 1:KV Cache 余量检查

defis_kv_cache_full():# 假设 KV Cache 最大 48GB,已用 45GBreturnkv_cache_used>45*1024*1024*1024@app.post("/generate")asyncdefgenerate(prompt:str):ifis_kv_cache_full():raiseHTTPException(status_code=503,detail="KV Cache full")result=awaitmodel.generate(prompt)returnresult

策略 2:显存余量检查

defis_memory_full():allocated=torch_npu.memory_allocated(0)total=64*1024*1024*1024# 64GBreturnallocated>0.95*total@app.post("/generate")asyncdefgenerate(prompt:str):ifis_memory_full():raiseHTTPException(status_code=503,detail="Memory full")result=awaitmodel.generate(prompt)returnresult

优雅降级

NPU 满载时,降级到简化模型(如 7B → 3B):

models={"full":LLM("llama2-7b",device="npu:0"),"lite":LLM("llama2-3b",device="npu:0"),}defget_available_model():iftorch_npu.npu.utilization(0)>80:returnmodels["lite"]returnmodels["full"]@app.post("/generate")asyncdefgenerate(prompt:str):model=get_available_model()result=awaitmodel.generate(prompt)returnresult

实战配置

在线对话服务(QPS=100):

# Nginxlimit_req_zone:20r/s + burst=50# 推理服务max_concurrent:64# 2 张 NPU,每张 32 并发max_queue_time:3s# 排队超过 3 秒拒绝kv_cache_threshold:90%# KV Cache 超过 90% 拒绝新请求# NPU 监控utilization_threshold:85%# 利用率 >85% 触发告警memory_threshold:92%# 显存 >92% 触发告警

压测验证

wrklocust压测:

# 100 并发,持续 60 秒wrk-t10-c100-d60s http://localhost:8000/generate# 观察:# - 99% 请求延迟 < 500ms# - 0% 请求超时# - NPU 利用率稳定在 80-90%(不雪崩)

限流是推理服务的"保险丝"。LB 层限制单个 IP,服务层限制并发数和排队时间,NPU 层限制显存和 KV Cache。三层联动,才能防止雪崩。仓库在这里:

https://atomgit.com/cann/ATB

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询