尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

StreamPI:流式多模态时间建模如何赋能VLA机器人实时操作

StreamPI:流式多模态时间建模如何赋能VLA机器人实时操作 之前在做机器人操作相关的多模态模型调研时发现一个很现实的问题视频理解与动作预测的模型大多建立在“一次性看完整个视频”的基础上一旦任务变为长程操作或者在真实机器人上做实时决策就会出现延迟高、显存爆炸、时序关系丢失等问题。最近看到 StreamPI 这一思路它把流式处理、多模态时间建模与视觉-语言-动作模型Vision-Language-Action Models简称 VLA结合起来正好踩中了这类痛点。本文就围绕 StreamPI 的核心思路做一次完整的拆解从 VLA 的背景、时间建模难点、StreamPI 的模块设计到可参考的实现思路与工程落地的注意事项尽量把一个偏论文向的概念讲成能落地的技术笔记。如果你关注多模态大模型、机器人操作、自动驾驶决策或者正在做视频相关的时序建模这篇文章会比较合适。读完你会理解VLA 模型为什么需要流式设计StreamPI 这类方法解决的核心问题是什么以及如果要在自己的项目中实现一套类似机制代码与工程上应该从哪些地方入手。1. 背景与核心概念1.1 从 VLA 模型说起Vision-Language-Action Models即视觉-语言-动作模型是近两年机器人领域非常热门的一类多模态模型。它的输入通常包含两部分视觉信息摄像头采集的图像或视频流。语言指令自然语言描述的任务目标比如“把红色杯子放到托盘上”。模型的输出不再是文本而是具体的动作序列例如机械臂末端的位置增量、关节角速度或者底盘的运动指令。VLA 模型把“看”、“理解”、“行动”三个环节压缩到了一个模型中因此被广泛用于机器人操作、导航、以及部分自动驾驶场景。比较有代表性的早期工作包括 Google 的 PaLM-E、RT-2以及后来的 OpenVLA 等。它们的基本思路是用一个大模型作为“大脑”把视觉 token 和语言 token 组织成统一的序列然后通过自回归的方式预测动作 token。这种设计的优点是任务理解能力和泛化能力都比较强缺点也很明显当输入变成连续的视频流或者任务时间跨度较长时模型的计算量会迅速膨胀。1.2 为什么需要“时间建模”VLA 模型面对的不是一张静态图片而是一段连续的视频或一组连续观察。机器人需要通过当前画面、上一秒的画面、动作执行后的反馈来判断下一步行为。比如倒水这个动作如果只看某一帧模型无法判断水是否已经倒满只有结合连续几帧的液面变化和杯子的倾斜角度才能做出准确决策。所谓时间建模就是让模型具备“跨帧感知变化”的能力。它在视频理解、动作识别、机器人控制等领域都很关键。对于 VLA 模型时间建模不仅影响理解能力还直接影响动作的稳定性。假设模型只看到当前帧那么它输出的动作很容易出现抖动如果模型能结合过去几帧的信息就能在时序上做平滑和预测动作输出会更接近真实的机器人控制信号。1.3 流式处理要解决什么问题传统的视频模型通常采用离线处理方式先把整个视频切片、抽帧然后一次性送入模型。这种方式有两个问题延迟高需要等待视频采集完成或者需要足够多的帧才开始推理。对于实时机器人控制延迟几十毫秒就可能造成任务失败。显存占用大视频帧转换成 token 后数量惊人。一次处理几十帧甚至上百帧显存很容易被耗尽。无法处理无限长度真实场景中视频是持续增长的不可能一直拼接下去。流式处理Streaming Processing的思路是模型不等待完整视频而是随着时间不断接收新的帧并在每帧或每几帧到达后立即做出预测。它维护一个内部状态这个状态记录了历史信息因此模型既能感知到“过去发生了什么”又不需要把所有历史帧都重新计算一遍。StreamPI 这个名字可以拆成 Stream PI。PI 可以理解为 Perception-Intervention 或者 Prediction-Interaction在不同资料中解释略有差异但核心都指向“流式感知 动作交互”。整体来看StreamPI 的目标是给 VLA 模型加入一套完整的流式多模态时间建模机制让模型在长时间任务中也能稳定工作。1.4 StreamPI 与其他多模态时间建模方案的区别多模态时间建模并不是一个新概念。视频理解领域有大量时序模型比如基于 3D 卷积的 I3D、基于 Transformer 的 TimeSformer、VideoMAE 等。但在 VLA 场景下时间建模需要满足几个额外要求要求说明实时性每帧到达后需要在规定时间内输出动作不能等整段视频结束动作连续性模型输出的动作序列要平滑不能出现大幅度跳变跨模态对齐视觉特征、语言指令、动作历史需要在同一时间轴上对齐长期依赖一些任务需要记住很早之前的状态比如“已经拿过杯子”StreamPI 的设计正是围绕这几条要求展开的。与传统视频模型不同它不追求对整段视频做全局建模而是采用“滑动窗口 状态记忆”的方式在保证历史信息不丢失的前提下控制计算复杂度。2. 环境准备与版本说明由于 StreamPI 本身属于研究型内容本文更侧重于方法拆解与思路复现。但为了让你在学习时有一个可操作的环境我建议按下面这套环境来准备。2.1 推荐环境操作系统Ubuntu 20.04 或 22.04Windows 也可以跑通核心模块但机器人控制相关代码通常以 Linux 为主。Python3.9 或 3.10。深度学习框架PyTorch 1.13 或 2.x需要根据你的 CUDA 版本选择对应的安装命令。视觉模型后端HuggingFace Transformers、timm用于加载图像编码器。数据集如果做机器人实验可以使用 RLBench、Libero 或 BridgeData如果只是学习时间建模可以先用视频分类或视频预测类数据集。硬件建议至少一张 24GB 显存的 GPU比如 RTX 3090/4090 或 A5000。如果显存不够可以把输入分辨率降低、帧率降低或者减小模型规模。2.2 关于版本的说明StreamPI 的论文细节可能会随着版本更新而变化比如不同时间发布的版本使用的视觉骨干网络、模型参数量、训练数据都可能不同。因此下面的环境配置只作为通用参考不绑定某个具体版本。你在复现时应当以你拿到的仓库 README 或论文最新版本为准。如果你暂时不具备实验条件也可以先用小规模的视频预测模型做时间建模实验理解核心原理后再过渡到 VLA 场景。本文的代码示例不依赖 StreamPI 官方实现而是用通用组件演示“流式时间编码”这一核心机制便于你在自己的项目中迁移。3. 核心原理拆解StreamPI 所代表的流式多模态时间建模在框架上通常包含以下几个核心模块。需要提前说明的是这里描述的模块划分是结合论文公开思路与通用做法的总结具体到 StreamPI 的原始实现可能有所差别但整体设计逻辑是相通的。3.1 流式视觉编码器视觉编码器的作用是把图像帧转换为视觉特征。普通的图像编码器一次只处理一张图而流式视觉编码器需要处理的是一个时间序列的图像帧。一种常见设计是“单帧编码 时序聚合”。首先对每一帧使用参数共享的卷积网络或 ViT 提取特征然后将连续帧的特征在时间维度上进行加权融合。这个融合过程可以是简单的均值池化也可以是更复杂的时序注意力。从实现角度来看为了降低计算量通常会使用一个轻量级的骨干网络比如 ResNet-18 或 Small ViT。如果直接使用 ViT-Large 级别的编码器单帧推理已经非常耗时很难做到实时。StreamPI 这类方法一般会控制视觉 token 的数量例如保留 16x16 或 8x8 的空间 token再叠加时间维度的 token从而控制输入序列长度。3.2 时间状态记忆模块时间建模最难的点在于“既要记住过去又不能把所有过去都重新算一遍”。当前主流的做法是用一个状态向量或一组状态 token 来表示历史信息每次有新帧进来时先将新帧与历史状态进行融合再得到新的状态。这个机制和循环神经网络RNN中的隐藏状态非常像但在 Transformer 架构下通常会用“上下文缓存”的方式来实现。所谓上下文缓存就是把前面几轮计算得到的 key 和 value 缓存下来在当前帧计算时直接复用。这样可以省去对历史帧的重复前向计算同时又保持了注意力能够覆盖到历史信息。在 StreamPI 的实现思路中时间状态记忆模块大致可以拆成两个层次短期记忆维持最近若干帧的原始特征给模型提供精细的时序上下文。长期记忆通过状态 token 来记录更早的信息状态 token 不直接对应某一帧而是对一段时间内信息的独立抽象。这种“短期窗口 长期状态”的双层设计兼顾了精度与效率也是流式视频模型中最常见的架构之一。3.3 时间戳感知的跨模态对齐多模态时间建模中有一个容易踩坑的地方视觉、语言、动作三个模态的采样频率完全不同。摄像头可能是 30 FPS语言指令只有一条动作信号可能是 10 Hz 或 20 Hz。如果不做对齐模型会混淆各模态之间的时间对应关系。一种可行的方案是引入“时间戳嵌入”。为每个 token 添加一个时间编码向量这个向量和 Transformer 中常用的位置编码类似只不过位置编码编码的是序号而时间戳嵌入编码的是真实时间。比如第 0.0 秒的帧、第 0.03 秒的帧、第 0.06 秒的帧它们对应的时间戳分别是不同的嵌入向量。语言指令虽然只有一条但它表示的是一个长期任务目标因此可以给语言 token 设置一个较宽的时间范围或者不区分具体时间戳仅作为全局条件。动作 token 则与视觉帧保持同步因为它本身就是对视觉状态的反应。3.4 动作预测头与闭环控制VLA 模型最终要输出动作。动作的表示方式有很多种常见的有输出关节角度的增量即 delta action。输出末端执行器的目标位置。输出离散化的动作 token再由解码器还原为连续控制信号。从工程角度看delta action 更常用因为增量式预测误差更小、训练更稳定。StreamPI 中动作预测头通常放在 Transformer 输出层之后通过一个 MLP 将隐藏状态映射为动作向量。为了保证动作平滑可以在后续加入低通滤波或滑动平均。闭环控制指的是模型输出动作后机器人执行动作、传感器返回新状态、模型再基于新状态输出下一步动作。这个循环是流式 VLA 模型的基本工作方式因此模型的推理延迟直接决定了控制频率。4. 完整实战案例实现一个流式时间编码模块前面的内容偏理论接下来我们用代码实现一个简化的“流式时间编码模块”帮助你理解 StreamPI 中时间建模的核心逻辑。这个模块不是 StreamPI 的官方实现而是一个教学示例可以迁移到自己的项目中使用。4.1 创建项目结构先创建一个干净的 Python 项目目录结构如下stream_pi_demo/ ├── main.py ├── models/ │ ├── __init__.py │ ├── visual_encoder.py │ ├── temporal_memory.py │ └── action_head.py └── utils/ ├── __init__.py └── time_embedding.py其中各文件职责visual_encoder.py负责提取单帧图像特征。temporal_memory.py实现短期缓存与长期状态的融合。action_head.py将最终隐藏状态映射为动作增量。time_embedding.py生成时间戳嵌入。4.2 安装依赖使用 pip 安装 PyTorch 和 torchvision以 2.x 版本为例pip install torch torchvision如果安装较慢可以使用国内镜像源pip install torch torchvision -i https://pypi.tuna.tsinghua.edu.cn/simple其他文件使用 Python 标准库即可不需要额外依赖。4.3 编写时间嵌入模块时间嵌入的作用是让模型感知到当前帧的时间位置。这里我们使用类似 Transformer 位置编码的正余弦编码方式但输入改为真实时间戳。# 文件路径stream_pi_demo/utils/time_embedding.py import math import torch import torch.nn as nn class TimeEmbedding(nn.Module): def __init__(self, d_model: int, max_period: float 100.0): super().__init__() self.d_model d_model self.max_period max_period def forward(self, timestamps: torch.Tensor) - torch.Tensor: timestamps: shape [B, T], 单位是秒。 返回: [B, T, d_model] B, T timestamps.shape device timestamps.device # 将时间戳扩展为 [B, T, 1]便于和频率向量做外积 timestamps timestamps.unsqueeze(-1) # 计算频率 [d_model // 2] i torch.arange(self.d_model // 2, devicedevice).float() freq 1.0 / (self.max_period ** (2 * i / self.d_model)) # 角度 时间戳 * 频率 angles timestamps * freq # [B, T, d_model // 2] # 交替使用 sin 和 cos sin_emb torch.sin(angles) cos_emb torch.cos(angles) # 拼接后得到 [B, T, d_model] emb torch.cat([sin_emb, cos_emb], dim-1) return emb这段代码把时间戳映射到固定维度的向量模型在学习时可以通过这个向量判断两帧之间的时间距离。如果两帧之间间隔较大它们的时间嵌入差异也会较大。4.4 编写视觉编码器为了演示视觉编码器直接使用一个轻量级卷积网络提取特征不需要预训练权重。# 文件路径stream_pi_demo/models/visual_encoder.py import torch.nn as nn class VisualEncoder(nn.Module): def __init__(self, img_channels: int 3, feat_dim: int 512): super().__init__() self.conv_net nn.Sequential( nn.Conv2d(img_channels, 64, kernel_size4, stride2, padding1), nn.ReLU(), nn.Conv2d(64, 128, kernel_size4, stride2, padding1), nn.ReLU(), nn.Conv2d(128, 256, kernel_size4, stride2, padding1), nn.ReLU(), ) # 假设输入是 64x64经过 3 次 stride2 卷积后变成 8x8 self.proj nn.Linear(256 * 8 * 8, feat_dim) def forward(self, x): # x: [B, T, C, H, W] B, T, C, H, W x.shape x x.reshape(B * T, C, H, W) feat self.conv_net(x) feat feat.flatten(1) feat self.proj(feat) feat feat.reshape(B, T, -1) return feat这里故意把图像尺寸设定为 64x64方便在小显存环境下运行。实际项目可以根据你的机器人相机分辨率调整但需要注意分辨率越高视觉 token 越多计算量也就越大。4.5 编写时间记忆模块时间记忆模块是整个流式建模的关键。我们采用一个最简单的实现维护一个状态向量state每拍进来一帧就把当前帧特征和上一帧状态拼接通过 GRU 更新状态。# 文件路径stream_pi_demo/models/temporal_memory.py import torch import torch.nn as nn class TemporalMemory(nn.Module): def __init__(self, input_dim: int, state_dim: int): super().__init__() self.state_dim state_dim self.gru_cell nn.GRUCell(input_dim, state_dim) def forward(self, feat_stream: torch.Tensor, state: torch.Tensor None): feat_stream: [B, T, input_dim] state: [B, state_dim] 或 None 返回: outputs: [B, T, state_dim] final_state: [B, state_dim] B, T, _ feat_stream.shape if state is None: state torch.zeros(B, self.state_dim, devicefeat_stream.device) outputs [] for t in range(T): state self.gru_cell(feat_stream[:, t, :], state) outputs.append(state.unsqueeze(1)) outputs torch.cat(outputs, dim1) return outputs, state这里使用 GRU Cell 而不是完整 GRU是为了强调“逐帧更新”的过程。在实际工程中你可以把循环展开成torch.jit.script或用 CUDA 图来加速但思路是一样的每帧只做一次轻量更新历史信息保存在state中。4.6 编写动作预测头动作预测头把状态输出映射为动作增量。# 文件路径stream_pi_demo/models/action_head.py import torch.nn as nn class ActionHead(nn.Module): def __init__(self, state_dim: int, action_dim: int): super().__init__() self.mlp nn.Sequential( nn.Linear(state_dim, 256), nn.ReLU(), nn.Linear(256, action_dim), ) def forward(self, state): # state: [B, state_dim] return self.mlp(state)动作维度根据机器人类型变化。例如机械臂末端位姿通常是 6 维或 7 维3 个位置、3 个姿态、可选的夹爪开合轮式机器人底盘动作可能是 2 维线速度、角速度具体以实际设备为准。4.7 组合成完整的流式 VLA 推理流程在main.py中我们把这些模块串起来模拟一个流式输入过程。# 文件路径stream_pi_demo/main.py import torch import torch.nn as nn from models.visual_encoder import VisualEncoder from models.temporal_memory import TemporalMemory from models.action_head import ActionHead from utils.time_embedding import TimeEmbedding class StreamPIVLADemo(nn.Module): def __init__(self, img_size: int 64, state_dim: int 512, action_dim: int 7): super().__init__() self.visual_encoder VisualEncoder(feat_dimstate_dim) self.time_embedding TimeEmbedding(d_modelstate_dim) self.temporal_memory TemporalMemory(state_dim, state_dim) self.action_head ActionHead(state_dim, action_dim) def forward_single_step(self, frame, timestamp, state): 模拟流式推理每次只输入一帧。 frame: [B, C, H, W] timestamp: [B, 1] state: [B, state_dim] 或 None # 增加时间维度 frame frame.unsqueeze(1) feat self.visual_encoder(frame) # [B, 1, state_dim] time_emb self.time_embedding(timestamp) # [B, 1, state_dim] feat feat time_emb # 更新记忆状态 _, state self.temporal_memory(feat, state) # 输出动作 action self.action_head(state) return action, state if __name__ __main__: model StreamPIVLADemo() optimizer torch.optim.Adam(model.parameters(), lr1e-4) # 模拟一段长度为 T 的输入流 T 20 B 1 state None total_loss 0.0 for t in range(T): # 模拟输入随机生成一帧图像和时间戳 frame torch.randn(B, 3, 64, 64) timestamp torch.tensor([[t * 0.1]]) # 每 0.1 秒一帧 target_action torch.randn(B, 7) # 假设是 7 维机械臂动作 action, state model.forward_single_step(frame, timestamp, state) # 用简单的 MSE 损失来演示训练循环 loss nn.functional.mse_loss(action, target_action) optimizer.zero_grad() loss.backward() optimizer.step() total_loss loss.item() print(f训练完成平均 loss: {total_loss / T:.4f})4.8 运行与验证运行以下命令cd stream_pi_demo python main.py预期输出类似训练完成平均 loss: 1.0241因为输入是随机生成的loss 不会收敛到一个很小的值这很正常。这个示例主要是演示“流式”的完整流程每一帧输入后立即更新状态、立即输出动作而不是一次性输入整段视频。如果你把forward_single_step中的处理逻辑和真正的机器人控制循环对接起来就可以这样工作while robot.is_active(): frame robot.get_camera_frame() timestamp robot.get_current_time() action, state model.forward_single_step(frame, timestamp, state) robot.execute_action(action)这就是流式 VLA 模型最基本的使用方式。5. 常见问题与排查思路在实际实现或复现 StreamPI 思路时经常会遇到一些问题。下面整理几个典型情况以及排查思路。问题现象常见原因解决思路显存不足程序崩溃输入分辨率过高或序列长度太长降低输入分辨率、减小 batch size、使用梯度累积推理速度慢控制频率不达标模型参数量太大或没有做推理优化使用轻量级骨干网络、TensorRT 或 ONNX 加速、减少缓存 token动作输出抖动机械臂震动没有对动作做平滑处理在动作输出后加滑动平均或低通滤波时间戳不均匀训练不稳定不同模态的时间步没有对齐统一使用绝对时间戳避免使用整数帧序号长期任务出现“遗忘”状态向量容量不足增加状态维度或引入长期记忆模块训练时 loss 不下降时间嵌入与视觉特征相加可能存在尺度不匹配对视觉特征和时间嵌入分别做 LayerNorm 后再相加模型对语言指令不敏感语言指令没有有效参与时间建模将语言指令作为全局条件注入到时间记忆模块的更新过程中5.1 显存不足的排查思路先确认输入帧的分辨率和通道数再看模型中间张量的 shape。可以打印每一层输出的 shape快速定位显存峰值出现在哪里。def print_shape_hook(module, input, output): print(f{module.__class__.__name__}: {output.shape}) model.visual_encoder.conv_net.register_forward_hook(print_shape_hook)如果峰值出现在视觉编码器部分优先降分辨率如果出现在时间记忆模块减少 batch size 或改用更小的状态维度。5.2 动作抖动的处理动作平滑是流式 VLA 落地时绕不开的问题。常见做法是一阶低通滤波import numpy as np class ActionSmoother: def __init__(self, alpha: float 0.4): self.alpha alpha self.last_action None def smooth(self, action): action np.asarray(action) if self.last_action is None: self.last_action action else: self.last_action self.alpha * action (1 - self.alpha) * self.last_action return self.last_actionalpha越大响应越快但平滑效果越差alpha越小动作越平滑但模型输出变化回馈到执行端会变慢。需要根据实际控制频率与任务要求调节。5.3 多模态时间对齐问题如果你在训练时使用了不同采样率的传感器数据不建议直接拼接特征最好先对时间戳做插值或对齐操作。比如视觉是 30Hz动作是真机采集的 10Hz那就在时间轴上对动作做线性插值或最近邻填充保证每个视觉帧都有一个对应的动作标签。6. 最佳实践与工程建议6.1 从简单任务开始不要直接上真机如果你是从零开始实现流式 VLA 模型强烈建议先在仿真环境里验证机制。仿真平台可以选择 RLBench、Libero 或 Meta 的 Habitat这些都是机器人操作领域常用的环境。先在仿真里调试时间建模、动作平滑、控制频率等稳定了再迁移到真实机器人。6.2 时间状态的设计要区分“短期”与“长期”从工程角度看一个状态向量很难同时保存精细的短期上下文和抽象的长时记忆。更合理的方案是维护两组状态短期状态保留最近 8 到 16 帧的关键特征直接用缓存实现。长期状态用一个独立的向量或一组 token通过门控机制更新。这样做的好处是短期状态保证了动作精度长期状态保证了任务连贯性。比如“拿起杯子”和“把杯子放到指定位置”之间可能相隔几十秒长期状态需要记住当前任务的总体进度短期状态则负责计算当前的夹爪位置。6.3 注意训练与推理的分布一致性流式模型在训练时如果一次性输入完整序列推理时逐帧输入就会出现训练和推理输入分布不一致的问题从而降低推理性能。建议在训练时就模拟流式输入的节奏按时间顺序逐步喂帧每步更新状态并计算每一步的动作损失。这种训练方式叫“teacher forcing”的变体虽然训练速度会慢一些但模型实际部署时会更稳定。6.4 安全边界是流式控制的重中之重VLA 模型直接输出动作如果动作超出机器人的关节限位或工作空间会造成安全事故。工程上必须加一层安全校验模块在动作送入执行器之前检查关节角度是否在限制范围内。末端速度是否超过安全阈值。是否与当前工作空间中的障碍物发生碰撞。动作预测头输出的原始动作不能直接写进机器人控制接口。标准做法是模型输出 - 安全校验 - 限幅 - 平滑 - 执行。def safe_action(raw_action, lower_limits, upper_limits): # 限幅 clipped_action np.clip(raw_action, lower_limits, upper_limits) return clipped_action6.5 日志与指标监控流式模型在线推理时需要记录每个时间步的动作输出、推理耗时、状态量变化等指标。推荐将日志写入结构化文件或数据库便于事后分析。建议记录以下指标每步推理耗时毫秒。动作增量绝对值。状态向量变化幅度。当前帧时间戳与实际系统时间戳的差值。这些指标能帮助你判断模型是否出现异常比如状态向量长期不变可能意味着模型对视觉输入不敏感推理耗时突然增加则可能是缓存命中率下降需要优化缓存策略。6.6 部署优化流式模型部署时除了 PyTorch 本身还可以考虑将视觉编码器转换为 ONNX 或 TensorRT 格式减少推理耗时。使用 CUDA Graph 减少 kernel 启动开销。在机器人控制周期中采用双缓冲一个线程负责模型推理一个线程负责动作执行降低串行延迟。这些优化在做真机部署时非常重要。模型如果推理耗时 200 毫秒而控制周期要求 50 毫秒那么无论怎么调算法都无法直接部署。优化目标是把单步推理耗时压到控制周期的一半以内留出安全余量。7. 总结与学习路线关于 StreamPI 与流式多模态时间建模这篇文章介绍了背景、核心模块、代码示例、常见问题和工程建议。可以把它当作一份“思路导读 代码脚手架”帮助你先跑通一个流式时间建模的最小闭环再结合自己的任务场景修改完善。下一步如果你想深入掌握这类方法可以按下面的路线继续学习先复习 Transformer 的位置编码、跨注意力、自回归生成机制这是理解 VLA 模型的基础。然后读一遍 VLA 领域的代表性论文重点看它们的输入输出表示、动作 token 化方式、训练数据组织方式。接着在仿真环境里自己训练一个小规模的 VLA 模型尝试在模型中加入时间状态记忆模块观察对任务成功率的影响。最后再做工程化部署加上动作平滑、安全校验、推理加速这些工程模块。如果之前没有接触过多模态模型建议不要一上来就复现大规模 VLA。先拿一个视觉编码器 一组连续帧 一个 GRU 状态模块在视频预测或简单分类任务上验证时间建模的有效性再逐步加入语言指令和动作输出。这样每一步改动都可控出现问题也容易定位。文章到这里把 StreamPI 从概念到实现思路拆了一遍。如果你正在做 VLA 相关的研究或开发希望这份整理能帮你减少一些走弯路的时间。动手跑一下那个最小示例把流式建模的过程跑通相信你对时间建模的理解会更扎实。
返回列表