ORCA:基于持续批处理的LLM推理性能优化技术详解

大语言模型(LLMs)推理过程中的批处理优化面临显著挑战,这主要源于其推理过程的迭代特性。核心问题在于批处理中的各个请求完成时间存在差异,这导致资源释放和新请求整合的复杂性显著提高,特别是在处理不同完成阶段的请求时。当批处理中序列的生成长度差异较大时,GPU资源利用率往往不够理想。如下图所示,序列1、3和4中,结束符号(EOS)之后的白色区块直观地展示了GPU资源的闲置状态,凸显了当前批处理方法的效率损失。

ORCA系统创新性地提出了持续批处理概念,通过引入迭代级调度和选择性批处理机制,有效解决了大语言模型批处理中的关键技术挑战。

特性1 — 迭代级调度

下图详细展示了基于迭代级调度的ORCA系统架构及其工作流程。ORCA系统对外提供标准化接口(支持HTTPS或gRPC协议)用于处理推理请求。系统将接收到的请求存储于请求池中,由调度器进行统一监控和管理。调度器的核心职责包括:从请求池中筛选请求、调度执行引擎执行模型迭代、接收引擎输出的标记序列,并据此更新请求池状态。执行引擎负责进行张量运算,支持跨多GPU和多机器的并行处理能力。与传统批处理方法不同,ORCA的调度器能够在每次迭代中动态调整处理请求的组合,提供了更灵活的请求处理机制。当某个请求处理完成后,系统将其从请求池中移除,并通过接口返回响应结果。这种方法突破了传统批处理必须等待所有请求完成全部迭代的限制。

特性2 — 选择性批处理

选择性批处理技术通过在张量运算中实现差异化的批处理策略,显著提升了模型处理的灵活性。这种创新方法特别适用于处理形状不规则的输入张量场景,这类张量通常难以直接合并为统一的大规模张量进行批处理。在非注意力机制的矩阵乘法运算和层归一化等操作中,选择性批处理采用将不规则张量重构为无批处理维度的二维结构的方式,实现统一的大规模矩阵计算。这种优化策略的可行性基于这些操作的逐标记处理特性,使得来自不同请求的标记可以等同处理。但是对于需要请求专属键值对的注意力机制操作,系统采用分离式批处理策略,确保每个请求独立处理。注意力操作完成后,输出结果会重新合并为统一张量用于后续处理。ORCA通过K/V管理器持久化存储先前注意力操作产生的键值对,使增量请求能够在多轮迭代中复用这些信息。

分布式架构设计

ORCA系统在Transformer模型并行化方面融合了两种关键技术:层内并行与层间并行。层内并行技术(这也是FasterTransformer采用的方法)主要针对矩阵乘法运算(包括线性变换和注意力机制)及其参数在多GPU间进行分配。而层间并行则致力于在多个GPU之间分配Transformer层。ORCA采用均衡分配策略,确保每个GPU负责处理相同数量的Transformer层。例如,对于一个4层GPT模型,可以先划分为2个层间并行分区,每个分区再细分为3个层内并行分区,最终形成6个GPU的协同计算架构。

FasterTransformer是NVIDIA开发的开源优化库,专注于加速Transformer模型,支持BERT、GPT-2、GPT-J和T5等主流架构。目前,FasterTransformer的技术演进已转移至TensorRT-LLM平台。

ORCA执行引擎采用分布式执行策略,将工作进程分配到不同物理机器上,每个工作进程负责管理一个或多个控制GPU的CPU线程。在具体实现中,每个工作进程专注于处理模型的特定层间分区,而线程数量则由层内并行度决定。当系统为一批请求调度模型迭代时,引擎主控程序首先向第一个工作进程(Worker1)传递必要的计算信息,包括标记序列和控制指令。Worker1随后将这些信息分发给其管理的GPU控制线程,触发相应的GPU计算内核。同时,Worker1采用非阻塞方式将控制指令转发给下一个工作进程(Worker2)。最后一个工作进程在确保其GPU任务全部完成后,负责汇总输出标记并将结果返回给引擎主控程序。这种架构设计实现了跨设备、跨机器的高效分布式计算。

调度算法设计

ORCA调度器采用基于到达时间的优先级机制,在最大批处理大小约束下动态选择请求进行处理。系统在首次调度请求时会预分配存储键值对所需的内存空间。调度过程中

Select

函数确保严格遵循请求的时间优先级进行批次选择。调度器通过评估最大标记数需求,动态验证新请求的内存资源可用性。在确认内存充足的情况下,系统保证为请求的完整生命周期预留必要的键值对缓存空间。整个调度机制采用并发处理模式,支持请求的动态添加和完成请求的及时移除。

ORCA调度器通过任务流水线化技术优化工作进程执行效率。系统不采用传统的串行批次处理模式,而是维持并发运行批次数与工作进程数的动态平衡。这种策略确保了工作进程的持续高效运转。例如在三工作进程配置下,最大批处理大小为二的场景中,调度器可以同时处理多个批次(如AB、CD、EF)。在调度第一个批次(AB)后,系统立即安排后续两个批次(CD和EF)的处理,无需等待AB批次的完成。当AB批次处理完成后,如果这些请求仍具有时间优先性,则会被重新纳入调度流程。这种机制显著提升了系统的资源利用率和整体吞吐性能。

性能评估

得益于创新的迭代级调度和选择性批处理机制,ORCA系统在保持相同延迟水平的前提下,实现了相比FasterTransformer高达37倍的吞吐量提升,展现了显著的性能优势。

论文:

https://avoid.overfit.cn/post/b9a179b6cee448dba7ace15ac95cfe59

作者:Don Moon

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/486641.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pwndbg快速计算栈溢出大小

1.启动pwndbg 生成长度为300的字符串 2.把生成的字符串复制粘贴到 run之后的程序下 查看错误提示“Invalid address 0x62616164” 3.根据错误地址,查看溢出大小

C++_关于异常处理throw-try-catch

文章目录 作用1. 无异常捕获2. 有异常捕获 作用 简单说,异常处理机制主要作用是让程序能够继续执行,或者以一种可控的方式终止,而非让程序因为错误直接崩溃 一个简单的动态数组类,来看看有异常捕获和无异常捕获的区别 1. 无异常…

云原生基础设施指南:精通 Kubernetes 核心与高级用法

1. 云原生的诞生 随着互联网规模的不断增长,以及企业对敏捷开发、快速交付和高可用性的需求日益增强,传统的单体架构逐渐暴露出局限性,难以满足现代业务对动态扩展和高效迭代的要求。为此,云原生应运而生。 云原生是为云计算时代…

如何用python获取图像

方法一:利用PIL中的Image函数,这个函数读取出来不是array格式 这时候需要用 np.asarray(im) 或者 np.array()函数;区别:np.array() 是深拷贝,np.asarray() 是浅拷贝。 from PIL import Image import numpy as npI Im…

[机器学习] 监督学习之线性回归与逻辑回归

这里写目录标题 一、监督学习概述二、线性回归(一)模型表示(二)损失函数(三)梯度下降算法导入所需库生成模拟数据(可替换为真实数据)初始化参数并进行训练可视化损失函数随迭代次数的…

JavaScript柯里化和组合函数以及严格模式介绍

柯里化介绍 柯里化的结构 简化版本 让函数的职责单一 柯里化的复用 对某些逻辑进行复用 打印日志的柯里化 自动化柯里化函数 实现柯理化函数 1.柯里化函数是对函数进行处理的方法,所以参数就为一个函数,这里取名w为fn 2.定义一个函数curried&#xff0…

笔记04--零基础创建个人本地大模型知识库ollama+Dify

ollma安装 官网下载直接下一步下一步即可,没有魔法的朋友可以留言,文章中所用到的文件也给打包了,大家可以直接下载使用通过云盘下载使用。 链接: https://pan.baidu.com/s/12zF9MpQtg1bnMDAQayaSyg 提取码: n9rm 官网地址:http…

ACM:连数问题

任务内容 Description 设有n个正整数,将他们连接成一排,组成一个最大的多位整数。例如:n3 时,3个整数13,312,343,连成的最大整数为:34331213 又如:n4 时,4 个整数 7,13,4,246 连接成的最大整数为7424613 Input N N 个数 Output 连接成的多位数…

Element-ui el-tree 异步加载 懒加载 只能选择一个同级节点

需求 树的数据是通过异步(懒)加载而来,且要求同级节点只能选择一个,一个常见的应用场景是选择住址,选择了山东省不能同时选择河北省,选择了每个节点,显示完整的从根节点到本节点的路径 。 分析 Element-ui的el-tre…

【Linux文件管理】重定向内核级缓冲区用户级缓冲区

文章目录 文件管理文件描述符表(files_struct)重定向重定向概念 文件的内核级缓冲区和用户级缓冲区内核级缓冲区用户级缓冲区 总结 文件管理 文件描述符表(files_struct) 上一期我们将文件描述符讲完了,这期来讲讲文…

【H2O2|全栈】Node.js与MySQL连接

目录 前言 开篇语 准备工作 初始配置 创建连接池 操作数据库 封装方法 结束语 前言 开篇语 本节讲解如何使用Node.js实现与MySQL数据库的连接,并将该过程进行函数封装。 与基础部分的语法相比,ES6的语法进行了一些更加严谨的约束和优化&#…

OpenCV 图像基本操作

OpenCV快速通关 第一章:OpenCV 简介与环境搭建 第二章:OpenCV 图像基本操作 OpenCV 图像基本操作 OpenCV快速通关第二章:OpenCV 图像基本操作一、相关结构体与函数介绍(一)cv::Mat 结构体(二)c…

故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别(Matlab)

故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别(Matlab) 目录 故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别(Matlab)分类效果基本描述程序设计参考资料 分类效果 基本描述 格拉姆角场差(GADF&#…

树莓派4B android 系统添加led灯 Hal 层

本文内容需要用到我上一篇文章做的驱动,可以先看文章https://blog.csdn.net/ange_li/article/details/136759249 一、Hal 层的实现 1.Hal 层的实现一般放在 vendor 目录下,我们在 vendor 目录下创建如下的目录 aosp/vendor/arpi/hardware/interfaces/…

基于Matlab的变压器仿真模型建模方法(9):三相变压器组的建模仿真(续)

1.引言 前一节介绍了基于混合磁链的考虑主磁路饱和情况的三相变压器组的Simulink仿真模型,并应用它对Y,yn接法三相变压器组的瞬态过程进行了仿真计算。这一节建立一个新的基于等效电路的Simulink三相变压器组的仿真模型,并应用它对Y,d11接法的三相变压器组的瞬态过程进行仿…

【Atcoder】【ABC383】A- Humidifier 1加湿器 题解

前言 不知道大家有没有关注过AtCoder 这是小日子那边的一个网站,每周都会有比赛 比起CF等等,最大的优点就是延迟低,题目质量也不错 计划以后每周更新题解了 正文 题目传送门A - Humidifier 1 题目大意 有一个加湿器,给定 …

LeetCode 热题 100_反转链表(23_206_简单_C++)(单链表_递归)

LeetCode 热题 100_反转链表(23_206) 题目描述:输入输出样例:题解:解题思路:思路一(迭代):思路二(简化方法一(迭代)代码):思路三&…

49 基于单片机的湿度和光照监测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于AT89C52单片机,采用DHT11温湿度传感器检测土壤湿度,光敏电阻连接ADC0832数模转换器作为光敏传感器,然后通过LCD1602显示湿度和光照值,如果湿度低…

【C语言】程序设计--算法

文章目录 1. 判断两个数的大小并交换2. 计算三角形面积3. 根据x的值计算y4. 字符大小写转换5. 百钱百鸡问题6. 计算公式y的值7. 输出所有的水仙花数8. 计算n的阶乘9. 下三角数据10. 斐波那契数列11. 学生成绩统计12. 数组的平均值1. 判断两个数的大小并交换 介绍: 从键盘输入…

嵌入式Linux,字符串的处理,以及相关函数详解

C 语言库函数中已经给我们提供了丰富的字符串处理相关函数,基本常见的字符串处理需求都可 以直接使用这些库函数来实现。 1. 字符串输入/输出 在程序当中,经常需要在程序运行过程中打印出一些信息,譬如调试信息、报错信息、中间产生的变量的…