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

TensorRT-LLM中的in-flight batching(IFB)

Ref

  1. 官方文档
  2. deepwiki
  3. 学习代码

博客阅读

使用IFB时,处在 context 阶段(预填充阶段也即prefill)的序列可以跟处在generation 阶段(生成阶段也即decode)的序列一起被处理。出于效率的原因,in-flight 批处理的支持要求输入张量要被“打包”(packed),不能有填充(no padding)。

顺序上限制的解释

IFB允许 prefill 阶段 的 token 处理与 decode 阶段 的 token 处理同时存在/并行发生。但是有一个顺序上的限制:所有上下文阶段(prefill/context)的 tokens 在输入 tensor 里必须排在生成阶段的 tokens 之前。也就是说,在一个 batched input 里面,如果有的序列还在 prefill,有的序列已经开始 decode,那么这些在 prefill 的序列在整体输入的先后顺序里必须在前。

这个可能有点难理解,举个比喻:

想象你有两条生产线,一条是做“准备工作”(prefill),一条是做“产出工作”(generate)。顺序约束像是你把所有“准备工作”的物资(对应 token)先排在仓库的入口,然后再把“产出工作”的物资排在后面。但在实际操作中,你可以一边把前面的准备工作物资搬进线,一边启动后面的产出线来处理已经准备好的物资。

具体到 IFB 的情况:

  • 在某个时间点,你有多个请求/序列。有些请求/序列的上下文部分尚未完成,有些已经完成上下文且进入生成阶段。

  • 系统可以构造一个 batch,其中 input tensor 是 packed 的,按顺序把那些尚在上下文阶段的序列的 tokens
    放在前面,把那些已经开始生成的序列的 tokens(即生成阶段 token +上下文)放在后面。

  • GPU kernel 在处理这个 packed tensor的时候,是可以对前部分做上下文阶段的操作,对后部分做生成阶段的操作,中间并不需要等所有 prefill 完全结束才开始后续generate 的步骤,只要顺序满足 packed tensor 的约定。

源码阅读

One of TensorRT-LLM’s key features is it’s inflight batching scheduler
and runtime that handles simultaneously scheduling and executing
requests in both context and generation phases. Max-Num tokens, in
conjunction with Max-Batch size dictates how and when the scheduler
schedules new and current requests, and understanding their role and
how to tune them can provide significant performance benefits.

是TensorRT-LLM中的重要组件,核心代码位于cpp/tensorrt_llm/batch_manager/trtGptModelInflightBatching.cpp
在我给你的学习代码下运行

cd /LLM-Inference-Notes/third-party/tensorrt-llm/cpp/tensorrt_llm/batch_manager/trtGptModelInflightBatching.cpp

TensorRT-LLM in-flight batching

TensorRT-LLM in-flight batching 源码入口 &说明

以下是几个关键源码文件/目录,以及它们在实现 in-flight batching 中起的作用。
核心代码:

  • cpp/tensorrt_llm/batch_manager/trtGptModelInflightBatching.cpp / .h

两个调度器源码:

  • capacityScheduler.cpp(容量/资源视角,支持 MAX_UTILIZATION 与
    GUARANTEED_NO_EVICT)
  • microBatchScheduler.cpp(把“可放得下”的请求切成当前迭代的
    micro-batch)。

运行时/缓冲相关:

  • runtime/tllmBuffers.h、batch_manager/transformerBuffers.cpp(执行步的张量准备与拷贝常在这些类里)。

trtGptModelInflightBatching.cpp

TrtGptModelInflightBatching

这个文件是TensorRT-LLM中in-flight batching系统的核心实现,包含了 TrtGptModelInflightBatching 类的完整定义

函数定义

// 构造一个“支持 In-Flight Batching(飞行中批处理)”的 GPT 模型实例。
// 这个类在 TRT-LLM 的 C++ 运行时中承担“调度请求 + 执行一步 + 回填结果”的编排角色。
TrtGptModelInflightBatching::TrtGptModelInflightBatching(std::shared_ptr<nvinfer1::ILogger> logger,        // TensorRT 的日志接口:打印 INFO/WARN/ERROR/TRACE,便于排查问题ModelConfig const& modelConfig,                    // 模型结构配置:层数、隐藏维度、注意力类型、是否开启 LoRA/量化 等WorldConfig const& worldConfig,                    // 部署/并行环境配置:设备编号、并行方式(TP/PP)、当前是否是流水线最后一段等RawEngine const& rawEngine,                        // 预构建好的 TensorRT 引擎/权重与算子集:真正“跑起来”的底层执行资源bool ctxGenFusion,                                 // 是否启用“Context(预填充) + Generation(解码) 融合”的执行优化开关executor::ExecutorConfig const& executorConfig,    // 执行层配置:解码策略(top-k/p/温度/beam)、调试与性能旋钮、额外输出等bool isLeaderInOrchMode)                           // 在编排(Orchestration)模式下,本进程/本 rank 是否是“主控/Leader”// --- 基类初始化:把通用的 GPT 运行时(无 IFB 特性)先建好 ---: TrtGptModel(modelConfig, worldConfig, executorConfig)// --- 把关键配置存到成员变量,供后续调度与执行阶段使用 ---, mModelConfig(modelConfig)                        // 保存模型配置(后面会据此决定注意力插件、KV cache 形式、buffer 尺寸等), mWorldConfig(worldConfig)                        // 保存并行/设备配置(决定哪些 rank 负责产出最终结果、设备选择等)// 初始化设备上下文:根据 WorldConfig 选择 CUDA 设备/流等(多卡/多并行时尤其重要), mDevice{ runtime::utils::initDevice(worldConfig) }// 解码(生成)配置:若 ExecutorConfig 未提供就落回默认 DecodingConfig{}。// 这里包含温度、top-k/top-p、最大生成长度、beam 等,直接影响生成策略与性能/显存占用。, mDecodingConfig{ executorConfig.getDecodingConfig().value_or(executor::DecodingConfig{}) }// 运行时“性能旋钮”扩展配置:允许按需调优(如批大小上限、token 上限、调度策略细节等),// 便于在不同负载与硬件之间做吞吐/延迟/显存的权衡。, mExtendedRuntimePerfKnobConfig{ executorConfig.getExtendedRuntimePerfKnobConfig() }// 调试配置:是否输出更详细的日志、是否打开额外检查等(生产与开发环境可不同)。, mDebugConfig{ executorConfig.getDebugConfig() }// 额外模型输出:只有在“流水线并行的最后一个 rank”才有意义,才从 ExecutorConfig 中取出;// 否则设为 nullopt(不上报)。额外输出可能是隐藏态、注意力图、分类头等中间张量。, mAdditionalModelOutputs{worldConfig.isLastPipelineParallelRank()? executorConfig.getAdditionalModelOutputs(): std::nullopt}
{// 这里通常会继续做:// 1) 利用 rawEngine 创建/绑定 TensorRT 执行上下文与必需的插件(如 GPT attention + paged KV)。// 2) 根据 ctxGenFusion/DecodingConfig/PerfKnobs 配置调度器与运行时缓冲(RuntimeBuffers)。// 3) 初始化 KV Cache 管理(paged/contiguous、cross-KV 等),为 IFB 的“随时插入/回收”打好基础。// 4) 若启用调试或 TRACE 级日志,可打印当前 rank、最大 batch/token 限额、是否最后 PP rank 等关键信息。
}
http://www.dtcms.com/a/393173.html

相关文章:

  • kaggle-NeurIPS - Open Polymer Prediction 2025-0.069
  • Linux基础网络命令
  • CTFHub 密码口令通关笔记:默认密码
  • IPv6 网络连接与 “v6ns“ 测试失败解决方案
  • C++11之move移动语义
  • 【计算机三级备考】真题总结
  • Linux基础指令(上)
  • Protocol Buffers .NET 运行时从核心 API 到工程实战
  • DFT教程 part1 VASP安装与学习推荐
  • 泛函 Φ(u) 驻点所满足的偏微分方程与自然边界条件
  • 基于springboot的健康饮食营养管理系统
  • C语言入门指南:联合体与枚举
  • JS逆向 -去哪儿滑块
  • C++包装器(Wrapper)概述
  • java后端工程师进修ing(研一版‖day47)
  • 小谈:物联网(IoT)与工业传感器技术
  • python标准库
  • 01 Tasking软件安装及新建工程
  • ​​[硬件电路-288]: 单路双输入异或门(门控开关:两个同时为1,输出为1)NC7SZ86L6X 功能概述与管脚定义
  • 声明式事务4
  • 速通ACM省铜第十天 赋源码(A Good Problem和Make It Beautiful和Gellyfish and Baby‘s Breath)
  • 寰宇光锥舟
  • 如何安全的计算softmax?
  • 第一部分:基础架构与入门
  • [Windows] Cencrack在线工具包6.52
  • 算法基础篇(2)模拟
  • Go基础:Go语言结构体(Struct)和接口(Interface)详解
  • 【计算机毕业设计】基于生成对抗网络的动作与表情一致性动漫角色生成算法系统​
  • html5 做个人网页识芯平夹回拼翘
  • 开收价均值策略