← 返回 2026-06-19

工作负载漂移下 ASR 服务的时长感知调度 Duration Aware Scheduling for ASR Serving Under Workload Drift

Darshan Makwana, Yash Jogi, Harsh Kotta, Aayush Kubba 📅 2026-03-11 👍 3 2026-07-13 08:37
ASR Whisper vLLM 延迟优化 调度优化

利用音频时长代理,将 SJF/HRRN 集成到 ASR,降延迟不损吞吐

前置知识

FCFS(First-Come-First-Served)调度

先来先服务调度是一种最简单的调度策略,按照请求到达的顺序进行处理,不考虑作业长度差异。在 ASR 服务中,当长请求先到达时会阻塞后续的短请求,导致平均延迟升高,这种现象称为队头阻塞(head-of-line blocking)。

现有 ASR 服务引擎(如 vLLM、Orca)默认使用 FCFS 调度,本文正是要解决其在负载变化时的队头阻塞问题。

SJF(Shortest Job First)调度

最短作业优先调度总是优先处理预计耗时最短的作业,理论上能最小化平均等待时间。实现时通常使用最小堆,插入和删除操作的时间复杂度为 $O(\log n)$。缺点是可能导致长作业饥饿(starvation),当短作业持续到达时,长请求可能被无限期延迟。

本文将 SJF 集成到 vLLM 中作为对比基线,展示了其在降低中位数延迟方面的优势,但也暴露了尾延迟恶化的副作用。

HRRN(Highest Response Ratio Next)调度

最高响应比优先调度通过响应比公式 $R = (W + \hat{T}) / \hat{T}$ 来排序作业,其中 $W$ 是等待时间,$\hat{T}$ 是估计作业时间。随着等待时间增加,作业的响应比也会增加,从而防止长作业饥饿。每次调度需要计算所有等待作业的响应比,时间复杂度为 $O(n)$。

HRRN 是本文提出的实用解决方案,它在降低中位数延迟的同时将尾延迟恶化限制在可接受范围内,解决了 SJF 的饥饿问题。

端到端延迟(End-to-End Latency, E2EL)

端到端延迟指从请求到达系统到完成处理的总时间,包括队列等待时间、预填充阶段(prefill)和解码阶段(decode)的时间。在 ASR 服务中,E2EL 直接影响用户体验,语音助手、实时字幕等交互式应用要求低延迟。论文中报告 P50(中位数)和 P90(第 90 百分位)来分别评估典型体验和最差情况。

这是本文的核心评估指标,实验显示 SJF 在高负载时将 P50 E2EL 降低了 73%,而 HRRN 将 P90 E2EL 恶化限制在 24% 以内。

首 token 时间(Time to First Token, TTFT)

首 token 时间指从请求到达到生成第一个输出 token 的时间,主要反映队列等待时间。与 E2EL 相比,TTFT 更能直观地体现调度决策对队列行为的影响。论文中 TTFT 在高负载时的改善更为显著,SJF 将 P50 TTFT 降低了 93%。

TTFT 是补充指标,实验表明调度策略对 TTFT 的改善甚至超过 E2EL,证明优先调度能有效减少队列延迟。

研究动机

现有的大规模 ASR 服务系统(如基于 Whisper 的部署)普遍使用 FCFS 调度策略,这种策略简单但忽略了请求时长的差异性,在工作负载变化时会导致严重的队头阻塞问题。论文通过一个简单的例子说明了这个问题:三个请求 R1、R2、R3 分别有 8s、4s、2s 的音频时长,假设编码成本 1s、解码速率 5 tokens/s,则在 FCFS 下平均 E2E 延迟为 7.66s,而按 SJF 重排序后仅为 5.66s,改善了 1.4 倍。在真实场景中,语音助手、实时字幕和同声传译等交互式应用对延迟极其敏感,任何明显延迟都会降低用户体验。现有的 LLM 推理引擎(如 vLLM、Orca)都默认使用 FCFS,因此也受到同样的限制。

本文的目标是本文的目标是在不牺牲吞吐量的前提下,通过利用音频时长作为作业处理时间的代理信号,将经典的 SJF 和 HRRN 调度算法集成到 ASR 服务中,显著降低端到端延迟。具体目标包括:验证音频时长与 ASR 输出 token 数量的线性关系,实现零开销的作业时间估计,在 vLLM 中集成 SJF 和 HRRN 调度,在不同负载下评估其性能,并在工作负载漂移场景下验证其鲁棒性。

与已有工作不同的是,本文的独特切入角度在于利用 ASR 任务的特殊性质:音频时长在请求到达时就已知,且与作业处理时间强相关。这与文本生成 LLM 有本质区别——文本 LLM 的输出长度不可预测,现有工作需要训练辅助模型或让 LLM 自预测,这些都带来额外开销。本文利用 Whisper 等 encoder-decoder 模型中音频时长与输出 token 数的线性关系 $\hat{n} = d \times \kappa$(其中 $d$ 是音频时长,$\kappa$ 是语言特定常数),实现了几乎零开销的作业时间估计。这种优势是 ASR 任务独有的,使得调度增强可以直接部署。

核心方法

方法整体思路分为三个阶段:首先通过实验验证音频时长与 ASR 输出 token 数量的强相关性,建立线性估计模型;然后将 SJF 和 HRRN 调度算法集成到 vLLM 推理引擎中,在 API 端点捕获音频时长并传递给调度器;最后在两个数据集(原始 LibriSpeech 和合成均匀分布)上评估不同负载下的性能表现。核心技术路线是利用调度信号的可获得性(音频时长已知)与作业处理时间的可预测性(线性相关),实现近乎零开销的优先调度。这种方法不需要训练辅助模型,也不需要修改核心请求序列化格式,通过在 vLLM 中添加约 250 行代码即可完成。

核心创新点在于发现并利用了 ASR 任务中音频时长与作业处理时间的强线性关系。在 Whisper 等 encoder-decoder 模型中,编码阶段按固定 30 秒片段处理,编码时间接近常数;解码时间与输出 token 数量近似线性相关。由于人类语速相对稳定,音频时长越长包含的词汇越多,输出 token 数也越多。实验显示在 LibriSpeech 英语测试集以及 FLEURS 西班牙语、印地语、阿拉伯语测试集上,音频时长与 token 数量都呈现清晰的线性关系,且不同语言的 $\kappa$ 值可以分别估计。这种关系使得音频时长成为作业处理时间的可靠代理信号,且请求到达时就已知,不需要任何预测开销。这与现有 LLM 调度工作形成本质区别——文本 LLM 的输出长度必须通过辅助模型预测或自预测,而 ASR 的时长信号是天然的。

方法步骤详情

方法步骤的完整描述如下:第一步是在 API 端点(OpenAI 兼容的 /v1/audio/transcriptions)捕获音频时长 $d$,在 mel 频谱提取之前根据公式 $\hat{n} = d \times \kappa$ 估计输出 token 数,将估计值存储在 sampling_params.extra_args['estimated_output_tokens'] 中。第二步是在 Request 类构造时读取估计值,如果 extra_args 中没有则回退到 max_tokens。第三步是实现两个队列类:SJFRequestQueue 使用最小堆,优先级元组为(估计输出 tokens,到达时间,请求 ID),插入和删除的时间复杂度为 $O(\log n)$;HRRNRequestQueue 每次弹出时动态计算响应比 $R = (now - arrival_time + estimated_output_tokens) / estimated_output_tokens$,时间复杂度为 $O(n)$。第四步是配置调度策略,通过 CLI 标志 --scheduling-policy sjf 或 hrrn 选择,无需其他配置更改。第五步是在内存压力下实现抢占逻辑:SJF 驱逐估计 tokens 最大的请求(最长作业优先),HRRN 驱逐当前响应比最低的请求(最不紧急优先)。完整的实现只需要修改 vLLM 的 5 个文件,总共约 250 行代码。

技术新颖性

技术新颖性体现在三个方面:一是首次将经典的 SJF 和 HRRN 调度算法应用于 ASR 服务场景,利用音频时长这一天然信号实现优先调度;二是验证了音频时长与 ASR 输出 token 数量的线性关系跨语言、跨数据集的泛化能力,为调度信号的可靠性提供理论依据;三是在 vLLM 中实现了零开销的调度增强,平均每请求的调度开销小于 0.1ms,与 60-100ms 的解码步骤时间相比几乎可以忽略。与现有工作相比,FastServe 使用多级反馈队列需要根据已生成 tokens 动态调整优先级,Fu 等人训练排序模型预测相对输出长度,S3 使用分类模型预测序列长度用于 KV-cache 大小,这些方法都需要额外开销。本文的方法利用了 ASR 任务的特殊性质,实现了近乎零开销的调度增强,且不需要训练任何辅助模型。

Scatter plots showing the relationship between audio duration and ASR output token count.
Figure 2: Scatter plots showing the relationship between audio duration and ASR output token count.

实验结果

核心发现包括:在 LibriSpeech test-clean 数据集上,SJF 在高负载(25 req/s)时将 P50 E2E 延迟从 5423.8ms 降低到 1486.8ms,改善了 73%;P50 TTFT 从 4273.4ms 降低到 296.3ms,改善了 93%。然而 SJF 的尾延迟代价显著,P90 E2E 延迟从 8334.4ms 增加到 16405.3ms,恶化了 97%,这是由于长请求被饥饿。HRRN 提供了实用的折衷:在 25 req/s 时,P50 E2E 延迟降低 28%(从 5423.8ms 到 3897.9ms),同时 P90 E2E 延迟仅恶化 24%(从 8334.4ms 到 10347.3ms)。在合成均匀分布数据集上,SJF 的 P50 E2E 延迟改善达 67%(从 12123.3ms 到 3966.3ms),证明改进源于队列重排序而非利用 LibriSpeech 的自然偏斜分布。尾延迟惩罚也得到缓解:在 25 req/s 时,SJF 的 P90 E2E 恶化为 29%(相对于 97%),HRRN 为 14%(相对于 24%),这是因为均匀分布下长请求与短请求到达频率相同,队列不会被短请求持续主导。吞吐量方面,三种策略在两个数据集上都达到相同的请求吞吐量,在 LibriSpeech 上饱和于约 18 req/s,在合成数据集上饱和于约 13 req/s,证明调度开销可以忽略。爆发负载实验(500 个请求同时到达)显示 SJF 的 P50 TTFT 改善 2.1%,P50 E2EL 改善 3.7%,HRRN 分别改善 9.6% 和 10.7%,改善幅度较小是因为队列是单调排空的,没有新请求来刷新短作业优势。Whisper-Medium(769M 参数)实验显示调度效果在不同模型规模上保持一致,SJF 仍然提供最低的 P25 E2E 延迟,HRRN 处于中间位置,P90 尾延迟的饥饿权衡在高负载时重新出现。

LibriSpeech test-clean: Latency comparison across request rates (ms).
Table 1: LibriSpeech test-clean: Latency comparison across request rates (ms).
Synthetic split: Latency comparison across request rates (ms).
Table 2: Synthetic split: Latency comparison across request rates (ms).
LibriSpeech test-clean: End-to-end latency scaling (1–25 req/s).
Figure 3: LibriSpeech test-clean: End-to-end latency scaling (1–25 req/s).
LibriSpeech test-clean: Percentage change in E2EL versus FCFS (1–25 req/s).
Figure 4: LibriSpeech test-clean: Percentage change in E2EL versus FCFS (1–25 req/s).
Synthetic split: End-to-end latency scaling (1–30 req/s).
Figure 5: Synthetic split: End-to-end latency scaling (1–30 req/s).
Synthetic split: Percentage change in E2EL versus FCFS (1–30 req/s).
Figure 6: Synthetic split: Percentage change in E2EL versus FCFS (1–30 req/s).
Request throughput for both workloads.
Figure 7: Request throughput for both workloads.
LibriSpeech TTFT scaling (1–25 req/s).
Figure 8: LibriSpeech TTFT scaling (1–25 req/s).
LibriSpeech: percentage change in TTFT versus FCFS (1–25 req/s).
Figure 9: LibriSpeech: percentage change in TTFT versus FCFS (1–25 req/s).
Synthetic split TTFT scaling (1–30 req/s).
Figure 10: Synthetic split TTFT scaling (1–30 req/s).
Synthetic split: percentage change in TTFT versus FCFS (1–30 req/s).
Figure 11: Synthetic split: percentage change in TTFT versus FCFS (1–30 req/s).
Burst workload results (rate= ∞, 500 simultaneous requests).
Figure 12: Burst workload results (rate= ∞, 500 simultaneous requests).
Whisper-Medium E2EL scaling (15–25 req/s).
Figure 13: Whisper-Medium E2EL scaling (15–25 req/s).
查看结构化数据
任务指标本文基线提升
LibriSpeech ASR 服务(25 req/s 高负载) P50 E2E 延迟 1486.8ms (SJF), 3897.9ms (HRRN) 5423.8ms (FCFS) -73% (SJF), -28% (HRRN)
LibriSpeech ASR 服务(25 req/s 高负载) P90 E2E 延迟 16405.3ms (SJF), 10347.3ms (HRRN) 8334.4ms (FCFS) +97% (SJF), +24% (HRRN, 恶化受限)
LibriSpeech ASR 服务(25 req/s 高负载) P50 TTFT 296.3ms (SJF) 4273.4ms (FCFS) -93%
合成均匀分布 ASR 服务(25 req/s 高负载) P50 E2E 延迟 3966.3ms (SJF) 12123.3ms (FCFS) -67%
爆发负载(500 个同时请求) P50 E2E 延迟 -10.7% 改善 (HRRN) FCFS -10.7%

局限与改进

作者承认的局限性包括:一是静音敏感性问题,当前基于时长的估计器假设音频主要包含语音内容,当录音包含扩展的静音段(如停顿、前导/尾部静音)时会高估输出 token 数。缓解方法是在 API 端点集成语音活动检测(VAD)模块,使用语音活跃段的总时长而不是原始文件时长,轻量级 VAD 模型(如 Silero VAD)每话语增加小于 5ms 开销。二是自适应 $\kappa$ 问题,当前系统在所有请求上使用固定的 $\kappa$,在多语言部署中不同语言的 tokenization 密度不同(图 2 显示了英语、阿拉伯语、西班牙语的 $\kappa$ 值差异),可能导致次优的估计准确性。三是动态策略切换的探索不足,当前实验孤立评估每个调度策略,生产系统可以监控队列深度、尾延迟百分位和饥饿指标,实时动态切换 FCFS、SJF 和 HRRN 以匹配当前负载。此外,本文的实验主要在单个 GPU 上进行,分布式部署的性能影响未评估,且实验只使用了 Whisper 系列 ASR 模型,在其他 ASR 架构(如纯 encoder 模型或流式模型)上的效果需要进一步验证。

独立分析的弱点

独立分析的弱点包括:一是静音段导致的估计不准确,在会议录音等场景中静音比例可能很高,导致作业时间估计严重高估,调度决策次优。改进方向是集成轻量级 VAD 模块,使用实际语音时长而非文件时长。二是固定 $\kappa$ 在多语言环境下的局限,不同语言的 tokenization 密度不同,作者虽展示了跨语言的线性关系但未实现语言感知的 $\kappa$ 自适应。改进方向是根据音频语言检测动态选择 $\kappa$ 值,或者使用用户提供的语言配置。三是缺乏对不同 ASR 架构的泛化验证,实验只使用 Whisper 这种 encoder-decoder 模型,在纯 encoder 模型(如 wav2vec2)或流式模型(如流式 Whisper)上时长与处理时间的关系可能不同。改进方向是在更多 ASR 架构上验证时长信号的可靠性。四是高负载下 SJF 的尾延迟恶化问题在交互式应用中可能不可接受,如实时字幕服务对 P90 延迟敏感。改进方向是探索更激进的饥饿缓解机制,如为长请求设置最大等待时间阈值,或使用混合策略(低负载用 SJF,高负载用 HRRN)。

未来方向

未来研究方向包括:一是集成语音活动检测(VAD)模块处理静音敏感性问题,作者提出使用 Silero VAD 等轻量级模型在 API 端点进行预处理,计算实际语音时长而非文件时长。二是实现自适应 $\kappa$ 机制,根据语言检测动态选择 $\kappa$ 值,或者通过在线学习适应不同说话者的语速变化。三是动态策略切换框架,实时监控队列深度、尾延迟百分位、请求到达率等指标,在不同负载条件下自动切换 FCFS、SJF 和 HRRN,作者提到这是生产系统的自然扩展方向。四是扩展到分布式部署,当前实验在单个 A100 GPU 上进行,多 GPU 部署时的跨节点调度和负载均衡需要进一步研究。五是验证在其他 ASR 架构上的效果,如纯 encoder 模型、流式模型、端到端联合模型等,确认音频时长信号的泛化能力。六是探索更复杂的饥饿缓解策略,如为长请求设置优先级提升阈值、使用时间片轮转与优先级调度结合的混合策略、基于用户等级的差异化调度等。七是在实际生产工作负载上进行 A/B 测试,验证实验室环境下的发现在真实场景中的效果。

复现评估

复现评估:本文提供了完整的实现细节,约 250 行代码修改分布在 5 个文件中,包括 API 端点的时长捕获、Request 类的估计值读取、两个队列类的实现、抢占逻辑和 CLI 配置。作者提到完整补丁在补充材料中提供。实验配置明确:使用 whisper-large-v3 模型(1.5B 参数)和 whisper-medium 模型(769M 参数),在单个 NVIDIA A100 GPU(40GB HBM2e)上运行,CUDA 12.1,vLLM 配置最大批量大小 256、GPU 内存利用率目标 95%、最大输出长度 448 tokens、启用分块预填充。数据集使用 LibriSpeech test-clean(原始和合成均匀分布),合成数据集通过选择 6 个特定时长 {5, 10, 15, 20, 25, 30} s 的样本构造,每请求率运行 5 分钟,泊松到达过程突发性因子 1.0。复现难度中等,需要相应的 GPU 资源和 vLLM 知识。作者未明确提供实验数据或脚本,但实现细节充分,理论上可以复现。建议补充提供:完整的代码补丁链接、实验配置文件、原始数据日志、用于合成数据集的样本选择逻辑、以及重现表 1 和表 2 的完整数值结果。