Files
VLA/tests/test_turtle2_inference_input.py
T
2026-09-23 21:04:17 +08:00

48 lines
2.1 KiB
Python

"""Checkpoint-specific multimodal prompt contract, without loading model weights."""
import logging
import os
from pathlib import Path
from types import SimpleNamespace
import numpy as np
import pytest
from wall_x._vendor.harrix.serving._wallx_infer.infer_config import InferConfig
from wall_x._vendor.harrix.serving._wallx_infer.model_wrapper import WallxModelWrapper
from wall_x.trainer.trainer_utils import load_wallx_processors
def test_three_square_cameras_preserve_all_image_tokens():
"""Truncating an image placeholder must never reach the VLA as valid input."""
if "WALLX_TEST_CHECKPOINT" not in os.environ:
pytest.skip("set WALLX_TEST_CHECKPOINT to run checkpoint-specific input tests")
checkpoint = Path(os.environ["WALLX_TEST_CHECKPOINT"])
config = InferConfig(
checkpoint_path=str(checkpoint),
train_config_path=str(checkpoint / "config.yml"),
model_device="cpu", action_horizon=32,
)
processor = load_wallx_processors(config.train_config, device="cpu")["processor"]
wrapper = WallxModelWrapper.__new__(WallxModelWrapper)
wrapper.config = config
wrapper.model = SimpleNamespace(processor=processor)
wrapper.cam_names = config.cam_names
wrapper.norm_key = "pick_paper_lerobot_v21_3cam"
wrapper.logger = logging.getLogger(__name__)
wrapper.role_start_symbol = "<|im_start|>"
wrapper.role_end_symbol = "<|im_end|>"
wrapper.vision_start_symbol = "<|vision_start|>"
wrapper.vision_end_symbol = "<|vision_end|>"
wrapper.image_pad_symbol = "<|image_pad|>"
wrapper.propri_symbol = "<|propri|>"
wrapper.action_symbol = "<|action|>"
prefix, postfix = wrapper.get_text_for_action("pick up the paper towel")
image = np.full((448, 448, 3), 127, dtype=np.uint8)
observation = [{name: image for name in wrapper.cam_names}]
inputs = wrapper.construct_model_input(observation, prefix, postfix)
merge = processor.image_processor.merge_size ** 2
expected = int((inputs["image_grid_thw"].prod(dim=1) // merge).sum())
actual = int((inputs["input_ids"] == processor.tokenizer.convert_tokens_to_ids("<|image_pad|>")).sum())
assert actual == expected == 768