MoLe-VLA:动态深度推理让VLA机器人模型只跑一半层
发布时间:2026/10/17 9:18:38 锦皓数字建站

先把话说在前面这篇文章不打算复述论文摘要而是想聊一聊我读完 MoLe-VLA 这个工作之后的真实反应——它给我的第一感觉不是“又出来一个新 VLA”而是“终于有人对大模型推理延迟下狠手了”。做机器人操作模型的朋友应该都有同感VLAVision-Language-Action视觉-语言-动作这类大模型在仿真环境里跑得挺欢一旦上了真机最难搞的往往不是精度而是“反应速度”。一个大模型从看到画面到输出动作要完整过一次网络推理如果模型是 7B、13B 甚至更大单次推理延迟很可能超过 300ms这还没算图像编码和动作解码的时间。机器人的控制环路受不了这种延迟机械臂稍微动快一点你模型还没想清楚工件已经撞上去了。MoLe-VLA 想解决的问题就是把这个“推理太慢”的瓶颈从架构层面直接拆掉。MoLe-VLA 的核心思路说穿了很朴素大模型的每一层都可以被理解成一个“专家”不同层接受不同难度的任务既然不是每条指令都需要全部专家上场那就按需只跑一半的层。这个想法翻译成工程语言就是“动态深度推理”加“层级路由”但它和以往那些 Early Exit早退方案有本质区别——MoLe-VLA 不是简单地在某个中间层提前输出而是让模型自己学会判断“这一层对当前这个动作指令重不重要”不重要的层直接跳过。这篇文章我会把 MoLe-VLA 从设计动机、路由原理、训练方式到部署时可能踩的坑全部按实际操作的角度拆开讲一遍。我自己做过一段时间的机械臂抓取项目对延迟敏感这件事有切肤之痛所以下面很多分析会结合真实部署场景来说不会只讲空泛的概念。1. VLA 模型落地机器人最大的拦路虎是“反应太慢”1.1 先搞清楚 VLA 到底在做什么VLA 模型是这几年机器人操作领域的一个热门方向。它的输入通常是一段自然语言指令加一个或多个摄像头画面输出则是一个动作序列比如机械臂末端的目标位置、夹爪的开合角度或者轮式底盘的速度指令。和传统机器人控制用的“感知-规划-控制”三段式管线不同VLA 试图把感知、语义理解、任务规划和动作生成全都塞进一个端到端的大模型里。好处很明显不需要手写一堆状态机也不需要为每个任务单独设计中间表征。只要数据够多、够干净模型自己能从“识别螺丝刀”到“调整手腕姿态”全链路完成。坏处也很明显一个模型承担越多职责它的参数量就越大推理延迟就越高。市面上主流 VLA 动辄 7B 起步还能见到不少基于 13B、34B 甚至 70B 模型改造的工作。做机器人的人对延迟是零容忍的一个 50Hz 控制频率的机械臂留给模型推理的预算往往不超过 10ms——但 7B 模型在单张消费级 GPU 上单次前向推理最快也要 80~150ms。这个量级的差距不是靠优化 CUDA kernel 就能抹平的。我用过一个实际场景来说明工业流水线上机械臂要完成“把眼前这个红色螺丝钉放到蓝色料框里”。VLA 模型需要先看懂指令里的“红色”“螺丝钉”“蓝色料框”三个关键语义再在画面中定位螺丝钉位置、估计料框深度然后生成一条无碰撞的运动轨迹。每一步都对应模型不同层的不同表征。如果没有层级别的智能分配模型就只能老老实实把每一层都跑一遍——哪怕前面二十层已经在第一帧图像里提取出了足够信息模型也不会因此少算几层。1.2 延迟从哪来一次推理要过完所有层大模型推理慢核心原因之一就是“计算量恒定”。Transformer 架构里每一层的计算复杂度基本一致无论是处理“把杯子拿起来”这种简单指令还是处理“把零件插入三个孔同时避开黄色区域”的复杂指令模型都会把全部层都跑一遍。你可以把这种方式理解成一支全员出动的施工队无论任务是搬一块砖还是盖一栋楼工地上永远是所有人到位、所有工序走一遍。从工程角度看恒定计算量有个优点推理延迟稳定、内存占用可预估部署时容易做资源规划。但它的代价就是浪费。真实世界里的机器人操作指令复杂度分布极其不均衡绝大多数指令在语义上是简单的比如“向左移动 5 厘米”“打开夹爪”“停”。如果模型能针对简单指令只跑 20 层复杂指令才跑全部 40 层平均延迟可以压缩一半左右而精度不会有太大损失。这就是 MoLe-VLA 想干的事。我做一个不太严谨但很好懂的计算示例假设一个 40 层的 VLA单层前向推理平均耗时约为 4ms。全量推理就是 160ms加上视觉编码和动作解码整机延迟在 200ms 左右。如果模型能够对 60% 的简单指令只跑 20 层对 40% 的复杂指令跑全部 40 层那么平均推理延迟就是0.6 × 80ms 0.4 × 160ms 112ms再算上固定开销 40ms总延迟约 152ms。相比原来的 200ms降低了约 24%。如果路由器把“跑一半层”的比例提高到 80%即只有 20% 指令需要全层推理总延迟可以压到约 128ms降低 36%。对于控制频率要求不高的任务比如料框分拣、缓慢移动的传送带抓取这个延迟已经够用了。而 MoLe-VLA 声称的“只跑一半层”对应的正是这种动态计算分配。2. MoLe-VLA 怎么破局把每一层当作“专家”来路由2.1 从“每层都是专家”这句话说起MoLe-VLA 这个项目名里的 MoLe我理解是 Mixture-of-Layers 的缩写也就是“层混合”的意思。它的核心观点是把大模型的每一个 Transformer 层看成一个独立的“专家”然后训练一个轻量的路由器让模型为每条输入动态选择需要激活的层。这个说法其实很有讲究。传统 MoEMixture-of-Experts专家混合模型路由的对象是 FFN前馈网络模块常见做法是在 FFN 层并行放置多个专家每次只激活 Top-2 个专家。但 MoE 的问题是它只节省了 FFN 的计算量Attention注意力部分还是一层一层老老实实算整体加速比有限。MoLe-VLA 路由的对象是整个 Transformer 层——从 Attention 到 FFN 一起跳过。单层跳过的收益显然比 MoE 里只跳过 FFN 要高一截。我把这个设计类比成医院的“分级诊疗”传统 VLA 相当于每个病人都要把内科、外科、骨科、五官科全部科室看一遍MoE 相当于每个病人只看 2 个科室但这两个科室内部的检查项目一项不能少MoLe-VLA 则是每个科室内部也做了分级——病情轻的病人直接跳过不必要的检查项目只做核心诊断。从工程实现角度把每层当作专家藏着两个关键点。第一层和层之间有天然的前后依赖关系你不能像 MoE 那样自由选择任意两个专家并行计算必须先确定“要跑到第几层”然后按顺序计算。第二跳过一层意味着所有后续层看到的输入特征都变了模型的隐空间表征会被截断如果路由器判断不准确轻则精度下降重则直接无效输出。所以 MoLe-VLA 的难点不在“怎么跳”而在“怎么判断该不该跳”。2.2 按需只跑一半层动态深度是怎么实现的静态深度比如固定只用前 20 层和动态深度的差别在于“预测头”放在哪里。MoLe-VLA 的做法是在每个候选出口层旁边挂一个二分类器输入是这一层的隐状态输出是两个概率一个表示“当前隐状态已经足够支撑这个动作决策”另一个表示“还没到火候、需要继续往下跑”。实际训练时路由器不是独立训练的而是和模型一起做端到端优化。损失函数有两部分一部分是标准的 VLA 动作预测损失另一部分是路由决策的交叉熵损失。为了让路由器学会“什么时候该停”MoLe-VLA 在训练时会给中间层出口施加监督信号——也就是把每一层的隐状态都送去预测真实动作如果某层的预测结果已经足够好路由器就学会在这个位置输出“停止”。为了保证“该停就停”而不是“尽量不停”通常在损失函数里还会加一个 FLOPs 正则项鼓励模型在达到精度要求的前提下尽量减少被激活的层数。这里有一个我和很多同行都关注的问题动态深度会不会让模型学歪比如路由器为了减少计算量对复杂指令也在很浅的层就提前输出结果机械臂每次都偏向一侧、永远抓不到工件。解决这个问题的常见手法是给“跳过层”加一个阈值只有当预测的隐状态置信度高于某个阈值比如 0.8路由器才会产生跳跃行为否则强制全层推理。同时在训练阶段让路由器输出的“停止概率”参与梯度计算让模型在训练中逐步学会权衡“早停”和“精度”之间的取舍。我在自己的实验里踩过类似的坑阈值设太低比如 0.5模型就开始偷懒设太高比如 0.95绝大多数样本都在全层运行省不了多少时间。最终合适的阈值要根据任务数据分布去调通常落在 0.8~0.9 之间才比较稳。MoLe-VLA 声称“按需只跑一半层”更准确的说法是“平均激活层数约为总量的一半”。这里的“一半”不是一个固定值而是模型在精度和速度之间取得的平衡。3. 动态深度推理为什么比“蒸馏、量化、早退”更吸引人3.1 常见的模型加速手段各有各的局限做模型部署的人遇到“推理太慢”第一反应通常有三个方向量化、蒸馏、权重剪枝。量化把 FP16 降到 INT8 或 INT4是目前工业界最常用的手段因为它的收益直接且改造成本低。把 7B 模型量化到 INT4推理速度能提升 2~3 倍模型体积也大幅缩小。但量化的天花板很明显一是精度损失在低比特下非常敏感机器人操作场景里一个小数点的偏差可能直接体现在机械臂的末端坐标上抓取误差可能从毫米级变成厘米级二是量化优化的是单层计算效率它不会改变“必须跑完所有层”这个结构性问题——你可以把每一层算得更快但层数一层都不会少。蒸馏则是拿大模型当老师训练一个小模型去模仿大模型的输出。它的优点是部署的时候可以彻底换成小模型延迟下降明显。但蒸馏也有麻烦端到端 VLA 模型的训练成本本来就高再单独训一个学生模型相当于预算翻倍而且蒸馏得到的小模型在“长尾操作指令”上的泛化能力通常会打折一些大模型能轻松处理的不常见指令学生模型容易懵。早退Early Exit和 MoLe-VLA 最接近——它在模型中间层挂出口如果某个中间层的输出置信度足够高就提前结束推理。但早期退出方案有个结构性短板中间层的表征是“半成品”直接用它做动作预测精度上限有限。MoLe-VLA 做的不是简单“早期退出”它把每一层都转化成可路由的专家配合多种训练策略包括让不同层学习到不同粒度的特征来确保即使跳过后半层最后使用的特征也不是粗糙的中间特征而是一种“已经经过充分加工”的特征。这个差异很微妙但实际结果差距不小。3.2 MoLe-VLA 如何平衡“省计算”和“保精度”我看 MoLe-VLA 时最关心的就是你省了这么多计算精度到底掉多少。论文里的说法是在多个机器人操作 benchmark 上MoLe-VLA 在几乎不掉精度的前提下把平均激活层数降到了一半左右。也就是说它不是用明显精度损失换速度而是充分利用了 VLA 任务本身的计算冗余。这个结论背后是有逻辑可言的。VLA 模型的输入融合了图像特征和文本指令特征这些特征在浅层的冗余度很高。前几层主要在做基础的视觉边缘检测、颜色聚类、语义词映射很多层的计算对最终动作的影响其实微乎其微。过去由于 Transformer 架构固定这些层的计算无法跳过只能硬扛MoLe-VLA 把“层”变成可路由单元等于让模型自己去发现并跳过这些冗余计算相当于给模型做了一次“结构级的自适应剪枝”。另外MoLe-VLA 的层路由不是全局 tag而是和输入强相关的动态决策。同样是“向左移动 5 厘米”当画面干净、工件静止时模型可能只跑 20 层但同样的指令在画面杂乱、背景有干扰物时模型可能跑 30 层。这种“按输入动态调整深度”的特性比静态剪枝或者固定层数的方案更贴近真实部署需求。我在实际项目中试过把固定层数砍半再微调结果差强人意有些任务精度不变有些任务直接崩。因为固定砍层是“一刀切”没有考虑输入难度分布。MoLe-VLA 的思路是“模型自己决定”相当于给了模型一把剪刀而不是直接帮它剪掉。这也是这个工作最让我觉得有价值的点——它把计算分配问题从“人工决策”变成了“模型决策”。4. 真要复现和落地训练和部署的实操细节有哪些4.1 训练阶段路由器不能“放养”必须给足约束如果你准备在自己的 VLA 项目里复现 MoLe-VLA 的思路先别急着改模型结构。训练阶段的几个关键点必须安排好否则路由器根本训不出来。首先是数据。动态深度路由需要数据有“难度多样性”。如果你的训练集里全是“红色螺丝放到蓝色料框”这类简单指令模型很快就会学会只跑 15 层因为 15 层已经够应付这些任务。一旦遇到复杂指令路由器会习惯性地在浅层输出“停止”精度就崩了。反过来如果数据全是高难度操作路由器又倾向于全部层都跑省不了多少计算。正确做法是刻意在数据集里混合不同难度等级的任务确保路由器有机会学习不同输入对应的合理激活深度。其次是损失函数设置。我的习惯是“动作预测损失 路由交叉熵损失 FLOPs 正则损失”三合一。动作预测损失保证主任务精度路由交叉熵损失给路由器提供监督信号告诉它“这个样本应该在第几层结束”FLOPs 正则损失用来控制整体计算量。三个损失之间需要一个调节系数。起始阶段建议把 FLOPs 正则项的权重设小一点比如 0.01让模型先保证精度稳定后再逐步调大。如果你一上来就把 FLOPs 系数设成 0.1路由器很可能会牺牲精度换取省计算出现“输出乱飞、机械臂乱抖”的现象。第三是中间层出口的监督。每一层都要接一个动作预测头但不要每个头都用同样的监督强度。比较稳妥的做法是后层出口的损失权重比浅层出口大保证模型主要学习方向是“后层更准”路由器也会因此倾向于在后层结束随着训练进行前三层的预测头可以冻结或直接移除让模型把精力集中在更合理的运行区间。4.2 推理阶段动态深度对显存和批处理很不友好训练只是第一步部署才是真正考验动态深度方案的地方。我在实际踩坑中发现动态深度模型在单样本流式推理场景下效果很好但一旦你要做批处理batch inference问题就来了。以 GPU 推理为例传统 Transformer 推理时batch 内所有样本都跑相同的层所以可以整齐地同步推进每一层的计算。MoLe-VLA 的动态深度不一样同一个 batch 里的 A 样本可能在第 20 层就停了而 B 样本要足足跑完 40 层。这时候如果你按“同步层”的方式推进A 样本必须等 B 样本跑到 40 层节省下来的时间被全部浪费掉。想要真正发挥动态深度的优势就必须改成“按样本异步控制”的执行流或者用“动态 batch”的方式把已经结束的样本让出计算资源给还在运行的样本。这里我要提一个量化收益的办法。如果你的部署环境只允许同步计算那么动态深度反而会增加工程复杂度收益很小。我建议团队在评估 MoLe-VLA 之前先想清楚自己的推理场景是“单路串行”还是“多路并行”。单路串行比如一个机器人配一张卡动态深度是实打实的收益多路并行比如一个边缘盒子管 4 台机器人动态深度带来的显存释放和调度复杂度可能得不偿失。这个和量化不同量化不管什么场景都是正向收益动态深度需要场景匹配。还有一个部署细节是“预热策略”。动态深度在刚启动时路由器需要基于大量输入来调整内部统计量如果 batch 里的前几条数据全是很复杂的指令路由器会跑满全层导致响应曲线前几个请求延迟偏高。我的处理方式是在服务启动后先用一批历史数据做预热推理把路由器的决策分布拉到一个比较稳定的状态再正式开始接收任务。这个操作代码上很便宜但对线上首请求体验帮助很大。部署场景动态深度收益主要难点建议单路串行推理高延迟直接降阈值调整首选方案多路并行批处理中低受同步约束动态batch调度复杂需要定制推理引擎离线数据集推理高省电省时无直接套用边缘设备端到端中受内存限制层跳过后显存释放逻辑需注意内存碎片5. 实战中会遇到的问题以及我的排查经验5.1 路由器“偷懒”全部跳过或者全部不跳怎么办这是动态深度模型最容易出的问题。如果训练时 FLOPs 正则系数太高模型学到的策略就是“所有输入都在最浅层结束”因为这样损失最小。表现就是部署后平均激活层数异常低比如 10 层但动作精度惨不忍睹。排查方法很简单打印一批验证集上的“层出口分布直方图”。如果直方图在“20 层”处出现一个极高峰说明路由器偷懒了。修复方式是降低 FLOPs 正则权重同时把浅层出口的预测头移除强制模型必须跑到更深层才能决策。另外还有一个比较隐蔽的原因训练数据里简单样本占比过高。如果简单样本 80% 以上路由器天然会倾向于浅层结束。这种时候要看你的真实业务分布如果线上确实绝大多数都是简单指令那这个结果反而正常如果线上复杂指令多就要调整训练数据配比。反过来如果模型所有样本都全层推理平均激活层数接近 100%那多半是路由器没训起来。常见原因是路由交叉熵损失的权重太小或者中间层的监督信号太弱模型根本没意识到“可以早停”。这时候可以人工构造一批“简单样本”比如固定抓取同一位置的物体打上“应早停”的伪标签强行让路由器学会区分。5.2 层跳过后精度不降但为什么动作执行还是不对劲有一次我在项目里发现一个有意思的现象MoLe-VLA 在离线测试里精度很高但上真机后机械臂几次在运动中停顿像是思考了很久才继续动作。排查后发现原因是层跳过后模型的注意力分布产生了“不连续跳跃”。打个比方20 层和 22 层的特征本应是平滑过渡的现在直接从 20 层跳到 28 层28 层拿到的输入是“20 层输出”但它训练时的输入分布是“26 层输出”两者之间存在 mismatch。这种情况下模型虽然最终动作是对的但中间隐状态在不同层之间出现“分布漂移”导致模型输出动作序列时隐含的表征连续性变差表现就是动作序列前后不连贯。解决这个问题我采用的方案是在训练时给跳过层加入一个对齐损失让第 20 层的输出尽量接近正常路径下第 21 层的输出。也就是在路由器决定跳过某层时附加一个“特征蒸馏损失”把全量模型对应层的隐状态作为目标逼迫浅层特征去模拟深层的表征。这个方法在复现类似动态层模型时非常有用强烈建议加进去。5.3 硬件利用率不升反降先检查是不是 GPU 同步开销过大我们最开始在一个 4090 集群上跑 MoLe-VLA 的推理发现平均延迟确实降了但 GPU 利用率反而比全量模型下降了 10 个百分点。原因很好猜动态层跳过后计算空出来的时间片不足以再启动一轮新的 CUDA kernelGPU 出现了小段闲置。这种情况在 batch size 很小时尤其明显。解决思路是不要过度追求单次请求的低延迟而是把动态深度和超线程调度结合起来。用一个小型调度器把多个短请求拼成一个大 batch让先结束的样本所在的计算单元立刻处理新到达的请求。或者干脆在请求并发度低的时段关闭动态深度逻辑切回全量推理模式保证 GPU 吞吐。模型设计是死的但调度策略是活的动态深度模型在接入工业场景时真正的优化空间往往在推理引擎层而不是模型层。6. MoLe-VLA 这类方案后续还能往哪个方向扩展写到最后我想再说一个我比较看好的扩展方向把“层路由”和任务难度的在线估计打通。如果模型不只是被动地对输入做路由决策而是能输出一个“当前任务难度置信度”机器人控制器就可以根据这个置信度实时调整运动速度。简单任务时机械臂快速执行复杂任务时自动降速、增加反馈校验这样整机效率还能再上一个台阶。另外MoLe-VLA 目前解决的更多是单机单模型场景。如果把视野放到多机器人协作动态层路由和任务调度之间的互动会变得更有意思。每个机器人可以按需请求不同深度的计算资源调度中心统一分配 GPU 显存和算力。这种“计算资源按需分配”的架构如果能和 MoLe-VLA 的路由策略配合起来我觉得才是接近机器人集群落地时的最终形态。我个人在实际操作中最深的体会是模型架构上的创新真正落地时拼的其实是工程细节。MoLe-VLA 给了一个很漂亮的“层即专家”的思路但路由阈值、特征对齐、batch 调度、数据配比每一个环节都要花时间打磨。如果你正准备在自己的机器人操作项目里尝试这个方向建议先从小规模仿真场景入手把动态深度带来的数据分布变化吃透再往真机上迁移。模型可以先傻一点动作反应慢一点没关系但一定不能让它“自以为聪明”地跳过该算的层那个坑我踩过代价不小。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。