引言

我们正处于大规模人工智能的时代。近年来,深度学习模型——尤其是 Transformers——在计算机视觉和自然语言处理领域打破了无数记录。我们已经从简单的图像分类器迈向了能够同时理解视频、音频和文本的复杂多模态系统。然而,这种能力的代价是高昂的。

从 2012 年到 2020 年,最先进机器学习应用的计算需求以惊人的 1,000,000 倍速度增长。虽然硬件也在进步,但并未跟上这种指数级的增长步伐。这为 推理服务 (inference serving,即在生产环境中运行这些模型以此为用户生成预测的过程) 造成了巨大的瓶颈。

当你部署一个庞大的多模态模型时,你实际上是在不断地打两场仗: 延迟 (回复能有多快?) 和 成本 (需要多少 GPU 显存和算力?) 。为了赢得这些战斗,工程师们通常会求助于模型压缩技术,如剪枝 (去除连接) 、蒸馏 (教学更小的模型) 或量化 (降低数值精度) 。这些方法很有效,但它们有局限性。有时,你无法在不破坏准确率的情况下进一步压缩模型。

但是,如果我们从另一个角度看问题呢?与其缩小模型,不如优化 输入 呢?

这就是一篇名为 “MOSEL: Inference Serving Using Dynamic Modality Selection” 的有趣研究论文的核心前提。研究人员提出了一种新颖的系统,可以动态决定处理请求实际需要哪些部分的数据 (模态) 。通过智能地舍弃昂贵的输入——比如视频帧——同时保留较便宜的输入——比如音频——MOSEL 实现了 \(3.6\times\) 的吞吐量提升和 \(11\times\) 的作业完成时间缩短,同时保持了严格的准确率保证。

在这篇文章中,我们将拆解 MOSEL 的架构,解释“模态选择”背后的直觉,并探索该系统如何在速度和精度之间走好这根钢丝。

背景: 多模态的代价

要理解为什么需要 MOSEL,我们首先需要了解它所服务的模型的性质。多模态学习涉及处理不同类型数据输入 (如文本、图像、音频和视频) 以进行预测的模型。

想象一个旨在分析视频片段并确定说话者情绪的模型。这个模型可能会观察说话者的面部表情 (视频模态) ,通过语调倾听 (音频模态) ,并分析所说内容的文字记录 (文本模态) 。

融合挑战

这些模型使用一种称为 融合 (fusion) 的技术来结合这些输入。

  • 早期融合 (Early Fusion) : 原始数据 (例如视频补丁和音频频谱图) 在一开始就被组合在一起,共同输入神经网络。
  • 晚期融合 (Late Fusion) : 每个模态由不同的子网络单独处理,它们的结果在最后才合并。

无论采用哪种融合策略,处理所有这些模态都是昂贵的。特别是视频,它是一个资源消耗大户。它需要处理时间数据 (时间维度) 和空间数据 (像素) ,这会消耗大量的内存和计算周期。

模态贡献的不平等性

推动这项研究的关键洞察在于: 并非所有模态都生而平等。

在许多场景下,一种模态可能提供了大部分的预测能力,而另一种模态虽然增加了大量的计算成本,却收益甚微。

让我们看数据。研究人员分析了几种流行的多模态模型,包括 TVLT (无文本视觉-语言 Transformer) 。

Figure 1: Performance comparison of different modalities for multimodal models.

上方的 图 1 完美地展示了这种权衡。

  • 左上 (延迟) : 看一下 TVLT 模型的这组柱状图。代表“全部 (all) ”模态的柱子最高。然而,仅使用“音频 (audio) ”的柱子明显低得多。
  • 中上 (内存) : 这里的差异更加明显。“全部”模态的内存占用巨大,而“音频”则非常小。
  • 右上 (准确率) : 这是最重要的图表。虽然使用“全部”模态能获得最高的准确率,但 使用音频通常能让你非常接近那个峰值。

对于 TVLT 模型,视频模态消耗了大量资源,但与音频相比,其带来的收益却在递减。这创造了一个 机会 。 如果服务器负载很重,我们能否暂时停止处理视频流而仅依赖音频?我们可能会损失零点几个百分点的准确率,但我们可以获得巨大的速度提升,从而确保系统不会崩溃或超时。

这就是 模态选择 (Modality Selection) 的概念: 根据应用需求和系统当前负载,针对每个请求有选择地启用或禁用模态。

调度挑战

实施模态选择并不像“忙碌时关闭视频”那么简单。现实世界的推理系统处理的是 作业 (Jobs) , 即成批的请求。每个作业都有一个服务等级目标 (SLO) ——一个特定的截止时间和最低准确率要求。

系统必须决定在一个作业中为 每个请求 使用哪些模态,以便在不低于目标准确率的情况下满足截止时间。这是一个复杂的调度难题。

让我们将这个问题可视化。

Figure 2: Execution plans for scheduling jobs with different modality strategies.

图 2 展示了调度三个不同作业的复杂性:

  • Job 1 已经在运行。
  • Job 2 在时间戳 10 到达。
  • Job 3 紧随其后在时间戳 20 到达。

系统为 Job 2 提供了一个策略“菜单” (\(S_1\) 到 \(S_6\)) 。有些策略使用高准确率/高延迟的模态 (如视频+音频) ,而其他策略使用低准确率/低延迟的模态 (仅音频) 。

  • Plan 1 (右上) : 如果我们为 Job 2 选择策略 \(S_6\),它完成得很快,但准确率 (0.685) 太低,无法满足 Job 2 的要求 (0.71) 。这个计划失败了。
  • Plan 2 (左下) : 如果我们为 Job 2 选择策略 \(S_1\) (最高准确率) ,它能轻松满足准确率要求。然而,它的执行时间太长,导致 Job 3 只能在队列中等待。等到 Job 2 完成时 (时间戳 140) ,Job 3 不可能在其截止时间 (时间戳 150) 之前完成。这个计划也失败了。
  • Plan 3 (右下) : 这是一个最佳平衡点。我们为 Job 2 选择一个策略,该策略混合使用了不同模态——也许对某些请求使用视频+音频,而对其他请求仅使用音频。这稍微降低了 Job 2 的准确率 (降至 0.735,仍高于 0.71 的要求) ,但完成速度快得多。这为 Job 3 执行并满足其截止时间留出了足够的时间。

这个例子强调了我们不能孤立地看待作业。一种给予 Job 2 最大可能准确率的“贪婪”方法可能会“饿死” Job 3。系统需要具备 社会意识 , 有时为当前作业选择稍低 (但仍可接受) 的准确率,以确保后续作业能够存活。

MOSEL: 系统设计

为了自动化这一决策过程,作者构建了 MOSEL 。 该系统分两个不同的阶段运行: 离线阶段 (学习模型特性) 和 在线阶段 (做出实时决策) 。

Figure 3: MOSEL constructs optimized strategies offline, then applies them online.

1. 离线阶段: 性能分析与优化

在模型为单个用户服务之前,MOSEL 会执行严格的性能分析。它需要了解可用的“菜单”选项。

性能分析 (Profiling)

MOSEL 使用所有可能的模态组合 (例如仅音频、仅视频、音频+视频) 以及各种批量大小 (batch sizes) ,通过验证数据集运行模型。它记录每种组合的两个关键指标: 延迟 (需要多长时间) 和 准确率 (预测有多好) 。

策略生成

分析完成后,MOSEL 需要创建一个 最优模态选择策略 的查找表。

如果一个作业包含 100 个请求并要求 80% 的准确率,那么这 100 个请求的模态混合搭配方式有数百万种。我们不想在运行时计算这个。

MOSEL 使用 非线性整数规划 (NILP) 预先计算这些策略。目标是在满足特定约束的条件下最小化总延迟。

目标是最小化选定模态 \(i\) 和批量大小 \(j\) 的总延迟 \(D\):

Equation: Minimizing total latency sum of D_ij

受限于两个主要约束:

Equation: Constraints for total requests and average accuracy

第一个约束 (第一行) 确保我们策略中的请求总和等于作业的总大小 \(|\mathcal{R}|\)。 第二个约束 (第二行) 确保所选策略的加权平均准确率达到或超过目标准确率 \(\alpha\)。

通过离线求解这个问题,MOSEL 创建了一个“矩阵” (如 图 3b 所示) 。当一个实时作业到达时,系统不需要进行复杂的数学运算;它只需在矩阵中查找预先计算好的最佳计划。

2. 在线阶段: 动态执行

在线组件是 MOSEL 应对实时流量压力的地方。

Figure 4: MOSEL Workflow diagram showing the Profiler, Strategy Generator, and runtime components.

图 4 所示,工作流涉及一个 监控进程 (Monitor Process) 和一个 工作进程 (Worker Process)

  1. 作业到达: 作业到达并被放入队列。
  2. 默认分配: 最初,每个作业都被分配了可用的最高准确率策略。
  3. 违约检测: MOSEL 持续监控队列。它会查看队列中最后一个作业的预计完成时间。
  4. 动态调整: 如果 MOSEL 检测到一个作业即将错过其截止时间 (“违约者”) ,它会触发一个 优化 例程。

这个在线优化的目标是“挤压”当前队列中的作业。它为 前面的 作业寻找替代策略,这些策略速度更快,但仍能满足它们各自的准确率要求。

这种动态调整被公式化为另一个优化问题。系统试图最大化队列中所有请求的平均准确率:

Equation: Maximizing accuracy across strategies and jobs

同时确保所有策略的总延迟处于时间预算 \(T\) 内 (距离截止时间的剩余时间) :

Equation: Sum of latency must be less than Time Budget T

如果解决这个优化问题耗时太长 (整数规划求解器可能需要长达 70ms) ,MOSEL 会回退到 贪婪启发式算法 (Greedy Heuristic) 。 它随机挑选队列中的作业并将它们切换到更快的策略,直到时间安排合理。这确保了系统本身不会成为瓶颈。

评估与结果

研究人员使用 PyTorch 在 Python 中实现了 MOSEL,并在 NVIDIA A100 GPU 上对其进行了评估。他们使用源自 Twitter 追踪数据的真实工作负载,针对五种不同的多模态模型 (包括 TVLT、ViLT 和 TBN) 进行了测试。

它能提高吞吐量吗?

MOSEL 的首要目标是在不崩溃的情况下处理更多流量。

Figure 5: Throughput and SLO violation ratio comparisons.

图 5 比较了不同的策略:

  • 蓝色 (None): 标准方法 (始终使用所有模态) 。
  • 红色 (Optimized): MOSEL 的动态方法。

看第一行 (吞吐量) 。红线始终能处理更高的请求率。对于 TVLT 模型 (‘a’ 列) ,MOSEL 实现了比基线 高 \(5.3\times\) 的吞吐量

更重要的是,看第二行 (SLO 违约率) 。这衡量了系统未能满足截止时间的频率。蓝色柱 (基线) 很高,意味着频繁失败。红色柱 (MOSEL) 明显更低。对于 TVLT,违约率从接近 70% 降至几乎为零。这证明动态放弃昂贵的模态可以防止系统在流量高峰期间不堪重负。

准确率会受损吗?

你可能会担心放弃模态会破坏用户体验。

Figure 6: Accuracy distribution of TVLT.

图 6 显示了准确率分布。虽然“None”策略 (使用所有模态) 在最顶端有一个紧密的分布,但“Optimized”策略 (MOSEL) 保持了几乎相同 (大约 0.740) 的平均准确率。分布范围更广——意味着一些请求得到了较低准确率的预测——但交付给用户的 平均 质量仍然很高。

它可以与其他优化一起工作吗?

MOSEL 是输入层面的优化。它可以与模型层面的优化 (如量化,即使用 16 位浮点数代替 32 位) 并行工作吗?

Figure 7: SLO violation ratio using FP32, FP16, and dynamic modality selection combined.

图 7 显示了细分情况。

  • 蓝色: FP32 (标准)
  • 橙色: FP16 (仅量化)
  • 绿色: Dynamic + FP16 (MOSEL + 量化)

几乎在每张图中,绿线表现最好。与其他方法相比,它在更高的每秒查询数 (QPS) 负载下仍保持 0.0 的违约率。这证实了 MOSEL 与现有技术是互补的;你不必二选一。

它具有鲁棒性吗?

性能分析并不总是完美的。有时模态的估计延迟可能与 GPU 上的实际执行时间不同。

Figure 8: Throughput and accuracy under latency estimation errors.

图 8 测试了 MOSEL 的弹性。x 轴表示估计延迟与实际延迟之间的差异。

  • 左图: 归一化吞吐量。即使估计偏差达到 50% (x 轴在 1.5 处) ,大多数模型的吞吐量 (y 轴) 仍保持稳定。
  • 右图: 准确率。准确率分布在广泛的估计误差范围内也保持稳定。

这种鲁棒性对于生产系统至关重要,因为 GPU 时钟速度和热节流可能会导致执行时间出现不可预测的变化。

结论

多模态模型的爆炸性增长带来了资源危机。我们根本无法负担为每一个查询处理每一帧视频和每一毫秒音频的代价,尤其是在准确率要求通常可以通过较少数据满足的情况下。

MOSEL 引入了推理服务的一种范式转变。与其将输入数据视为固定的需求,不如将其视为灵活的变量。通过创建一个模态策略的“市场”——用少量的准确率换取巨大的延迟收益——MOSEL 使得推理服务器能够在原本会导致崩溃的重负载下生存下来。

MOSEL 论文的关键要点:

  1. 模态选择是有效的: 你通常可以放弃昂贵的模态 (如视频) 而依赖较便宜的模态 (如音频) ,且准确率损失极小。
  2. 离线分析是关键: 预先计算最佳策略允许在运行时进行即时决策。
  3. 全局优化很重要: 孤立地优化单个作业是危险的;你必须优化整个队列以防止后续作业“饿死”。

随着我们要迈向接受文本、图像、视频和感官数据的更大规模的“基础模型”,像 MOSEL 这样的系统很可能会成为 AI 基础设施栈的标准组件,确保我们对更智能 AI 的渴望不会超过我们为其服务的能力。