| """Smoke tests for the MLX benchmark adapters and bench functions.""" |
| from __future__ import annotations |
|
|
| import pytest |
|
|
| pytest.importorskip("mlx.core", reason="MLX not available") |
|
|
| import mlx.core as mx |
|
|
| from sgjm.bench.mlx_bench import ( |
| BenchResult, |
| MLXBackboneAdapter, |
| MLXDrafterAdapter, |
| MLXJudgeAdapter, |
| run_ar_bench, |
| run_sgjm_bench, |
| ) |
| from sgjm.training.config import TrainingConfig |
| from sgjm.training.mlx_backend.model import SGJM |
|
|
|
|
| def _smoke_model() -> tuple[SGJM, TrainingConfig]: |
| cfg = TrainingConfig.smoke() |
| model = SGJM(cfg.model) |
| mx.eval(model.parameters()) |
| return model, cfg |
|
|
|
|
| def test_backbone_adapter_encode_returns_valid_state(): |
| model, cfg = _smoke_model() |
| adapter = MLXBackboneAdapter(model) |
| state = adapter.encode([10, 20, 30]) |
| assert state.tokens == (10, 20, 30) |
| assert len(state.latent) == cfg.model.d_model |
| assert all(isinstance(v, float) for v in state.latent) |
|
|
|
|
| def test_backbone_adapter_step_appends_token(): |
| model, cfg = _smoke_model() |
| adapter = MLXBackboneAdapter(model) |
| state = adapter.encode([1, 2]) |
| stepped = adapter.step(state, 99) |
| assert stepped.tokens == (1, 2, 99) |
| assert len(stepped.latent) == cfg.model.d_model |
|
|
|
|
| def test_drafter_adapter_returns_k_samples(): |
| model, cfg = _smoke_model() |
| backbone = MLXBackboneAdapter(model) |
| drafter = MLXDrafterAdapter(model, seed=7) |
| state = backbone.encode([5, 6, 7, 8]) |
| samples = drafter.draft(state, k=3, block=cfg.model.block_size) |
| assert len(samples) == 3 |
| for s in samples: |
| assert len(s.tokens) == cfg.model.block_size |
| assert len(s.latent) == cfg.model.d_model |
| assert isinstance(s.log_prob, float) |
|
|
|
|
| def test_judge_adapter_returns_scalar(): |
| model, cfg = _smoke_model() |
| judge = MLXJudgeAdapter(model) |
| D = cfg.model.d_model |
| parent = [0.1] * D |
| child = [0.2] * D |
| score = judge.score(parent, child) |
| assert isinstance(score, float) |
|
|
|
|
| def test_run_sgjm_bench_smoke(): |
| model, cfg = _smoke_model() |
| prompt = list(range(16)) |
| result = run_sgjm_bench(model, cfg.model, prompt, n_steps=2) |
| assert isinstance(result, BenchResult) |
| assert result.steps_completed >= 1 |
| assert 0.0 <= result.acceptance_rate <= 1.0 |
| assert result.elapsed_sec > 0.0 |
|
|
|
|
| def test_run_ar_bench_smoke(): |
| model, _ = _smoke_model() |
| prompt = list(range(8)) |
| result = run_ar_bench(model, prompt, n_steps=2) |
| assert result.tokens_generated == 2 |
| assert result.steps_completed == 2 |
| assert result.elapsed_sec > 0.0 |
| assert result.tokens_per_sec > 0.0 |
|
|