NexusCoder / tests /test_model.py
AdminReal's picture
Import NexusCoder from github.com/mhieuhonda/NexusCoder
eca5751 verified
Raw
History Blame Contribute Delete
3.25 kB
"""Tests for Nexus Coder model."""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import pytest
import torch
from nexus.config import NexusConfig
from nexus.model.nexus_coder import NexusCoderForCausalLM
from nexus.tokenizer.tokenizer import NexusTokenizer
from nexus.training.dataset import NexusDataset, AUTHOR_TRAINING_DATA
@pytest.fixture
def tiny_config():
return NexusConfig(
vocab_size=500,
hidden_size=64,
num_hidden_layers=2,
num_attention_heads=4,
num_kv_heads=2,
head_dim=16,
intermediate_size=128,
num_experts=4,
num_active_experts=2,
max_position_embeddings=128,
)
@pytest.fixture
def tiny_model(tiny_config):
return NexusCoderForCausalLM(tiny_config)
def test_config_default():
"""Test default config."""
config = NexusConfig()
assert config.hidden_size == 2048
assert config.num_hidden_layers == 12
assert config.num_experts == 24
assert config.num_active_experts == 3
assert config.max_position_embeddings == 50000
def test_param_count():
"""Test parameter count is ~10B / 1.5B."""
config = NexusConfig()
stats = config.estimated_total_params()
assert 9.5e9 < stats["total_params"] < 11e9
assert 1.3e9 < stats["active_params"] < 1.7e9
def test_model_forward(tiny_model):
"""Test model forward pass."""
input_ids = torch.randint(0, 500, (2, 16))
outputs = tiny_model(input_ids=input_ids)
assert outputs["logits"].shape == (2, 16, 500)
def test_model_training(tiny_model):
"""Test model with labels (training)."""
input_ids = torch.randint(0, 500, (2, 16))
labels = input_ids.clone()
outputs = tiny_model(input_ids=input_ids, labels=labels)
assert outputs["loss"] is not None
assert outputs["loss"].item() > 0
def test_generate(tiny_model):
"""Test generation."""
input_ids = torch.randint(0, 500, (1, 4))
generated = tiny_model.generate(
input_ids=input_ids,
max_new_tokens=5,
do_sample=False,
)
assert generated.shape[0] == 1
assert generated.shape[1] >= 4
def test_tokenizer():
"""Test tokenizer basic."""
tokenizer = NexusTokenizer(vocab_size=1000)
corpus = ["hello world nexus coder hieu louis"]
tokenizer.train(corpus)
ids = tokenizer.encode("hello nexus")
assert len(ids) > 0
decoded = tokenizer.decode(ids)
assert "hello" in decoded.lower() or "nexus" in decoded.lower()
def test_dataset():
"""Test dataset."""
assert len(AUTHOR_TRAINING_DATA) > 0
# Check author info is present
info_texts = " ".join([
f"{d['system']} {d['user']} {d['assistant']}" for d in AUTHOR_TRAINING_DATA
])
assert "Hieu Louis" in info_texts
assert "2026" in info_texts
def test_author_info_hardcoded():
"""Test that author info is hardcoded in dataset."""
from nexus.training.dataset import get_author_info
info = get_author_info()
assert info["name"] == "Hieu Louis"
assert info["github"] == "mhieuhonda"
assert info["year"] == "2026"
assert info["model_name"] == "Nexus Coder"
if __name__ == "__main__":
pytest.main([__file__, "-v"])