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

CANN-昇腾NPU-动态batching-怎么把多个请求合并成一个batch

静态 batching 要求所有请求长度相同、batch 大小固定。动态 batching 把多个不同长度的请求拼成一个 batch,NPU 并行处理。在昇腾NPU上,动态 batching 是提升吞吐的关键——batch=1 的 GEMM 利用率只有 7%,batch=32 能到 65%。

动态 Batching 的原理

时刻 T1:收到请求 A(prompt_len=128) 时刻 T2:收到请求 B(prompt_len=256) 时刻 T3:收到请求 C(prompt_len=64) 静态 batching:等 batch 满 32 个才处理,A 等了 200ms 动态 batching:每 50ms 把当前所有 pending 请求拼成一个 batch 处理

动态 batching 的权衡:等待时间 vs batch 大小。等待越久,batch 越大,NPU 利用率越高,但首 token 延迟越高。

ATB 的动态 Batching

ATB 的 LLM 接口内置动态 batching:

fromatbimportLLM,DynamicBatchingConfig model=LLM("meta-llama/Llama-2-7b-hf",device="npu:0",dynamic_batching=DynamicBatchingConfig(max_wait_ms=50,# 最多等 50ms 凑 batchmax_batch_size=32,# 最大 batch 大小max_seq_len=4096,# 最大序列长度))# 并发发送多个请求(ATB 自动做动态 batching)importconcurrent.futureswithconcurrent.futures.ThreadPoolExecutor(max_workers=32)asexecutor:futures=[executor.submit(model.generate,prompt)forpromptinprompts]results=[f.result()forfinfutures]

Padding 策略

不同长度的请求拼成 batch 需要 Padding 到相同长度。两种策略:

策略 1:Padding 到最大长度

# 请求 A: 128 tokens → padding 到 256# 请求 B: 256 tokens → 不用 padding# Batch 大小: [256, 256]缺点:短请求浪费计算(Padding token 也过了 Attention)

策略 2:分桶(Bucket)

# 预设几个桶:128, 256, 512, 1024, 4096# 请求 A (128) → 放入 128 桶# 请求 B (256) → 放入 256 桶# 不同桶的请求不混批优点:减少 Padding 浪费 缺点:桶内请求少时 batch 大小受限

ATB 默认用分桶策略。max_batch_size是每个桶的最大 batch 大小。

动态 Batching 的吞吐提升

Llama2-7B,Atlas 800I A2,32 并发请求:

Batching 策略吞吐 (tokens/s)首 token 延迟 (ms)
静态 batch=115035
静态 batch=898035(等 batch 满)
动态 batching (max_wait=10ms)2,10045
动态 batching (max_wait=50ms)2,80085
动态 batching (max_wait=200ms)3,200235

max_wait_ms是核心参数:小 → 延迟低但吞吐低;大 → 延迟高但吞吐高。

在线服务一般取 50-100ms。离线批量推理可以取 500-1000ms(不关心延迟,只要吞吐)。

跟 KV Cache 的配合

动态 batching 要求 KV Cache 能容纳不同 batch 大小的请求。Paged KV Cache 正好解决这个问题——不需要预分配固定 batch 大小的 KV Cache。

model=LLM("meta-llama/Llama-2-7b-hf",device="npu:0",kv_cache_dtype="fp16",paged_kv_cache=True,# 必须开启dynamic_batching=DynamicBatchingConfig(max_wait_ms=50),)

如果不开启 Paged KV Cache,动态 batching 的 KV Cache 显存浪费 30-50%(因为要按最大 batch 预分配)。

实际部署配置

在线对话服务(QPS=50,延迟敏感):

config=DynamicBatchingConfig(max_wait_ms=50,# 平衡延迟和吞吐max_batch_size=16,# 在线服务 batch 不用太大max_seq_len=4096,)

离线批量推理(不关心延迟):

config=DynamicBatchingConfig(max_wait_ms=2000,# 等 2 秒凑大 batchmax_batch_size=64,# 离线可以开大 batchmax_seq_len=8192,)

动态 batching 是昇腾NPU推理服务的标配——把 batch 从 1 提到 16-32,吞吐提升 10-20×。关键参数max_wait_ms根据业务延迟要求调整。仓库在这里:

https://atomgit.com/cann/ATB

http://www.jsqmd.com/news/875302/

相关文章:

  • 智能AI图像识别之工地积水识别数据集 道路积水数据集 管道泄漏漏水数据集 图像yolov8图像数据集 积水识别yolo第10260期
  • S-MNN:线性复杂度求解器,攻克科学机器学习长序列建模瓶颈
  • DPmoire:为莫尔超晶格定制高精度机器学习力场的自动化方案
  • 告别虚拟机!手把手教你用U盘在旧电脑上安装Ubuntu 22.04.3 Server(附静态IP和SSH Root登录配置)
  • 可解释机器学习工程化:在端到端ML平台中集成XAI的实践指南
  • ZygiskFrida:安卓逆向的Zygote层动态插桩新范式
  • 微信好友检测终极指南:5分钟发现谁悄悄删除了你
  • 智能AI图像识别之公共场合人员行为分析 深度学习CNN人员行为识别 抽烟和打电话图像识别 YOLO玩手机和饮酒目标检测第10397期 (1)
  • 机器学习安全防御组合冲突检测:DefCon框架原理与实践指南
  • 机器学习可解释性实战:从糖尿病预测看XAI如何赋能医疗AI决策
  • Proxmox断电后启动失败深度复盘:不只是GRUB,LVM卷组损坏才是元凶
  • 混沌时间序列预测:轻量级方法为何完胜复杂深度学习模型?
  • 【考研英语一·翻译专攻】长难句翻译的“分治策略”:从底层拆分到逻辑重构(1997-2010真题高频陷阱与红笔纠偏)
  • 外观专利和实用新型
  • SSH连接报kex_exchange_identification的4步根因定位法
  • 多速率信号处理与图像量化:从奈奎斯特到工程实践
  • AI Agent Harness Engineering:大模型之后的下一个技术爆发点
  • 双机器学习:交叉拟合与Neyman正交性如何保障因果推断的统计可靠性
  • 非线性光纤实现光学ELM:计算维度与一致性的权衡实践
  • 告别C盘爆红!保姆级教程:将WSL2的Ubuntu系统完整迁移到D盘(附恢复普通用户权限)
  • 自动微分进阶:从梯度到Hessian矩阵的计算与应用
  • 基于OCT-H与特征增强的流体多臂老虎机最优控制策略学习
  • 火焰不飘、不燃、不爆?,Midjourney 6.6火效失效紧急修复方案(含--no参数黑名单清单与替代性热力图引导法)
  • The Well:面向复杂时空物理建模的15TB多物理场基准数据集
  • 基于QR分解与肘部法则的稀疏传感器优化布置方法
  • Vaultwarden同步失败排查指南:日志诊断与5分钟修复
  • 机器学习探测拓扑相变:温度识别与相分类方法详解
  • [智能体-35]:智能体 + 大模型协同扩展工具调用能力 详细阐述
  • Kruskal-Wallis检验在自动驾驶用户信任度研究中的应用与实操
  • ProCast仿真后处理实战:从Visual-Viewer导出到Excel/Origin成图的完整数据流