# LeRobot GR00T图像预处理Tensor转NumPy致训练推理效率低

> 原文链接：https://robotics.hellobike.com/pitfalls/2026-10-27-lerobot-3000
> 频道：pitfalls | 更新日期：2026-10-27 | 标签：auto, github-issue, lerobot
> 核心摘要：GR00T处理器中冗余的Tensor-Numpy转换导致CPU瓶颈，通过保持数据在GPU上处理可显著降低延迟并消除设备间拷贝。

# LeRobot GR00T图像预处理Tensor转NumPy致训练推理效率低

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[What's the reason of having tensor -&gt; numpy -&gt; tensor conversion in GR00T processor?](https://github.com/huggingface/lerobot/issues/3000)（GitHub huggingface/lerobot #3000）

**状态**：有绕过办法

## 问题

LeRobot GR00T策略的 `_to_uint8_np_bhwc` 函数强制将CUDA上的图像Tensor经 `.cpu().numpy()` 转至CPU进行堆叠与permute操作后再拷回GPU。Profiling显示CPU端排列组合是主要耗时瓶颈而非PCIe传输，导致2相机480×640 Batch=1时预处理p50延迟达6.02ms，Batch=8时达27.7ms，严重影响同步/RTC推理路径效率。

## 环境

LeRobot main分支 (commit 45cca1a6)，NVIDIA RTX 5090，CUDA环境，GR00T策略处理器，2-3个相机输入（480×640），Batch Size 1-8。

## 解决办法

1. 修改预处理逻辑，将packed uint8视频Tensor移至目标设备后再执行 `permute(...).contiguous()` 操作，避免CPU端计算瓶颈。
2. 当相机Tensor已在同一设备且形状兼容时，直接在GPU上进行堆叠与重排，消除GPU→CPU→GPU的冗余数据往返拷贝。
3. 接受约21%的峰值显存增长作为优化代价（B=8/T=8/3相机配置下增加约169MB），以换取Batch=1延迟降至3.10ms、Batch=8降至5.6ms的性能提升。
4. 使用 `torch.equal` 验证优化后 `pixel_values`、`input_ids`、`attention_mask`、`image_grid_thw` 及 `mm_token_type_ids` 输出与原版逐位一致，确保uint8/fp16/fp32输入及不同相机数/时序长度下的数值正确性。

讨论原作者：@arxrean 等，版权归原作者所有。
:::

## 原始参考来源 (Sources)

- [GitHub huggingface/lerobot #3000：What's the reason of having tensor -> numpy -> tensor conversion in GR00T processor?](https://github.com/huggingface/lerobot/issues/3000)