LeRobot documentation

Long-WAM

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.7.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Long-WAM

Artículo · Proyecto y demostraciones · Código

Long-WAM es un modelo de mundo-acción de contexto largo: utiliza una instrucción en lenguaje, el estado del robot y el historial visual para predecir la dinámica futura y generar acciones.

Resumen del modelo

  • Aprenda a usar el historial. El preentrenamiento de video autoregresivo de LongLive2.0-Robot aprende las dependencias de historial a futuro antes de la adaptación a acciones de robot.
  • Predice y luego actúa. IDM condiciona la generación de acciones en el historial observado y en los latentes futuros predichos, sin decodificar imágenes RGB futuras.
  • Escala el contexto temporal. Ventanas de observación más largas capturan el movimiento y el progreso de la tarea; la longitud del historial es independiente del horizonte de acción.

LeRobot admite tanto IDM como la codenoización conjunta de video/acción (COD), con carga nativa de puntos de control, ajuste fino e inferencia síncrona de bloques de acciones. Los modelos base de Wan provienen de Diffusers y el codificador de texto UMT5 de Transformers.

Resultados

Resultados de lerobot-eval reportados para los puntos de control nativos de LeRobot publicados de IDM y COD:

SuiteTasa de éxito de IDMTasa de éxito de CODEpisodios por modelo
libero_spatial99.4%98.6%500
libero_object99.8%99.6%500
libero_goal97.8%98.2%500
libero_1099.0%97.4%500
Promedio99.00%98.45%2000

Consulte Evaluation para ver comandos de ejemplo y límites de episodios. Los comandos se probaron en NVIDIA GB200 con BF16 e inferencia síncrona.

Instalación

Desde un checkout de la fuente de LeRobot:

pip install -e ".[longwam]"

Puntos de control

Los puntos de control nativos de LeRobot incluyen los pesos completos del modelo y los pre/post-procesadores guardados. El tokenizador se carga desde google/umt5-xxl.

ModoInferenciaCheckpoint
IDMImagina el video futuro y luego desruidifica las accionesLIBERO IDM
CODDesruidar video y acciones de forma conjuntaCÓDIGO ABIERTO

Ambos utilizan un historial P48 (2,4 s a 20 Hz), dos vistas de cámara de 224×224, acciones de 7-D y un estado de robot de 8-D. Utilice el checkpoint que corresponda al modo de desruido deseado; los paquetes originales de model.pt de Long-WAM no se pueden cargar directamente.

Requisitos de datos

Use un conjunto de datos de LeRobot con cámaras RGB, observation.state, action e instrucciones de la tarea. Las claves de cámara de LIBERO publicadas son observation.images.image y observation.images.image2, en ese orden. Proporcione tensores RGB en [0, 1]; el procesador redimensiona y recorta al centro cada vista, y la política concatena las vistas horizontalmente. Mantenga el orden de las cámaras y las convenciones de acción/estado alineadas con el punto de control.

Inferencia

from lerobot.policies import make_pre_post_processors
from lerobot.policies.longwam.modeling_longwam import LongWAMPolicy

checkpoint = "Efficient-Large-Model/Long-WAM-LIBERO-IDM-LeRobot"
policy = LongWAMPolicy.from_pretrained(checkpoint).to("cuda").eval()
preprocess, postprocess = make_pre_post_processors(
    policy.config,
    pretrained_path=checkpoint,
    preprocessor_overrides={"device_processor": {"device": "cuda"}},
)
policy.reset()
# observation contains both current camera images, observation.state, and task.
# Repeat on every control tick, including ticks that consume queued actions.
action = postprocess(policy.select_action(preprocess(observation)))

Llama a select_action en cada tick de control, incluso mientras se ejecuta un chunk de acciones, para que el historial se mantenga actualizado. predict_action_chunk devuelve [batch, prediction_steps, action_dim]; cada llamada registra el cuadro actual proporcionado. reset() y drop_queued_actions() limpian tanto el historial como las acciones en cola. El asincrónico/RTC genérico aún no se ha validado en esta integración.

Por defecto, inference_seed=1 reinicia los generadores de ruido de video/acción separados con la misma semilla para cada fragmento, preservando el comportamiento de inferencia publicado. Establezca inference_seed=None en Python (--policy.inference_seed=null en la CLI) para usar el RNG global en avance en su lugar; reset() no vuelve a sembrar ese flujo. El entrenamiento siempre muestrea ruido nuevo.

Evaluación

Instale el extra de benchmark y evalúe un checkpoint nativo:

pip install -e ".[longwam,libero]"

lerobot-eval --policy.path=Efficient-Large-Model/Long-WAM-LIBERO-IDM-LeRobot \
  --policy.device=cuda --policy.dtype=bfloat16 \
  --env.type=libero --env.task=libero_spatial \
  --env.observation_height=256 --env.observation_width=256 \
  --env.episode_length=300 \
  --eval.batch_size=1 --eval.n_episodes=50 --seed=1

Use libero_object o libero_goal para las otras suites cortas. Para LIBERO-Long, establezca --env.task=libero_10 --env.episode_length=600. Reemplace IDM por COD en la ruta del checkpoint para evaluar el co-denoising.

Historia y segmentación de acciones

ParámetroSignificadoValor de LIBERO publicado
past_obs_stepsTicks de control anteriores conservados48
video_strideControla los ticks entre los fotogramas de video muestreados4
future_video_stepsHorizonte de supervisión de video futuro32
action_horizonLongitud de los trozos de acciones de entrenamiento32
inference_action_horizonLongitud del trozo de acciones predicho80
n_action_stepsAcciones ejecutadas antes de una nueva predicción10

La duración del historial es past_obs_steps / control_frequency. El historial inicial se rellena con la primera observación. Utilice un punto de control entrenado para el historial previsto; cambiar la ventana en la inferencia no es un entrenamiento de escalado de contexto.

Ajuste fino

lerobot-train --policy.path=Efficient-Large-Model/Long-WAM-LIBERO-IDM-LeRobot \
  --policy.device=cuda --policy.dtype=bfloat16 \
  --accelerator.mixed_precision=bf16 \
  --dataset.repo_id=YOUR_ORG/YOUR_DATASET \
  --output_dir=outputs/longwam --batch_size=1 --steps=30000 \
  --policy.push_to_hub=false

--policy.dtype selecciona el almacenamiento de parámetros antes de la carga; los gradientes y momentos nativos de AdamW utilizan ese dtype. --accelerator.mixed_precision controla el autocast, no los pesos maestros en FP32. El ejemplo utiliza BF16 para ambos, coincidiendo con el dtype original de los parámetros. Para parámetros/gradientes/momentos en FP32 con autocast en BF16, use --policy.dtype=float32 --accelerator.mixed_precision=bf16; el VAE congelado y el codificador de texto también utilizan FP32, lo que aumenta la memoria. Elija esto antes de la carga: convertir pesos cargados en BF16 a FP32 no puede recuperar la precisión perdida.

El postprocesador de la pinza publicado convierte la última dimensión de la acción de [0, 1] a comandos con signo. Utilice --policy.toggle_action_dimensions=[] si sus datos de ajuste fino ya utilizan la convención de apertura/cierre con signo del entorno. La configuración activa también se aplica a los procesadores guardados; las postprocessor_overrides explícitas tienen prioridad. Las estadísticas de normalización guardadas se conservan a menos que se sobrescriban, por lo que alínelas con sus datos de ajuste fino.

El entrenamiento supervisa los fragmentos futuros de video y acción; la inferencia solo recibe observaciones pasadas/actuales. Ajuste --batch_size a la memoria de la GPU y mantenga el orden de las cámaras del checkpoint, las definiciones de acción/estado y el modo de desruido.

Cita

@misc{huang2026longwamscalingcontextworldaction,
  title={Long-WAM: Scaling the Context of World-Action Models},
  author={Wei Huang and Bohan Zhang and Chenzhi Liu and Isabella Liu and
          Shuai Yang and Weian Mao and Luozhou Wang and Yicheng Xiao and
          Weifeng Lin and Qixin Hu and Bryan Chu and Sifei Liu and
          Linxi Fan and Xiaojuan Qi and Song Han and Yukang Chen},
  year={2026},
  eprint={2610.10528},
  archivePrefix={arXiv},
  primaryClass={cs.RO},
  url={https://arxiv.org/abs/2610.10528},
}
Update on GitHub