In-flight batching/Iteration level scheduling (Orca)

论文:

osdi22-yu.pdf

《ORCA: A Distributed Serving System for Transformer-Based Generative Models》

之前的几大痛点:

1. 同一个batch里,先完成的短句子,要等到batch里最长的句子完成,才能返回给调用端;

2. input prompt长度相同时,才能batch执行;不同,则不能batch执行;(也能凑合batch执行:把短的句子,在左侧加上mask padding。缺点是将计算资源浪费在了无效计算上)

3. input prompt长度相同时,因为生成结果的长短不同,导致GPU资源浪费,先完成的短句子的GPU机时是空着的;

解决:

1. 以decoding token为单位,来调度(而不是以batch of request为单位);先完成的句子就先返回了(及时释放掉KV cache显存);

2. "和句子长度无关"的operator,可以任意打包batch;"和句子长度有关"的operator,即Attention,不并行,串行执行,每次执行1个request的attention计算;

如上,灰色的是input prompt tokens, 空白的是output tokens;

其他细节:

1. 由用户指定max batch size,调度时凑满为止;

2. 估算每个request需要占用的KV cache显存,确保batch不把显存占满;

3. 先来先服务,先到的reqeust,优先被调度执行;

batch大一些的好处:

1. 增大GPU计算利用率;

2. 将多次读取显存(例如模型权重),合并为读取一次显存

本方法中,prefill阶段的tokens,和decode阶段的tokens,可以打包到同一个batch中。如上例,4个样本被拉成了7个token组成的batch(计算attention时再变为4个样本)

实际上,在decoding阶段的self-attention,batch里多个requests,仍然是可以并行计算的。

可以按request来划分至多个GPU SM上,还可将同一个request的多个head划分至多个GPU SM上。

实现时,可以把kernel放至不同的stream,并行执行;则每个kernel用其中一部分SM。

缺点:context长的request,会拖慢总体进度。

tensorrt-llm的--multi_block_mode选项的解释里,有说这样并行。它是更进一步,把context也划分到不同的SM里了。

### 关于错误 “Operation Cannot Be Mixed With Oracle-Style Batching”的解决方案 当遇到错误消息 `operation cannot be mixed with Oracle-style batching` 时,通常是因为尝试在同一事务或批处理中混合使用不同的数据库操作模式[^1]。具体来说,在某些情况下,SQL Server 或其他数据库驱动程序可能不允许将标准 SQL 查询与特定的批量更新语句(如 Oracle 风格的批处理)组合在一起执行。 以下是可能导致此问题的原因以及相应的解决方法: #### 原因分析 1. **不兼容的操作模式** 数据库适配器可能会运行查询并定期通过事务拉取数据到 BizTalk Server 消息中[^2]。如果这些查询涉及复杂的逻辑或者与其他类型的批处理命令混用,则可能出现冲突。 2. **Oracle 批量语法的独特性** Oracle 的批处理机制依赖其特有的 PL/SQL 结构或其他扩展功能。而 SQL Server 和其他 RDBMS 可能无法完全支持这种风格的批处理方式,从而引发上述错误。 3. **事务隔离级别设置不当** 如果未正确配置事务隔离级别,尤其是在高并发环境下,不同线程之间的交互可能导致不可预测的行为,进而触发该异常。 --- #### 解决方案 ##### 方法一:分离独立的任务流 确保每种类型的操作被单独提交至数据库引擎而不是试图在一个批次内完成多种任务。例如可以先执行所有的 SELECT 操作再接着做 INSERTS, UPDATES 等修改型指令: ```sql -- Example of separating operations BEGIN TRANSACTION; SELECT * FROM TableA WHERE condition; -- Read-only operation COMMIT; BEGIN TRANSACTION; UPDATE TableB SET column=value WHERE another_condition; -- Modification operation COMMIT; ``` ##### 方法二:调整连接字符串参数 对于 .NET 应用程序中的 ADO.NET 连接对象而言,可以通过更改 ConnectionString 来控制如何处理多条命令。比如启用 MultipleActiveResultSets(MARS),允许单个连接上同时存在多个活动的结果集: ```csharp string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;MultipleActiveResultSets=True"; using(SqlConnection conn = new SqlConnection(connectionString)){ // Your code here... } ``` 注意这里增加了 `MultipleActiveResultSets=True` 参数来优化并发性能. ##### 方法三:重构存储过程或动态SQL脚本 考虑重新设计现有的复杂业务逻辑以便更好地适应目标平台的能力范围。这可能意味着改写部分现有代码以减少对外部工具(像Biztalk Adapter)的高度依赖度,并且更多利用原生特性实现相同目的的功能。 --- ### 总结 要彻底消除此类错误,关键是理解当前使用的数据库系统的局限性和最佳实践指南。无论是采用分步策略还是改进底层架构设计都可以有效缓解甚至杜绝这类技术难题的发生几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值