gemma-e2b-rlcd / tests /test_vision.py
larkooo's picture
Publish Gemma E2B RLCD with multimodal checkpoint and parallel scoring
53e24ca verified
Raw History Blame Contribute Delete
1.18 kB
import pytest
mx = pytest.importorskip("mlx.core")
vision = pytest.importorskip("gemma_rlcd.vision")
config_module = pytest.importorskip("mlx_vlm.models.gemma4.config")
@pytest.mark.parametrize("dtype", [mx.float16, mx.float32, mx.bfloat16])
def test_indexed_positions_match_dense_lookup_including_padding(dtype):
config = config_module.VisionConfig(hidden_size=8, position_embedding_size=16)
original = vision.VisionPatchEmbedder(config)
original.position_embedding_table = mx.random.normal((2, 16, 8)).astype(dtype)
indexed = vision.IndexedVisionPatchEmbedder(original)
positions = mx.array([[[2, 3], [0, 0], [-1, -1], [16, 2], [4, 5]]])
padding = mx.array([[False, False, True, False, True]])
expected = original._position_embeddings(positions, padding)
actual = indexed._position_embeddings(positions, padding)
# The M5 dense float32 matmul can round table entries internally; gather
# returns their stored values directly. Half/bfloat paths match exactly.
if dtype == mx.float32:
assert bool(mx.allclose(actual, expected, atol=2e-3, rtol=2e-3).item())
else:
assert bool(mx.array_equal(actual, expected).item())