发表时间: 2024-04
文章标题: Proteus: 一种具有精度缩放功能的高吞吐量推理服务系统
作者: Sohaib Ahmad, Hui Guan, Ramesh K. Sitaraman
机构: University of Massachusetts, Amherst
作者: Brian D. Friedman, Thomas Williams, Thomas Woo
机构: Nokia Bell Labs
一句话结论 本文提出了 Proteus 高吞吐量推理服务系统,通过在异构集群中动态调整模型精度,在不增加硬件的前提下应对查询需求波动,大幅降低了服务等级目标(SLO)违规率并最小化了系统精度下降。
要解决什么问题 现有推理服务系统应对查询增长主要依赖增添或升级硬件。但对资源受限的边缘集群或固定规模私有云,硬件扩展并不可行。当硬件固定而流量剧烈波动时,系统会卡在吞吐量与延迟的矛盾中:若始终运行高精度大模型,计算量大会导致吞吐量受限,流量高峰期易引发队列积压和 SLO 超时;若为保吞吐全部切到小模型,又会在流量平稳时造成不必要的精度损失。因此,引入精度缩放(资源紧张时用低精度、高吞吐模型替换高精度模型)成为可行替代方案。但适量缩放面临巨大配置空间挑战:需同时决定选哪个模型变体、部署在哪些异构硬件上、以及如何分配多租户查询。此外,微观层面查询到达时间往往不均匀,现有自适应批处理机制效率低下:Clipper 被动调整响应慢,Nexus 的“功守恒”策略在负载波动时表现差,Lazy Batching 则需侵入式修改底层框架。如何在宏观上做好集群资源分配,微观上处理好请求随机波动,是亟待解决的核心卡点。
怎么做的 Proteus 核心思路是将资源分配的控制路径与查询服务的数据路径解耦,宏观上利用混合整数线性规划(MILP)进行全局精度缩放,微观上利用非“功守恒”自适应批处理吸收流量波动。系统由控制器、负载均衡器和工作节点构成。控制器负责宏观资源管理,将分配拆解为模型选择、模型放置和查询分配。设布尔变量 $x_{d,m}$ 表示设备 $d$ 是否托管模型变体 $m$,连续变量 $y_{d,q}$ 表示查询类型 $q$ 路由到设备 $d$ 的比例。控制器的目标是在满足目标吞吐量前提下,最大化所有被服务查询的有效精度总和:$$\max_{\{x_{d,m}\},\{y_{d,q}\}} \sum_{q} a_{q}$$其中有效精度 $a_q$ 由模型变体精度和分配到的查询量决定。为保证吞吐量,设备 $d$ 实际服务的查询率 $z_{d,q}$ 必须受限于托管模型的峰值吞吐能力 $P_{d,m,q}$:$$z_{d,q} \le \sum_{m} P_{d,m,q} \cdot x_{d,m}$$因求解 MILP 耗时数秒,该过程异步执行不阻塞查询。负载均衡器据此策略将请求发给工作节点。工作节点执行推理,并引入主动式、非“功守恒”自适应批处理算法。算法核心是计算最晚等待时间 $T_{max\_wait}$。设当前队列有 $q$ 个查询,首个查询将在 $T_{exp}(1)$ 时刻因违反 SLO 过期,处理大小为 $q+1$ 的批次需 $T_{process}(q+1)$ 时间,最晚等待时间为:$$T_{max\_wait}(q+1) = T_{exp}(1) - T_{process}(q+1)$$只要未到该时间,工作节点就主动让设备空闲(非“功守恒”),等待新查询凑大批次。一旦到达该时间且无新查询,或新查询加入后算出的下个最晚等待时间已超时,系统立即以当前批次大小执行。这既保首个查询不超时,又最大化吞吐收益,且无需修改底层框架。
效果如何 实验在企业级推理集群搭建,含 20 台 CPU、10 台 GTX 1080 Ti 和 10 台 V100。测试模型涵盖视觉和 NLP 多种变体,负载使用具流量尖峰的真实 Twitter 轨迹。对比基线包括:代表静态不缩放精度的 Clipper(分最低精度 Clipper-HT 和最高精度 Clipper-HA);代表部分动态、仅支持单机缩放的 Sommelier;代表完全动态、用贪心算法分配资源的 INFaaS-Accuracy。端到端测试中,Proteus 实现了最低精度下降(最大仅 4.85%)和最低 SLO 违规率。与同样精度缩放的 INFaaS 和 Sommelier 相比,Proteus 精度下降分别减少 2.8 倍和 3.2 倍,SLO 违规减少 4.3 倍和 2.8 倍;与不缩放的 Clipper 相比,吞吐量提升 60% 且 SLO 违规减少 10 倍以上。微观批处理对比中,Proteus 在突发轨迹下将 SLO 违规率比代表“功守恒”的 Nexus 和代表被动调整的 Clipper 降低 2 到 4 倍。消融实验证明,移除模型放置会导致 16% 精度下降,移除模型选择会引发最严重 SLO 违规。作者坦诚了局限性:MILP 求解耗时随设备和模型数增加(160 设备需 4.2 秒);未充分考虑 NLP 模型可变输入大小对吞吐量的影响;系统级精度优化会导致请求率低的模型(如 T5)比请求率高的模型(如 GPT-2)承受更大精度损失,存在应用间公平性权衡。
核心问题:现有的机器学习推理服务系统主要依赖硬件扩展(增加设备或使用更强大的加速器)来应对增长的查询需求。然而,对于资源有限的固定规模边缘集群或私有云,硬件扩展并不可行。
研究目标:本文研究一种替代方案——精度缩放(accuracy scaling),即通过调整模型的精度而非硬件资源来应对变化的查询需求。目标是构建一个基于异构集群的推理服务系统,该系统利用精度缩放来满足变化的查询需求,并实现高系统精度(system accuracy)。系统假定每个查询都倾向于使用最精确的模型变体,但在资源紧张时愿意接受较低的精度以换取及时的响应。
创新点与核心贡献:
硬件扩展的局限性与精度缩放的可行性。许多现有的推理服务系统依赖于横向扩展(增加更多设备)或纵向扩展(使用更快的设备)来处理日益增长的查询需求。然而,在某些场景下,如拥有有限设备的边缘云系统或企业为内部用户维护的固定规模集群,这种硬件扩展并不可行。一个可行的替代方案是精度缩放,它利用了推理工作负载中吞吐量与精度之间的天然权衡。这种权衡之所以存在,是因为精度较低的模型通常是较小的神经网络(例如,参数和层数较少),因此需要较少的计算量,允许在给定时间内服务更多请求,从而提供更高的吞吞吐量。如图1a所示,在三种不同类型的设备上,对于给定的设备类型,精度较低的EfficientNet模型变体可以实现更高的吞吐量。推理服务系统可以在查询负载增加时,用精度较低的对应模型替换托管的模型变体,待查询负载恢复正常后再切换回更精确的模型变体。
构建一个推理服务系统主要面临以下两大挑战。
挑战1:“适量”的精度缩放。第一个挑战在于确定适量的精度缩放以满足目标查询需求。与传统的硬件扩展类似,精度缩放也存在缩放不足或过度的风险。系统可以始终托管最精确的模型变体以最大化精度,但这会导致吞吐量相对较低,并有高SLO违规率的风险;或者,系统可以始终托管最不精确的模型变体以最大化吞吐量,但这会造成不必要的精度下降。确定适量的精度缩放意味着系统需要在合适的设备上托管合适的模型变体集合,并为每个设备分配适量的查询。解决这个资源分配问题非常复杂,因为它受到三个因素影响的巨大配置空间:众多模型变体、异构设备和多种应用。
机遇1:将资源分配问题公式化。上述挑战可以被构想为资源分配的三个子问题:模型选择、模型放置和查询分配,这些问题可以使用混合整数线性规划(MILP)联合求解。由于解决MILP问题需要时间,而查询有严格的延迟要求,因此我们将资源分配从查询服务中解耦。资源在宏观查询需求发生变化时重新分配,以确保系统有足够的吞吐能力处理传入的查询。而每个设备则可以通过自适应批处理来处理非均匀的查询到达,以避免SLO违规。这促使我们设计一个将管理资源的控制路径与服务查询的数据路径分离的推理服务系统。
挑战2:自适应批处理。解耦的资源分配和查询服务在很大程度上依赖于自适应批处理来处理查询到达时间的微观波动。将多个查询一起批处理可以提高吞吐量,但也可能增加查询的等待时间。由于查询到达不均匀,我们需要根据查询到达时间动态调整批处理大小以最小化SLO违规。尽管先前的工作研究了自适应批处理,但我们发现它们的方法效率不高:Clipper【索引9,Clipper: A Low-Latency Online Prediction Serving System,2017,NSDI】是被动调整;Nexus【索引36,Nexus: A GPU Cluster Engine for Accelerating DNN-Based Video Analysis,2019,SOSP】在负载波动时表现不佳;Lazy Batching【索引8,Lazy Batching: An SLA-aware Batching System for Cloud Machine Learning Inference,2021,HPCA】需要对底层ML框架进行重大修改。
机遇2:采用非“功守恒”的自适应批处理方法。我们发现,在查询到达间隔不均匀时,非“功守恒”(non-work-conserving)的自适应批处理方法比“功守恒”(work-conserving)方法更能稳定系统。非“功守恒”方法会尽可能地等待以累积更多查询,然后再执行批处理。我们证明,这种方法可以提高系统吞吐量并减少SLO违规。此外,主动的批处理大小调整方法比被动方法(如Clipper)能显著减少延迟SLO超时。我们提出了一种新颖的自适应批处理算法,它遵循主动、非“功守恒”的方法,且无需修改ML框架。
系统架构与组件。我们提出了Proteus,一个利用精度缩放处理不同查询需求的高吞吐量推理服务系统。图2展示了Proteus的整体系统架构,它包含三个主要组件:控制器(Controller)、负载均衡器(Load Balancers)和工作节点(Workers)。
两种交互类型。系统中有两种交互类型。第一种是开发者注册应用程序及其模型变体(图中虚线箭头所示)。控制器接收注册命令后,会为该应用创建一个新的负载均衡器,并设置工作节点。Proteus会自动管理使用哪个模型变体以及放置在何处。第二种是已注册应用发送推理查询并接收响应(图中实线箭头所示)。查询直接发送到应用的指定负载均衡器,后者将查询路由到工作机器上托管的相应模型变体进行执行。每个应用由其专用的负载均衡器处理,避免了单点性能瓶颈。控制器和负载均衡器的分离使Proteus更灵活、更健壮,允许它在不处于推理服务关键路径上执行资源分配。
控制器(Controller)。控制器负责接收应用和模型变体的注册。它包含四个模块:(1) 资源管理器,当查询需求变化时,确定资源分配策略(包括模型选择、放置和查询分配);(2) 模型注册表,处理应用和模型变体注册;(3) 模型分析器,分析每个模型变体在不同类型设备上的性能;(4) 统计收集器,从所有负载均衡器收集查询需求统计数据,用于决定何时重新分配资源。模型分析器在注册新模型时以及周期性地被调用,以轮询当前托管模型变体的推理延迟,并将分析信息存储在内存键值存储中,键为(模型变体, 设备类型, 批大小)三元组,以确保O(1)的查找时间。
负载均衡器(Load Balancer)。负载均衡器从其指定的应用程序接收推理查询,并返回模型执行结果。不同应用的负载均衡器可以分布在多台机器上以避免网络拥塞。每个负载均衡器包括两个模块:(1) 请求路由器,根据查询分配策略将查询分派到工作机器上托管的模型变体;(2) 监控守护进程,实时监控查询需求并定期向控制器报告统计数据。当负载均衡器检测到请求突增或任何工作节点过载时,它会调用控制器重新分配资源。
工作节点(Workers)。每个工作节点执行其托管的模型变体,以服务由请求路由器分配的推理查询。工作节点包括两个模块:(1) 自适应批处理模块,动态确定合适的批大小以提高吞吐量,同时满足查询延迟约束;(2) 硬件执行器,管理模型变体的部署和执行。
资源管理器的功能。资源管理器通过求解一个混合整数线性规划(MILP)优化问题,来确定最优的模型选择、模型放置和查询分配方案,从而在满足目标查询需求的同时最大化系统精度。根据解决方案,它可能会终止设备上当前托管的某些模型变体实例,并启动其他模型变体的实例。它还会将新的查询分配策略传播给请求路由器。在查询需求稳定的情况下,资源管理器会周期性地被调用。然而,如果需求在短时间内迅速变化,负载均衡器中的监控守护进程会调用资源管理器以响应突发情况。资源管理器响应的是宏观尺度的工作负载变化(以QPS衡量),而自适应批处理则响应微观尺度的变化(查询到达间隔的变化)。
资源管理问题公式化。我们使用MILP来公式化带有精度缩放的资源管理问题,目标是在满足目标服务吞吐量的同时最大化精度。下表总结了所用符号。
优化变量与约束。我们定义了两个优化变量:布尔变量$\{x_{d,m}\}$表示模型选择和放置策略(模型分配),如果模型变体$m$被托管在设备$d$上,则$x_{d,m}$为真;变量$\{y_{d,q}\}$表示查询分配计划,$y_{d,q} \in [0, 1]$表示类型为$q$的查询被路由到设备$d$的百分比。这两个变量必须满足三个约束条件:
(1)
(2)
(3)
服务吞吐量。设$z_{d,q}$为设备$d$服务的查询类型$q$的每秒查询数。系统服务吞吐量是所有设备服务的查询总数:$\sum_d \sum_q z_{d,q}$。$\sum_q z_{d,q}$不能大于分配给设备$d$的总查询数(公式4),也不能大于该设备的峰值吞吐能力(公式5)。此外,我们要求所有传入的需求都由系统服务(公式6)。设$s_q$为查询类型$q$的每秒查询数(QPS)。分配给设备$d$的总查询数为$\sum_q y_{d,q} \cdot s_q$。设$P_{d,m,q}$为模型变体$m$在设备$d$上为查询类型$q$分析出的峰值吞吐能力。设备$d$对查询类型$q$的峰值吞吐量则为$\sum_m P_{d,m,q} \cdot x_{d,m}$。设备$d$的服务吞吐量遵循以下三个约束:
$$\sum_{q} z_{d,q} \le \sum_{q} y_{d,q} \cdot s_{q}$$
(4)
(5)
(6)
有效精度(系统精度)。对于每个模型变体$m$,它服务的查询类型$q$的查询数量为$\sum_d \sum_q x_{d,m} \cdot z_{d,q} \cdot s_q$。设$A_m$为模型变体$m$的精度。我们可以得到所有类型为$q$的查询的精度为:$a_q = \sum_m A_m \cdot (\sum_d x_{d,m} \cdot z_{d,q} \cdot s_q)$。有效精度是所有被服务查询的平均精度,即$\sum_q a_q$。
MILP公式化。资源管理问题旨在找到最优的模型选择和放置$\{x_{d,m}\}^*$以及查询分配$\{y_{d,q}\}^*$,以最大化有效精度$\sum_q a_q$,同时达到一个足够高的目标服务吞吐量$\sum_d \sum_q z_{d,q}$来服务传入的查询$\{s_q\}$。该问题可以公式化为:
$$\max_{\{x_{d,m}\},\{y_{d,q}\}} \sum_{q} a_{q} \quad s.t. \text{ Constraints Eqs. 1-6}$$求解MILP。资源管理器精确求解MILP以确定全局最优的模型分配和查询分配策略。解决MILP的时间开销不在查询服务的关键路径上,因为MILP是异步调用的。默认情况下,$s_q$被设置为需求。然而,如果需求增长到某个点,即使为每个查询类型使用最低精度的模型变体也可能无法满足吞吐量需求。在这种情况下,MILP求解器会立即报告约束不可行,然后我们通过减小$s_q$的一个小值来再次求解MILP。
吞吐能力的估计。求解MILP问题需要我们估计每个$P_{d,m,q}$,即每个模型变体在设备上对某个查询类型的吞吐能力。增加批处理大小会提高模型变体的吞吐量,但也会增加处理延迟。因此,我们首先估计每个模型变体在不违反查询延迟SLO的情况下可以使用的最大批处理大小,然后使用该批处理大小来分析吞吐能力。具体来说,我们遵循【索引36,Nexus: A GPU Cluster Engine for Accelerating DNN-Based Video Analysis,2019,SOSP】的观察,即为防止延迟超时,任何模型的最大推理延迟不应超过其延迟SLO的一半。利用这一观察,我们计算每个$(d, m, q)$对满足SLO要求的最大批处理大小。除了延迟约束,最大批处理大小还受到每个设备内存约束的限制。因此,最大允许批处理大小是以下两者中的较小值:(i) 满足SLO的最大批处理大小,(ii) 适合设备$d$内存的最大批处理大小。我们使用每个$(d, m, q)$对的最大允许批处理大小以及模型变体$m$在设备$d$上对查询类型$q$的分析延迟来计算该对的吞吐能力$P_{d,m,q}$。
$$P_{d, m, q}=\frac{\text { Maximum allowed batch size for } d, m, q}{\text { Profiled latency (seconds) }}$$算法核心思想。虽然资源管理器根据目标服务吞吐量做出模型分配和查询分配决策,但每个设备都有责任在不违反延迟约束的情况下服务分配给它的查询。自适应批处理根据队列状况动态确定要使用的最佳批处理大小,以最小化SLO违规。Proteus的自适应批处理算法基于两个关键思想:首先,它是一个主动算法,通过在队列中第一个查询即将违反其延迟SLO之前主动开始处理查询,确保队列中没有查询会不必要地超时;其次,它是非“功守恒”的,如果这有助于在开始批处理执行前累积更多查询,它可能会让设备暂时空闲。
算法工作流程。图3说明了该方法。假设队列中有$q$个查询,并且第一个查询将在$T_{exp}(1)$时刻过期。处理一个大小为$q+1$的批次需要$T_{process}(q+1)$的时间。我们定义$T_{max\_wait}(q+1) = T_{exp}(1) - T_{process}(q+1)$,换句话说,这是我们等待第$q+1$个查询到达的最晚时间点。如果我们还没有到达$T_{max\_wait}(q+1)$,我们就可以等待更多查询进入队列,因为我们没有违反任何查询延迟SLO的风险。在等到$T_{max\_wait}(q+1)$以填充批次的过程中,可能出现两种情况:
性能优势。如第6.4节所示,所提出的批处理算法性能优于被动方法(例如Clipper的AIMD批处理)以及主动的“功守恒”方法(例如Nexus的提前丢弃批处理)。
我们选择了一系列基线系统进行对比,涵盖从完全静态到完全动态的范围。
硬件配置:实验在一个企业级推理服务系统的集群上进行,该集群包含:
软件配置:
端到端性能比较 (图4)
突发工作负载响应 (图5)
自适应批处理算法评估 (图6)
消融研究 (图7)
对延迟SLO的敏感性 (图8)
性能分解 (图9)
决策开销 (图10)
本节讨论了工作的局限性和未来可能的研究方向。
可变输入大小。本工作中的模型涵盖了计算机视觉和自然语言处理等多个领域。虽然计算机视觉模型通常具有固定大小的输入,但许多自然语言模型可以处理可变大小的输入,其吞吐量可能因输入大小而异。尽管我们的MILP在计算模型变体吞吐量($P_{d,m,q}$)时未考虑可变的输入大小,但自适应批处理确实考虑了实时的查询执行情况。然而,本工作范围并未深入探讨可变大小输入对推理服务的影响,这为未来的工作留下了空间。
公平性。本工作在系统层面考虑精度缩放。这意味着尽管大多数请求满足延迟SLO和吞吐量要求,但有时某些请求可能会比其他请求体验到更高的精度。这为将公平性作为推理服务系统优化的另一个目标打开了大门。然而,同时优化公平性和精度并非易事。系统可以通过将资源从精度下降程度较低的查询类型重新分配给精度下降程度较高的查询类型来提高公平性;然而,这会降低系统层面的整体有效精度。因此,公平性与系统范围内的有效精度之间存在权衡,这仍然是一个值得未来探索的有趣方向。
硬件扩展。在这项工作中,我们将精度缩放作为资源受限的推理服务系统中硬件扩展的替代方案。然而,对于有能力增加硬件资源的系统,精度缩放也可以与硬件扩展协同工作。由于硬件扩展涉及配置和启动新服务器,这需要时间,因此精度缩放可以在更细的时间粒度上使用,通过在等待新服务器分配期间短暂降低精度来吸收突发的意外负载。
我们提出了Proteus,一个利用精度缩放来处理查询工作负载变化的高吞吐量推理服务系统。我们将Proteus中的资源管理问题公式化为一个混合整数线性规划优化问题,以适应宏观尺度的变化,并通过求解它来保证最优解。我们还提出了一种新颖的自适应批处理算法,以提高吞吐量并吸收微观尺度的变化。我们在真实世界的工作负载轨迹上对Proteus进行了评估,结果表明,它在减少SLO违规和提高系统吞吐量方面优于最先进的基线系统,同时将精度下降降至最低。