Skip to main content

多模态推理

假设你要做一个语音点单机器人。用户对着手机说「我要一杯少冰的珍珠奶茶」,它得听懂,然后用语音回一句「好的,少冰珍珠奶茶一杯,十八块」。

你手上已经有一个跑得挺好的文本大模型服务。很自然的想法是:前面接个语音转文字,后面接个文字转语音,中间还是原来那套,齐活。

真接起来会发现不对劲。文本服务在你的卡上能扛住一百多路并发,加上语音之后三十几路就开始卡;GPU 利用率一看只有四成,可延迟就是下不来。你加大批处理,吞吐没涨,尾延迟先翻倍了。你想给语音那段单独加张卡,发现代码里它跟文本模型绑在同一个进程里,加不了。

这些麻烦不是哪一处写错了。加上语音之后,一个请求里同时跑着三种脾气完全不同的计算,而你那套服务是照着其中一种的脾气设计的。

把它们放在同一条时间轴上,一眼就能看出问题:

同样 40 毫秒,三种计算切出来的「步」完全不是一回事一个整块,30 ms,中途插不进任何东西规矩:攒够一批一起算…每步 5 ms,步与步之间可以换人规矩:谁算完谁走,随时补新的第 1/30 步第 2/30 步第 3/30 步…轮数固定,这一批跑完之前谁都别想插队规矩:一批锁死右边那三条规矩两两打架。你只有一套调度器,只能取三者都不违反的那套 —— 也就是最保守的那套。空出来的四成 GPU,就是「最保守」的价格。
三种计算分别是:(把录音算成向量,来了就算算完就走)、(一个字一个字往外蹦,蹦多久事先不知道,而且越蹦占的显存越多)、(从噪声里反复打磨固定轮数,显存全程不变)。它们各自的机制是 02 到 05 篇,凑在一起为什么打架是 06 篇。

这一章讲清楚这三种计算各自是什么、怎么工作、为什么合不来。至于合不来之后该怎么办,是下一章 SGLang-Omni 的内容。

一、总分总:十篇怎么排

中间那四篇是模态 × 方向的四象限 —— 音频/视觉各占一行,进/出各占一列。你想查什么,对号入座:

进(理解)出(生成)
音频03 听04 说
图像 · 视频05 看06 画

二、十篇正文

#标题讲什么
01推理服务的基本概念从「模型为什么一个字一个字往外蹦」推出自回归、KV cache、预填充与解码、连续批处理、前缀缓存,以及吞吐和延迟为什么天然对立
02多模态大模型怎么工作为什么非要多模态而不是几个模型串起来、一个只会读文字的模型怎么学会看图(冻住 LLM 只训翻译层)、内部拆成哪五个部件,以及从服务角度看每个部件要多少钱
03听:音频怎么变成文字200 个向量对 11 个字、又没人标出对应关系;CTC / AED / Transducer 三条路各自怎么绕、Whisper 三十秒窗口、流式为什么必然牺牲准确率
04说:文字怎么变成音频逐点吐波形要跑七万步,所以必须两段式;RVQ 多码本、delay pattern 与帧内并行、零样本克隆、首包延迟花在哪
05看:图像视频怎么被理解一张图切成多少块、分辨率怎么直接变成 token 账单、动态分辨率的代价、视觉专家接法、视频为什么贵一个量级
06画:图像视频怎么被生成为什么宁可从噪声反复打磨三十轮、流匹配把路径拉直、CFG 让成本翻倍,以及自回归那套调度经验有哪六条会失效
07三种计算为什么合不来并发 64 时吞吐不涨、延迟翻倍、GPU 只用四成;一步、显存、攒批、指标四处冲突,那四成空闲逐项算出来
08Omni 模型与全双工五个部件长在一个模型里;thinker 与 talker 的分工、talker 为什么吃隐状态、打断为什么是一次分布式清理
09通用框架怎么 serve 多模态同一张图问五遍五遍一样慢、一来带图请求所有人卡一下;内容哈希、三级缓存、编码器预算、分块预填充切在图像中间

三、按症状挑

如果你是带着一个具体问题来的,不必从头读:

你遇到的看哪篇
容量估不准,一上并发就 OOM01 的 KV cache 一节,加 02 的 token 账
识别在没人说话的地方编出一整句03
合成能听,但首包要等两秒04
图像视频生成的成本算不明白06
GPU 明明闲着,堆并发却没用07
同一张图反复上传,缓存不命中09
想知道拆成多阶段之后长什么样下一章 SGLang-Omni

四、数据出处

来源用在哪
openai/whisperwhisper/audio.py02 / 03 篇的采样率、帧率、token 换算常数
EnCodec / DAC / SNAC 各自的 README02 篇的 codec 规格表
sglang-omnidocs/cookbook/02 / 04 / 05 / 07 篇的模型规格
sglang-omni 的 docs/_static/image/全章引用的官方架构图
sglangsrt/managers/mm_utils.pymm_schedule.py08 篇的内容哈希与跨请求批处理
vllmv1/core/encoder_cache_manager.py08 篇的编码器缓存与预算

六、缩写速查

正文里每个缩写第一次出现时都会给全称,这张表是回查用的

缩写全称中文一句话
ASRAutomatic Speech Recognition自动语音识别把语音转成文字
TTSText-To-Speech语音合成把文字念出来
CTCConnectionist Temporal Classification连接主义时序分类逐帧分类+空白折叠,绕开对齐标注
AEDAttention-based Encoder-Decoder基于注意力的编码解码编码器读整段,解码器逐字吐
RNN-TRecurrent Neural Network Transducer循环神经网络转换器每步只能出字或听下一帧
VADVoice Activity Detection语音活动检测判断这段有没有人在说话
WER / CERWord / Character Error Rate词 / 字错误率转写准不准,越低越好
RTFReal-Time Factor实时率合成 1 秒音频要花几秒,小于 1 才跟得上
RTFxRTF 的倒数——一秒能转写多少秒音频,越大越好
TTFT / TPOTTime To First Token / Time Per Output Token首字延迟 / 每字间隔文本生成的两个体感指标
TTFB / TTFCTime To First Byte / Chunk首包 / 首块延迟流式语音唯一的体感指标
KV cacheKey-Value cache键值缓存存下算过的中间结果,避免逐步重算
RVQResidual Vector Quantization残差向量量化多张码本逐层修正误差
mmmultimodal多模态框架代码里的通用前缀,如 mm_hash、mm_inputs
mm itemmultimodal item多模态输入项一张图或一段音频算一个,是缓存与调度的基本单位
mm hashmultimodal content hash多模态内容哈希内容本身的哈希,多模态世界里「前缀」的等价物
ViTVision Transformer视觉 Transformer把图切成小块当 token 处理
DiTDiffusion Transformer扩散 Transformer把扩散模型的骨干换成 Transformer
CFGClassifier-Free Guidance无分类器引导算两遍再外推,成本翻倍
VAEVariational Auto-Encoder变分自编码器把数据压到潜空间再解回来
MoEMixture of Experts混合专家每步只激活一部分参数
EPDEncoder–Prefill–Decode编码-预填充-解码把这三段拆成独立扩缩的服务
OOMOut Of Memory显存/内存不足装不下了