From 7dd570067bc1773cfba2a4b06cbe25ec1412bb59 Mon Sep 17 00:00:00 2001 From: Khai Date: Wed, 29 Jul 2026 01:52:13 +0100 Subject: [PATCH] feat(model): implement LLaMA-style Rotary Positional Embeddings with configurable scaling Co-authored-by: Cursor --- CHANGELOG.md | 13 ++ EXPERIMENTS.md | 18 ++ PAPERS.md | 11 +- README.md | 29 ++- ROADMAP.md | 9 +- assets/rope/cos_sin_curves.png | Bin 0 -> 189099 bytes assets/rope/inv_freq.png | Bin 0 -> 35024 bytes assets/rope/rotation_demo.png | Bin 0 -> 34965 bytes configs/default.yaml | 12 +- configs/model.yaml | 30 +++ docs/architecture/README.md | 2 +- docs/architecture/rope.md | 64 +++++++ docs/architecture/rope_math.md | 29 +++ docs/architecture/rope_visualization.md | 17 ++ experiments/ODY-0004/README.md | 40 ++++ experiments/ODY-0004/config.yaml | 11 ++ experiments/ODY-0004/metrics.json | 17 ++ experiments/ODY-0004/rope_validation.json | 38 ++++ math/README.md | 2 +- math/rope.md | 52 ++---- model/__init__.py | 18 +- model/config.py | 179 +++++++++++++++++- model/rope.py | 145 +++++++++++++++ model/rope_cache.py | 163 ++++++++++++++++ model/rope_math.py | 102 ++++++++++ model/rope_visualizer.py | 118 ++++++++++++ odyssey/__init__.py | 5 +- papers/attention_position.md | 38 ++++ papers/llama_rope.md | 38 ++++ papers/roformer.md | 50 +++++ pyproject.toml | 2 +- scripts/benchmark_rope.py | 92 +++++++++ scripts/validate_rope.py | 215 ++++++++++++++++++++++ tests/test_cache.py | 40 ++++ tests/test_phase0.py | 9 +- tests/test_rope.py | 68 +++++++ tests/test_rope_shapes.py | 32 ++++ tests/test_rotation.py | 52 ++++++ tests/test_scaling.py | 55 ++++++ 39 files changed, 1754 insertions(+), 61 deletions(-) create mode 100644 assets/rope/cos_sin_curves.png create mode 100644 assets/rope/inv_freq.png create mode 100644 assets/rope/rotation_demo.png create mode 100644 configs/model.yaml create mode 100644 docs/architecture/rope.md create mode 100644 docs/architecture/rope_math.md create mode 100644 docs/architecture/rope_visualization.md create mode 100644 experiments/ODY-0004/README.md create mode 100644 experiments/ODY-0004/config.yaml create mode 100644 experiments/ODY-0004/metrics.json create mode 100644 experiments/ODY-0004/rope_validation.json create mode 100644 model/rope.py create mode 100644 model/rope_cache.py create mode 100644 model/rope_math.py create mode 100644 model/rope_visualizer.py create mode 100644 papers/attention_position.md create mode 100644 papers/llama_rope.md create mode 100644 papers/roformer.md create mode 100644 scripts/benchmark_rope.py create mode 100644 scripts/validate_rope.py create mode 100644 tests/test_cache.py create mode 100644 tests/test_rope.py create mode 100644 tests/test_rope_shapes.py create mode 100644 tests/test_rotation.py create mode 100644 tests/test_scaling.py diff --git a/CHANGELOG.md b/CHANGELOG.md index c8ef9e9..559cb84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,19 @@ and this project aims to adhere to [Semantic Versioning](https://semver.org/). --- +## [0.4.0] — 2026-07-29 + +### Added + +- LLaMA-style RoPE (`model.OdysseyRoPE`, cache, math, visualizer) +- `configs/model.yaml` with rope hyperparameters +- Cross-implementation validator `scripts/validate_rope.py` (vs Phalanx) +- Benchmarks + assets under `assets/rope/` +- Papers: RoFormer, attention positional encodings, LLaMA RoPE +- Experiment `ODY-0004` (validation PASS, max abs error ~4.8e-7) + +--- + ## [0.3.0] — 2026-07-28 ### Added diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index 3ca2f8a..2fcdcc9 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -81,3 +81,21 @@ Details: [experiments/ODY-0002/README.md](experiments/ODY-0002/README.md) | Lessons | Embedding is a gather not a matmul; `math/` notes should ship with each neural phase; weight tying deferred | Details: [experiments/ODY-0003/README.md](experiments/ODY-0003/README.md) + +--- + +## ODY-0004 — Rotary Positional Embeddings + +| Field | Value | +| --- | --- | +| ID | ODY-0004 | +| Date | 2026-07-29 | +| Phase | 4 | +| Purpose | LLaMA-style RoPE + Phalanx numerical parity | +| Config | `configs/model.yaml` / experiment `config.yaml` | +| theta / rotary_dim | 10000 / 128 | +| Result | **Successful** | +| Validation | Max abs error ≈ 4.8e-7 vs Phalanx (`PASS` @ 1e-6) | +| Lessons | Keep inv_freq + adjacent-pair rotate bit-identical to Runtime; validate every layer | + +Details: [experiments/ODY-0004/README.md](experiments/ODY-0004/README.md) diff --git a/PAPERS.md b/PAPERS.md index 091ceee..4e61c70 100644 --- a/PAPERS.md +++ b/PAPERS.md @@ -39,12 +39,21 @@ Math companion: [math/embeddings.md](math/embeddings.md) --- +## Phase 4 — RoPE *(complete)* + +| Paper / Study | Summary | +| --- | --- | +| RoFormer (Su et al.) | [papers/roformer.md](papers/roformer.md) | +| Transformer positional encodings | [papers/attention_position.md](papers/attention_position.md) | +| LLaMA RoPE notes | [papers/llama_rope.md](papers/llama_rope.md) | + +--- + ## Planned Reading (later phases) | Topic | Canonical paper / resource | Phase | | --- | --- | --- | | Attention | *Attention Is All You Need* (Vaswani et al., 2017) | 6+ | -| RoPE | *RoFormer* (Su et al.) | 4 | | RMSNorm | *Root Mean Square Layer Normalization* | 5 | | SwiGLU | *GLU Variants Improve Transformer* (Shazeer) | 7 | | GPT-style LMs | GPT / Llama technical reports | 9–10 | diff --git a/README.md b/README.md index 9eeae9e..99e4ff7 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ --- -**Status:** Research Project — Phase 3 complete · **Spec v1.0.0** frozen +**Status:** Research Project — Phase 4 complete · **Spec v1.0.0** frozen **Language:** Python 3.12+ **Framework:** PyTorch **Target Runtime:** [Phalanx Runtime](https://github.com/404khai/phalanx) @@ -34,6 +34,7 @@ Odyssey is a research repository for building a small, carefully engineered deco | 1 | SentencePiece **reference** tokenizer | | 2 | **Owned** byte-level BPE library (`odyssey_tokenizer`) | | 3 | **Token embedding layer** (`OdysseyEmbedding`) | +| 4 | **RoPE** (`OdysseyRoPE`) + Phalanx numerical validation | ```mermaid flowchart TD @@ -42,12 +43,32 @@ flowchart TD TokenIDs --> EmbeddingLookup[Embedding Lookup] EmbeddingMatrix[Embedding Matrix] --> EmbeddingLookup EmbeddingLookup --> Vectors[Embedding Vectors] - Vectors --> RoPE[RoPE Phase 4] + Vectors --> RoPE[RoPE] RoPE --> TransformerBlock[Transformer Block] ``` --- +## Rotary Positional Embeddings (Phase 4) + +```python +from model import OdysseyRoPE, load_rope_config + +rope = OdysseyRoPE(load_rope_config()) +q_rot, k_rot = rope.apply_rotary(q, k, position_offset=0) +``` + +Cross-check against Phalanx Runtime (must PASS): + +```bash +python scripts/validate_rope.py +# Max Error ~5e-7 → PASS +``` + +Docs: [`docs/architecture/rope.md`](docs/architecture/rope.md) · Spec: [`spec/rope.md`](spec/rope.md) + +--- + ## Embedding Layer (Phase 3) ```python @@ -180,7 +201,8 @@ MYPYPATH=tokenizer mypy --explicit-package-bases -p odyssey_tokenizer | 1 | SentencePiece reference | **Complete** | | 2 | Odyssey BPE library | **Complete** | | 3 | Embedding layer | **Complete** | -| 4–20 | RoPE → Odyssey v1 | Planned | +| 4 | RoPE (+ Phalanx validation) | **Complete** | +| 5–20 | RMSNorm → Odyssey v1 | Planned | --- @@ -192,6 +214,7 @@ MYPYPATH=tokenizer mypy --explicit-package-bases -p odyssey_tokenizer | ODY-0001 | SentencePiece baseline | Successful | | ODY-0002 | Odyssey BPE tokenizer | Successful | | ODY-0003 | Token embedding layer | Successful | +| ODY-0004 | RoPE + Phalanx parity | Successful | --- diff --git a/ROADMAP.md b/ROADMAP.md index 699c68f..b4bb553 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -42,11 +42,12 @@ Development proceeds **one phase at a time**. Complete, document, commit, then w --- -## Phase 4 — Rotary Positional Embeddings +## Phase 4 — Rotary Positional Embeddings *(complete)* -- RoPE implementation -- Visualization -- Tests +- LLaMA-style RoPE (`OdysseyRoPE`) +- Cos/sin cache, partial rotary dims, linear scaling +- Cross-implementation validation vs Phalanx (`scripts/validate_rope.py`) +- ODY-0004 baseline --- diff --git a/assets/rope/cos_sin_curves.png b/assets/rope/cos_sin_curves.png new file mode 100644 index 0000000000000000000000000000000000000000..dc95f612b4fc4d7057df8a05bb8b9fc0862730b2 GIT binary patch literal 189099 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 z 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%0A~)v97O^%9w53Pribxa7_Jz}Y}^780f4eu_Wd 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 literal 0 HcmV?d00001 diff --git a/assets/rope/inv_freq.png b/assets/rope/inv_freq.png new file mode 100644 index 0000000000000000000000000000000000000000..9e8086d4e23565c4329ab456f4aa88a2ecf45a8d GIT binary patch literal 35024 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 literal 0 HcmV?d00001 diff --git a/assets/rope/rotation_demo.png b/assets/rope/rotation_demo.png new file mode 100644 index 0000000000000000000000000000000000000000..feb5f5e6027bb1f41dc3d0c753c2b80110021dc6 GIT binary patch literal 34965 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 Implementation lands in Phase 4. Equations recorded here so Phase 3 readers see what comes next. +**Status:** Implemented in Odyssey + Phalanx (cross-validated) -## Equations (preview) - -For head dimension \(d\) (even), position \(m\), and pair index \(i\): - -\[ -\theta_i = 10000^{-2i/d} -\] +## Equations \[ -\begin{pmatrix} q'_{2i} \\ q'_{2i+1} \end{pmatrix} +\omega_i = \theta^{-2i/d_r}, \quad +\begin{pmatrix} x_0' \\ x_1' \end{pmatrix} = -\begin{pmatrix} -\cos m\theta_i & -\sin m\theta_i \\ -\sin m\theta_i & \cos m\theta_i -\end{pmatrix} -\begin{pmatrix} q_{2i} \\ q_{2i+1} \end{pmatrix} +R(m'\omega_i) +\begin{pmatrix} x_0 \\ x_1 \end{pmatrix} \] -Applied to query and key vectors; values typically untouched. +Linear scaling: \(m' = m / \mathrm{factor}\). -## Why it works +## Complexity -Relative position is encoded in the **relative rotation** between positions \(m\) and \(n\), improving length extrapolation vs absolute learned position embeddings. - -## Complexity (preview) - -- Time: \(O(B S D)\) to apply rotations -- Memory: \(O(S \cdot d/2)\) for cached \(\cos/\sin\) tables (or on-the-fly) +| Resource | Cost | +| --- | --- | +| Apply | \(O(BSH d)\) | +| Cache | \(O(S_{\max} d_r)\) | -## Numerical stability +## Numerical Stability -Use float32 for angle tables when possible; watch bf16 precision at long contexts. +- Build angles in float32 +- Default validation tolerance vs Phalanx: `1e-6` -## PyTorch vs Phalanx +## PyTorch -| Path | Status | -| --- | --- | -| Odyssey `model/` RoPE module | Phase 4 | -| Phalanx `layers::rope` | Already prototyping in runtime | +`OdysseyRoPE` / `rope_cache.RopeCacheManager` -## References +## Phalanx Runtime -- Su et al., *RoFormer* (RoPE) +`layers::Rope` — identical adjacent-pair kernel; validated via `scripts/validate_rope.py`. diff --git a/model/__init__.py b/model/__init__.py index 51c187a..eb9c029 100644 --- a/model/__init__.py +++ b/model/__init__.py @@ -1,18 +1,30 @@ """Model package — decoder-only transformer components. -Phase 3 delivers the token embedding layer. Later phases add RoPE, RMSNorm, -attention, SwiGLU, and the full decoder stack. +Phase 3: embeddings. Phase 4: LLaMA-style RoPE (Phalanx-parity). """ -from model.config import EmbeddingConfig, load_embedding_config +from model.config import ( + EmbeddingConfig, + ModelConfig, + RopeConfig, + load_embedding_config, + load_model_config, + load_rope_config, +) from model.embeddings import EmbeddingInspection, OdysseyEmbedding from model.initialization import describe_strategy, initialize_embedding +from model.rope import OdysseyRoPE __all__ = [ "EmbeddingConfig", "EmbeddingInspection", + "ModelConfig", "OdysseyEmbedding", + "OdysseyRoPE", + "RopeConfig", "describe_strategy", "initialize_embedding", "load_embedding_config", + "load_model_config", + "load_rope_config", ] diff --git a/model/config.py b/model/config.py index 014ffff..61d5218 100644 --- a/model/config.py +++ b/model/config.py @@ -1,14 +1,14 @@ -"""Configuration for Odyssey token embeddings. +"""Configuration for Odyssey model components (embeddings + RoPE). Why this exists: - Embedding hyperparameters (vocab size, hidden size, init, device, dtype) - must stay out of scattered script constants so experiments are reproducible - and Phalanx Runtime can mirror the same shapes later. + Embedding and RoPE hyperparameters must stay out of scattered script + constants so experiments are reproducible and Phalanx Runtime can mirror + the same shapes / θ / scaling. """ from __future__ import annotations -from dataclasses import asdict, dataclass +from dataclasses import asdict, dataclass, field from pathlib import Path from typing import Any, Literal @@ -18,6 +18,7 @@ from odyssey.config import REPO_ROOT DEFAULT_EMBEDDING_CONFIG_PATH = REPO_ROOT / "configs" / "embedding.yaml" +DEFAULT_MODEL_CONFIG_PATH = REPO_ROOT / "configs" / "model.yaml" InitStrategy = Literal[ "normal", @@ -35,6 +36,8 @@ "kaiming_normal", ) +RopeScalingType = Literal["none", "linear"] + DTYPE_MAP: dict[str, torch.dtype] = { "float32": torch.float32, "float16": torch.float16, @@ -87,11 +90,9 @@ def torch_device(self) -> torch.device: @property def parameter_count(self) -> int: - """Number of embedding parameters (vocab × hidden).""" return self.vocab_size * self.hidden_size def memory_bytes(self, dtype: torch.dtype | None = None) -> int: - """Bytes for the embedding matrix at the given (or config) dtype.""" resolved = dtype if dtype is not None else self.torch_dtype return self.parameter_count * resolved.itemsize @@ -114,6 +115,147 @@ def from_dict(cls, data: dict[str, Any]) -> EmbeddingConfig: ) +@dataclass(slots=True) +class RopeConfig: + """RoPE hyperparameters — must match Phalanx ``RopeConfig`` semantics.""" + + theta: float = 10000.0 + head_dim: int = 64 + rotary_dim: int = 64 + max_position_embeddings: int = 2048 + scaling: RopeScalingType = "none" + scaling_factor: float = 1.0 + device: str = "cpu" + dtype: str = "float32" + + def __post_init__(self) -> None: + if not (self.theta > 0): + raise ValueError("theta must be > 0") + if self.head_dim < 1: + raise ValueError("head_dim must be >= 1") + if self.rotary_dim < 2 or self.rotary_dim % 2 != 0: + raise ValueError("rotary_dim must be even and >= 2") + if self.rotary_dim > self.head_dim: + raise ValueError( + f"rotary_dim ({self.rotary_dim}) exceeds head_dim ({self.head_dim})" + ) + if self.max_position_embeddings < 1: + raise ValueError("max_position_embeddings must be >= 1") + if self.scaling not in ("none", "linear"): + raise ValueError( + f"scaling must be 'none' or 'linear' (NTK/YaRN deferred), got {self.scaling!r}" + ) + if self.scaling_factor <= 0: + raise ValueError("scaling_factor must be > 0") + if self.dtype not in DTYPE_MAP: + raise ValueError(f"dtype must be one of {tuple(DTYPE_MAP)}") + + @property + def torch_dtype(self) -> torch.dtype: + return DTYPE_MAP[self.dtype] + + @property + def torch_device(self) -> torch.device: + return torch.device(self.device) + + @property + def effective_scale(self) -> float: + return self.scaling_factor if self.scaling == "linear" else 1.0 + + def to_dict(self) -> dict[str, Any]: + return asdict(self) + + @classmethod + def from_dict(cls, data: dict[str, Any]) -> RopeConfig: + scaling = str(data.get("scaling", "none")).lower() + if scaling in ("", "null", "none"): + scaling = "none" + head_dim = int(data.get("head_dim", 64)) + return cls( + theta=float(data.get("theta", data.get("freq_base", 10000.0))), + head_dim=head_dim, + rotary_dim=int( + data.get("rotary_dim", data.get("dimension_count", head_dim)) + ), + max_position_embeddings=int( + data.get( + "max_position_embeddings", + data.get("max_position", data.get("context_length", 2048)), + ) + ), + scaling=scaling, # type: ignore[arg-type] + scaling_factor=float(data.get("scaling_factor", data.get("factor", 1.0))), + device=str(data.get("device", "cpu")), + dtype=str(data.get("dtype", "float32")), + ) + + +@dataclass(slots=True) +class ModelConfig: + """Top-level model hyperparameters used by configs/model.yaml.""" + + name: str = "odyssey-tiny" + vocab_size: int = 32000 + hidden_size: int = 768 + intermediate_size: int = 2048 + num_layers: int = 12 + num_heads: int = 12 + num_kv_heads: int = 12 + context_length: int = 2048 + embedding: EmbeddingConfig = field(default_factory=EmbeddingConfig) + rope: RopeConfig = field(default_factory=RopeConfig) + + def __post_init__(self) -> None: + if self.hidden_size % self.num_heads != 0: + raise ValueError("hidden_size must be divisible by num_heads") + if self.num_heads % self.num_kv_heads != 0: + raise ValueError("num_heads must be divisible by num_kv_heads") + + @property + def head_dim(self) -> int: + return self.hidden_size // self.num_heads + + def to_dict(self) -> dict[str, Any]: + return { + "name": self.name, + "vocab_size": self.vocab_size, + "hidden_size": self.hidden_size, + "intermediate_size": self.intermediate_size, + "num_layers": self.num_layers, + "num_heads": self.num_heads, + "num_kv_heads": self.num_kv_heads, + "context_length": self.context_length, + "embedding": self.embedding.to_dict(), + "rope": self.rope.to_dict(), + } + + @classmethod + def from_dict(cls, data: dict[str, Any]) -> ModelConfig: + emb_raw = data.get("embedding", {}) or {} + rope_raw = dict(data.get("rope", {}) or {}) + hidden = int(data.get("hidden_size", 768)) + heads = int(data.get("num_heads", 12)) + head_dim = hidden // heads + rope_raw.setdefault("head_dim", head_dim) + rope_raw.setdefault("rotary_dim", rope_raw.get("rotary_dim", head_dim)) + rope_raw.setdefault( + "max_position_embeddings", + int(data.get("context_length", 2048)), + ) + return cls( + name=str(data.get("name", "odyssey-tiny")), + vocab_size=int(data.get("vocab_size", data.get("vocabulary_size", 32000))), + hidden_size=hidden, + intermediate_size=int(data.get("intermediate_size", 2048)), + num_layers=int(data.get("num_layers", 12)), + num_heads=heads, + num_kv_heads=int(data.get("num_kv_heads", heads)), + context_length=int(data.get("context_length", 2048)), + embedding=EmbeddingConfig.from_dict(emb_raw), + rope=RopeConfig.from_dict(rope_raw), + ) + + def load_embedding_config(path: Path | str | None = None) -> EmbeddingConfig: """Load embedding configuration from YAML.""" config_path = Path(path) if path is not None else DEFAULT_EMBEDDING_CONFIG_PATH @@ -125,8 +267,29 @@ def load_embedding_config(path: Path | str | None = None) -> EmbeddingConfig: if not isinstance(raw, dict): raise ValueError("Embedding config root must be a mapping") - # Support nested `embedding:` or flat keys. section = raw.get("embedding", raw) if not isinstance(section, dict): raise ValueError("embedding section must be a mapping") return EmbeddingConfig.from_dict(section) + + +def load_model_config(path: Path | str | None = None) -> ModelConfig: + """Load model configuration (including RoPE) from YAML.""" + config_path = Path(path) if path is not None else DEFAULT_MODEL_CONFIG_PATH + if not config_path.is_file(): + raise FileNotFoundError(f"Model config not found: {config_path}") + + with config_path.open("r", encoding="utf-8") as handle: + raw = yaml.safe_load(handle) or {} + if not isinstance(raw, dict): + raise ValueError("Model config root must be a mapping") + + section = raw.get("model", raw) + if not isinstance(section, dict): + raise ValueError("model section must be a mapping") + return ModelConfig.from_dict(section) + + +def load_rope_config(path: Path | str | None = None) -> RopeConfig: + """Load RoPE config from ``configs/model.yaml``.""" + return load_model_config(path).rope diff --git a/model/rope.py b/model/rope.py new file mode 100644 index 0000000..5a9fc45 --- /dev/null +++ b/model/rope.py @@ -0,0 +1,145 @@ +"""LLaMA-style Rotary Positional Embeddings for Odyssey. + +Canonical training-side RoPE. Must stay numerically identical to +``phalanx::layers::Rope`` (see ``scripts/validate_rope.py``). +""" + +from __future__ import annotations + +from typing import Any + +import torch +from torch import nn + +from model.config import RopeConfig +from model.rope_cache import RopeCacheManager +from model.rope_math import rotate_adjacent_pairs + + +class OdysseyRoPE(nn.Module): + """Apply rotary embeddings to query / key tensors. + + Accepted layouts (last dim = ``head_dim``): + + - ``(batch, seq, heads, head_dim)`` — Odyssey training default + - ``(seq, heads, head_dim)`` — Phalanx multi-head layout + - ``(seq, head_dim)`` — single-head / packed + + Shape is preserved. Values (V) are never rotated. + """ + + def __init__(self, config: RopeConfig) -> None: + super().__init__() + self.config = config + self._manager = RopeCacheManager( + rotary_dim=config.rotary_dim, + theta=config.theta, + scale=config.scaling_factor if config.scaling == "linear" else 1.0, + initial_max_position=config.max_position_embeddings, + device=config.device, + dtype=config.torch_dtype, + ) + + @classmethod + def from_config(cls, config: RopeConfig) -> OdysseyRoPE: + return cls(config) + + @property + def cache_max_position(self) -> int: + return self._manager.cache.max_position + + def cache_memory_bytes(self) -> int: + return self._manager.cache.memory_bytes() + + def forward( + self, + x: torch.Tensor, + *, + position_offset: int = 0, + ) -> torch.Tensor: + """Rotate ``x`` starting at absolute position ``position_offset``.""" + self._validate_input(x) + if position_offset < 0: + raise ValueError("position_offset must be >= 0") + + seq = self._seq_len(x) + if seq == 0: + return x + + required = position_offset + seq + cache = self._manager.get(required) + positions = torch.arange( + position_offset, + position_offset + seq, + device=x.device, + dtype=torch.long, + ) + cos = cache.cos[positions] # (seq, n_pairs) + sin = cache.sin[positions] + + # Align cos/sin to x layout: insert head axis when needed. + cos_b, sin_b = self._broadcast_cis(cos, sin, x.ndim) + # Compute in float32 for numerical parity with Phalanx, cast back. + x_f = x.float() + out = rotate_adjacent_pairs(x_f, cos_b.float(), sin_b.float()) + return out.to(dtype=x.dtype) + + def apply_rotary( + self, + q: torch.Tensor, + k: torch.Tensor, + *, + position_offset: int = 0, + ) -> tuple[torch.Tensor, torch.Tensor]: + """Rotate Q and K; leave V to the caller untouched.""" + return self.forward(q, position_offset=position_offset), self.forward( + k, position_offset=position_offset + ) + + def _validate_input(self, x: torch.Tensor) -> None: + if x.ndim not in (2, 3, 4): + raise ValueError( + "expected rank 2/3/4 with last dim = head_dim, " + f"got shape {tuple(x.shape)}" + ) + if x.shape[-1] != self.config.head_dim: + raise ValueError( + f"last dim {x.shape[-1]} != configured head_dim {self.config.head_dim}" + ) + if self.config.rotary_dim > self.config.head_dim: + raise ValueError("rotary_dim exceeds head_dim") + + @staticmethod + def _seq_len(x: torch.Tensor) -> int: + if x.ndim == 4: + return int(x.shape[1]) + return int(x.shape[0]) + + @staticmethod + def _broadcast_cis( + cos: torch.Tensor, sin: torch.Tensor, rank: int + ) -> tuple[torch.Tensor, torch.Tensor]: + """Expand ``(seq, n_pairs)`` for broadcasting onto ``x`` pair dims.""" + if rank == 2: + # x: (seq, head_dim) — cos already (seq, n_pairs) + return cos, sin + if rank == 3: + # x: (seq, heads, head_dim) → cos (seq, 1, n_pairs) + return cos.unsqueeze(1), sin.unsqueeze(1) + # rank 4: (batch, seq, heads, head_dim) → (1, seq, 1, n_pairs) + return cos.unsqueeze(0).unsqueeze(2), sin.unsqueeze(0).unsqueeze(2) + + def inspect(self) -> dict[str, Any]: + cache = self._manager.cache + return { + "theta": self.config.theta, + "rotary_dim": self.config.rotary_dim, + "head_dim": self.config.head_dim, + "scaling": self.config.scaling, + "scaling_factor": self.config.scaling_factor, + "max_position_embeddings": self.config.max_position_embeddings, + "cache_max_position": cache.max_position, + "cache_memory_bytes": cache.memory_bytes(), + "device": str(cache.device), + "dtype": str(cache.dtype).removeprefix("torch."), + } diff --git a/model/rope_cache.py b/model/rope_cache.py new file mode 100644 index 0000000..e42ca0b --- /dev/null +++ b/model/rope_cache.py @@ -0,0 +1,163 @@ +"""Cosine / sine cache for Rotary Positional Embeddings. + +Layout (matches Phalanx Runtime ``layers::Rope``): + + cos[pos * n_pairs + pair] + sin[pos * n_pairs + pair] + +Logical view exposed to PyTorch: ``(max_position, n_pairs)``. +""" + +from __future__ import annotations + +from dataclasses import dataclass + +import torch + +from model.rope_math import apply_linear_position_scale, inverse_frequencies + + +@dataclass(slots=True) +class RopeCache: + """Precomputed cos/sin tables for absolute positions ``0 .. max_position-1``.""" + + cos: torch.Tensor # (max_position, n_pairs) + sin: torch.Tensor # (max_position, n_pairs) + inv_freq: torch.Tensor # (n_pairs,) + rotary_dim: int + theta: float + scale: float + max_position: int + + @property + def n_pairs(self) -> int: + return self.rotary_dim // 2 + + @property + def device(self) -> torch.device: + return self.cos.device + + @property + def dtype(self) -> torch.dtype: + return self.cos.dtype + + def memory_bytes(self) -> int: + return int(self.cos.nbytes + self.sin.nbytes + self.inv_freq.nbytes) + + def to( + self, device: torch.device | str | None = None, dtype: torch.dtype | None = None + ) -> RopeCache: + return RopeCache( + cos=self.cos.to(device=device, dtype=dtype), + sin=self.sin.to(device=device, dtype=dtype), + inv_freq=self.inv_freq.to(device=device, dtype=dtype), + rotary_dim=self.rotary_dim, + theta=self.theta, + scale=self.scale, + max_position=self.max_position, + ) + + +def build_rope_cache( + *, + rotary_dim: int, + max_position: int, + theta: float = 10000.0, + scale: float = 1.0, + device: torch.device | str | None = None, + dtype: torch.dtype = torch.float32, +) -> RopeCache: + """Build a dense cos/sin cache for ``max_position`` absolute indices.""" + if max_position < 1: + raise ValueError("max_position must be >= 1") + + inv_freq = inverse_frequencies( + rotary_dim, theta, dtype=torch.float32, device=device + ) + positions = torch.arange(max_position, device=device, dtype=torch.float32) + positions = apply_linear_position_scale(positions, scale) + # angles: (max_position, n_pairs) + angles = positions.unsqueeze(1) * inv_freq.unsqueeze(0) + cos = torch.cos(angles).to(dtype=dtype) + sin = torch.sin(angles).to(dtype=dtype) + return RopeCache( + cos=cos, + sin=sin, + inv_freq=inv_freq.to(dtype=dtype), + rotary_dim=rotary_dim, + theta=theta, + scale=scale, + max_position=max_position, + ) + + +class RopeCacheManager: + """Lazy cos/sin cache with growth and device/dtype moves. + + The cache is never rebuilt when a request fits the existing table on the + same device/dtype/hyperparameters. + """ + + def __init__( + self, + *, + rotary_dim: int, + theta: float = 10000.0, + scale: float = 1.0, + initial_max_position: int = 2048, + device: torch.device | str = "cpu", + dtype: torch.dtype = torch.float32, + ) -> None: + self.rotary_dim = rotary_dim + self.theta = theta + self.scale = scale + self.device = torch.device(device) + self.dtype = dtype + self._cache: RopeCache | None = None + self._ensure(initial_max_position) + + @property + def cache(self) -> RopeCache: + if self._cache is None: + raise RuntimeError("RoPE cache not initialized") + return self._cache + + def _ensure(self, required_positions: int) -> RopeCache: + need = max(1, required_positions) + if ( + self._cache is not None + and self._cache.max_position >= need + and self._cache.device == self.device + and self._cache.dtype == self.dtype + and self._cache.rotary_dim == self.rotary_dim + and self._cache.theta == self.theta + and self._cache.scale == self.scale + ): + return self._cache + + # Grow geometrically to avoid frequent rebuilds. + current = 0 if self._cache is None else self._cache.max_position + target = max(need, current) + if self._cache is not None and need > current: + target = max(need, current * 2) + + self._cache = build_rope_cache( + rotary_dim=self.rotary_dim, + max_position=target, + theta=self.theta, + scale=self.scale, + device=self.device, + dtype=self.dtype, + ) + return self._cache + + def get(self, required_positions: int) -> RopeCache: + """Return a cache covering absolute positions ``0 .. required_positions-1``.""" + return self._ensure(required_positions) + + def to(self, device: torch.device | str, dtype: torch.dtype | None = None) -> None: + self.device = torch.device(device) + if dtype is not None: + self.dtype = dtype + if self._cache is not None: + self._cache = self._cache.to(device=self.device, dtype=self.dtype) diff --git a/model/rope_math.py b/model/rope_math.py new file mode 100644 index 0000000..b03024c --- /dev/null +++ b/model/rope_math.py @@ -0,0 +1,102 @@ +"""Rotary embedding mathematics (LLaMA / Phalanx-compatible). + +Frequency schedule +------------------ +For rotary width ``d_r`` (even) and base ``θ`` (default 10000): + + inv_freq[i] = θ ^ (-2i / d_r) for i = 0 .. d_r/2 - 1 + +Why θ = 10000: inherited from the original Transformer sinusoids and +RoFormer / LLaMA; it spaces wavelengths from ~2π to cover short and long +offsets without trainable parameters. + +Adjacent-pair rotation +---------------------- +For each pair ``(x0, x1)`` at absolute position ``m`` (after optional linear +scale ``m' = m / factor``): + + x0' = x0 * cos(m'·ω) - x1 * sin(m'·ω) + x1' = x0 * sin(m'·ω) + x1 * cos(m'·ω) + +This is the real form of multiplying ``(x0 + i x1)`` by ``e^{i m' ω}``. +Rotation preserves L2 norm of each pair (and thus the full rotary subspace). + +V is never rotated: values carry content, not relative-position phases in the +RoPE attention derivation. +""" + +from __future__ import annotations + +import math + +import torch + + +def inverse_frequencies( + rotary_dim: int, + theta: float = 10000.0, + *, + dtype: torch.dtype = torch.float32, + device: torch.device | str | None = None, +) -> torch.Tensor: + """Return ``inv_freq`` of shape ``(rotary_dim // 2,)``.""" + if rotary_dim <= 0 or rotary_dim % 2 != 0: + raise ValueError(f"rotary_dim must be even and > 0, got {rotary_dim}") + if not math.isfinite(theta) or theta <= 0: + raise ValueError(f"theta must be finite and > 0, got {theta}") + + n_pairs = rotary_dim // 2 + # Match Phalanx: exponent = (2 * i) / rotary_dim in f32-style arithmetic. + indices = torch.arange(n_pairs, device=device, dtype=torch.float32) + inv_freq = theta ** (-(2.0 * indices) / float(rotary_dim)) + return inv_freq.to(dtype=dtype) + + +def rotate_adjacent_pairs( + x: torch.Tensor, + cos: torch.Tensor, + sin: torch.Tensor, +) -> torch.Tensor: + """Rotate the leading even-width slice of ``x`` with broadcastable cos/sin. + + Args: + x: ``(..., head_dim)`` — only the first ``2 * cos.shape[-1]`` dims rotate. + cos: ``(..., n_pairs)`` broadcastable to the pair axis. + sin: same shape as ``cos``. + + Returns: + Tensor with the same shape as ``x``. + """ + if x.shape[-1] < 2: + return x + + n_pairs = cos.shape[-1] + rotary_dim = n_pairs * 2 + if rotary_dim > x.shape[-1]: + raise ValueError(f"rotary width {rotary_dim} exceeds head_dim {x.shape[-1]}") + + x_rot = x[..., :rotary_dim] + x_pass = x[..., rotary_dim:] + + # Adjacent pairs: (x0, x1, x2, x3, ...) → rotate (x0,x1), (x2,x3), ... + x0 = x_rot[..., 0::2] + x1 = x_rot[..., 1::2] + # Broadcast cos/sin over batch/head dims as needed. + while cos.ndim < x0.ndim: + cos = cos.unsqueeze(0) + sin = sin.unsqueeze(0) + + out0 = x0 * cos - x1 * sin + out1 = x0 * sin + x1 * cos + rotated = torch.stack((out0, out1), dim=-1).flatten(-2) + + if x_pass.numel() == 0: + return rotated + return torch.cat((rotated, x_pass), dim=-1) + + +def apply_linear_position_scale(positions: torch.Tensor, factor: float) -> torch.Tensor: + """Return ``m' = m / factor`` for linear RoPE scaling (factor=1 → identity).""" + if not math.isfinite(factor) or factor <= 0: + raise ValueError(f"scaling factor must be finite and > 0, got {factor}") + return positions.to(dtype=torch.float32) / float(factor) diff --git a/model/rope_visualizer.py b/model/rope_visualizer.py new file mode 100644 index 0000000..26ff531 --- /dev/null +++ b/model/rope_visualizer.py @@ -0,0 +1,118 @@ +"""Educational visualizations for Odyssey RoPE.""" + +from __future__ import annotations + +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +import torch + +from model.config import RopeConfig +from model.rope import OdysseyRoPE +from model.rope_math import inverse_frequencies +from odyssey.config import REPO_ROOT + +DEFAULT_ASSET_DIR = REPO_ROOT / "assets" / "rope" + + +def plot_inverse_frequencies( + config: RopeConfig, + *, + output_path: Path | str | None = None, +) -> Path: + path = Path(output_path) if output_path else DEFAULT_ASSET_DIR / "inv_freq.png" + path.parent.mkdir(parents=True, exist_ok=True) + inv = inverse_frequencies(config.rotary_dim, config.theta).cpu().numpy() + fig, ax = plt.subplots(figsize=(7, 4)) + ax.plot(np.arange(len(inv)), inv, color="#2c5f6e", marker="o", markersize=3) + ax.set_xlabel("pair index i") + ax.set_ylabel("inv_freq[i]") + ax.set_title( + f"RoPE inverse frequencies (θ={config.theta}, d_r={config.rotary_dim})" + ) + ax.set_yscale("log") + fig.tight_layout() + fig.savefig(path, dpi=140) + plt.close(fig) + return path + + +def plot_cos_sin_curves( + config: RopeConfig, + *, + pair_index: int = 0, + output_path: Path | str | None = None, +) -> Path: + path = ( + Path(output_path) if output_path else DEFAULT_ASSET_DIR / "cos_sin_curves.png" + ) + path.parent.mkdir(parents=True, exist_ok=True) + rope = OdysseyRoPE(config) + cache = rope._manager.cache # noqa: SLF001 — visualizer introspection + pos = np.arange(min(256, cache.max_position)) + cos = cache.cos[: len(pos), pair_index].cpu().numpy() + sin = cache.sin[: len(pos), pair_index].cpu().numpy() + fig, ax = plt.subplots(figsize=(8, 4)) + ax.plot(pos, cos, label=f"cos pair={pair_index}", color="#2c5f6e") + ax.plot(pos, sin, label=f"sin pair={pair_index}", color="#b85c38") + ax.set_xlabel("position m") + ax.set_ylabel("value") + ax.set_title("RoPE cos/sin vs position") + ax.legend() + fig.tight_layout() + fig.savefig(path, dpi=140) + plt.close(fig) + return path + + +def plot_rotation_demo( + config: RopeConfig, + *, + output_path: Path | str | None = None, +) -> Path: + """2D scatter of a unit pair rotating across positions.""" + path = Path(output_path) if output_path else DEFAULT_ASSET_DIR / "rotation_demo.png" + path.parent.mkdir(parents=True, exist_ok=True) + # Minimal head: rotary_dim dims, demo on first pair. + demo = RopeConfig( + theta=config.theta, + head_dim=max(2, config.rotary_dim), + rotary_dim=max(2, min(config.rotary_dim, 8)), + max_position_embeddings=64, + scaling=config.scaling, + scaling_factor=config.scaling_factor, + ) + rope = OdysseyRoPE(demo) + x = torch.zeros(32, demo.head_dim) + x[:, 0] = 1.0 + x[:, 1] = 0.0 + y = rope(x, position_offset=0) + pts = y[:, :2].detach().cpu().numpy() + fig, ax = plt.subplots(figsize=(5, 5)) + ax.scatter(pts[:, 0], pts[:, 1], c=np.arange(len(pts)), cmap="viridis", s=28) + ax.axhline(0, color="#888", lw=0.5) + ax.axvline(0, color="#888", lw=0.5) + ax.set_aspect("equal") + ax.set_xlabel("x0'") + ax.set_ylabel("x1'") + ax.set_title("Unit pair (1,0) under RoPE positions 0..31") + fig.tight_layout() + fig.savefig(path, dpi=140) + plt.close(fig) + return path + + +def export_rope_assets(config: RopeConfig | None = None) -> dict[str, Path]: + cfg = config or RopeConfig( + theta=10000.0, + head_dim=128, + rotary_dim=128, + max_position_embeddings=4096, + ) + DEFAULT_ASSET_DIR.mkdir(parents=True, exist_ok=True) + return { + "inv_freq": plot_inverse_frequencies(cfg), + "cos_sin": plot_cos_sin_curves(cfg), + "rotation": plot_rotation_demo(cfg), + } diff --git a/odyssey/__init__.py b/odyssey/__init__.py index c534ecd..5ecfcd2 100644 --- a/odyssey/__init__.py +++ b/odyssey/__init__.py @@ -1,7 +1,6 @@ """Odyssey research package. -Phase 3 delivers the token embedding layer. Later phases add RoPE, -normalization, attention, and the full decoder stack. +Phase 4 delivers LLaMA-style RoPE with Phalanx numerical parity. """ -__version__ = "0.3.0" +__version__ = "0.4.0" diff --git a/papers/attention_position.md b/papers/attention_position.md new file mode 100644 index 0000000..5f929ac --- /dev/null +++ b/papers/attention_position.md @@ -0,0 +1,38 @@ +# Attention Is All You Need — Positional Encoding + +**Authors:** Vaswani et al. +**Link:** [https://arxiv.org/abs/1706.03762](https://arxiv.org/abs/1706.03762) +**Focus:** Positional Encoding section + +--- + +## Motivation + +Self-attention is permutation-invariant. Without position signals, token order is lost. + +--- + +## Absolute Sinusoidal Encoding + +\[ +\begin{aligned} +PE_{(pos, 2i)} &= \sin(pos / 10000^{2i/d}) \\ +PE_{(pos, 2i+1)} &= \cos(pos / 10000^{2i/d}) +\end{aligned} +\] + +Added to input embeddings. The \(10000\) base later reappears in RoPE’s θ schedule. + +--- + +## Limitations + +- Absolute, not relative +- Additive mixing with content embeddings +- Weaker long-context extrapolation than RoPE in practice + +--- + +## Notes for Odyssey + +Odyssey does **not** use additive sinusoids. Spec v1 mandates RoPE on Q/K (see `spec/rope.md`). This paper remains the historical root of the frequency schedule. diff --git a/papers/llama_rope.md b/papers/llama_rope.md new file mode 100644 index 0000000..1faa500 --- /dev/null +++ b/papers/llama_rope.md @@ -0,0 +1,38 @@ +# LLaMA RoPE Notes + +**References:** LLaMA / Llama 2 technical reports; llama.cpp / GGUF RoPE metadata + +--- + +## Formulation Used by Odyssey & Phalanx + +- Adjacent-pair rotation (interleaved even/odd dims) +- \(\theta_i = \texttt{rope.freq\_base}^{-2i/d_r}\) (default base 10000) +- Partial rotary dims: rotate first `rope.dimension_count` features +- Optional **linear** position scaling: \(m' = m / \mathrm{factor}\) +- Apply to **Q and K only** + +--- + +## Differences from RoFormer Presentation + +| Topic | RoFormer paper | LLaMA / Odyssey | +| --- | --- | --- | +| Complex vs real | Emphasizes complex view | Real 2×2 rotate (equivalent) | +| Pairing | Complex channel pairs | Adjacent dims `(0,1), (2,3), …` | +| Partial RoPE | Not always stressed | First `rotary_dim` only | +| Scaling | Later literature | Linear in Spec v1; YaRN/NTK later | + +--- + +## Phalanx Parity Contract + +Must match: + +- θ / inverse-frequency generation +- Adjacent-pair rotate +- Cos/sin cache indexing `pos * n_pairs + pair` +- Linear scaling +- Tensor layouts `[seq, heads, head_dim]` (Odyssey also accepts batched rank-4) + +Validated by `scripts/validate_rope.py` + `runtime` bin `validate_rope`. diff --git a/papers/roformer.md b/papers/roformer.md new file mode 100644 index 0000000..60c47e5 --- /dev/null +++ b/papers/roformer.md @@ -0,0 +1,50 @@ +# RoFormer: Enhanced Transformer with Rotary Position Embedding + +**Authors:** Jianlin Su et al. +**Link:** [https://arxiv.org/abs/2104.09864](https://arxiv.org/abs/2104.09864) + +--- + +## Motivation + +Absolute position embeddings (learned or sinusoidal) inject position as an additive vector. They do not naturally encode **relative** offsets inside attention scores and extrapolate poorly beyond the training context. + +--- + +## Mathematics + +Represent a 2D feature pair as a complex number and multiply by a position-dependent phase: + +\[ +(x_{2i} + i x_{2i+1})\, e^{i m \theta_i} +\] + +with \(\theta_i = 10000^{-2i/d}\). In real arithmetic this is the 2×2 rotation used by Odyssey / LLaMA / Phalanx. + +--- + +## Rotation Derivation + +The relative rotation between positions \(m\) and \(n\) depends on \(m-n\), so attention logits gain relative positional structure without extra bias parameters. + +--- + +## Advantages + +- No trainable position table +- Built-in relative geometry +- Efficient via cos/sin caches +- Strong length extrapolation vs absolute embeddings + +--- + +## Weaknesses + +- Pairing scheme and θ schedule are design choices +- Very long contexts still need scaling tricks (NTK, YaRN — deferred) + +--- + +## Notes for Odyssey + +Odyssey Phase 4 implements the LLaMA adjacent-pair form of RoPE and validates numerically against Phalanx Runtime (`scripts/validate_rope.py`). diff --git a/pyproject.toml b/pyproject.toml index 8e039d0..f222deb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "odyssey" -version = "0.3.0" +version = "0.4.0" description = "A decoder-only transformer specializing in long-horizon reasoning and software architecture." readme = "README.md" license = { file = "LICENSE" } diff --git a/scripts/benchmark_rope.py b/scripts/benchmark_rope.py new file mode 100644 index 0000000..f5d5e1b --- /dev/null +++ b/scripts/benchmark_rope.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +"""Benchmark Odyssey RoPE cache build + rotate throughput.""" + +from __future__ import annotations + +import argparse +import json +import time +from pathlib import Path + +import torch + +from model import OdysseyRoPE, RopeConfig +from model.rope_visualizer import export_rope_assets +from odyssey.config import REPO_ROOT + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--head-dim", type=int, default=128) + parser.add_argument("--rotary-dim", type=int, default=128) + parser.add_argument("--max-position", type=int, default=4096) + parser.add_argument("--seq", type=int, default=512) + parser.add_argument("--heads", type=int, default=12) + parser.add_argument("--batch", type=int, default=2) + parser.add_argument("--warmup", type=int, default=5) + parser.add_argument("--repeats", type=int, default=50) + parser.add_argument("--device", default="cpu") + parser.add_argument( + "--output", + type=Path, + default=REPO_ROOT / "experiments" / "ODY-0004" / "metrics.json", + ) + parser.add_argument("--visualize", action="store_true") + args = parser.parse_args() + + cfg = RopeConfig( + theta=10000.0, + head_dim=args.head_dim, + rotary_dim=args.rotary_dim, + max_position_embeddings=args.max_position, + device=args.device, + dtype="float32", + ) + + t0 = time.perf_counter() + rope = OdysseyRoPE(cfg) + # Force full cache materialization + _ = rope(torch.zeros(1, 1, args.head_dim, device=args.device), position_offset=0) + cache_s = time.perf_counter() - t0 + + x = torch.randn(args.batch, args.seq, args.heads, args.head_dim, device=args.device) + for _ in range(args.warmup): + _ = rope(x, position_offset=0) + if args.device.startswith("cuda"): + torch.cuda.synchronize() + + times: list[float] = [] + for _ in range(args.repeats): + if args.device.startswith("cuda"): + torch.cuda.synchronize() + start = time.perf_counter() + _ = rope(x, position_offset=0) + if args.device.startswith("cuda"): + torch.cuda.synchronize() + times.append(time.perf_counter() - start) + + mean_s = sum(times) / len(times) + elems = args.batch * args.seq * args.heads * args.head_dim + metrics = { + "theta": 10000.0, + "rotary_dim": args.rotary_dim, + "head_dim": args.head_dim, + "max_position_embeddings": args.max_position, + "cache_build_seconds": round(cache_s, 6), + "cache_memory_bytes": rope.cache_memory_bytes(), + "rotate_mean_seconds": round(mean_s, 8), + "rotate_elems_per_second": round(elems / mean_s, 2), + "device": args.device, + "shape": list(x.shape), + } + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(metrics, indent=2) + "\n", encoding="utf-8") + print(json.dumps(metrics, indent=2)) + + if args.visualize: + paths = export_rope_assets(cfg) + print("visualizations:", {k: str(v) for k, v in paths.items()}) + + +if __name__ == "__main__": + main() diff --git a/scripts/validate_rope.py b/scripts/validate_rope.py new file mode 100644 index 0000000..e99fdc5 --- /dev/null +++ b/scripts/validate_rope.py @@ -0,0 +1,215 @@ +#!/usr/bin/env python3 +"""Cross-implementation RoPE validation: Odyssey (PyTorch) vs Phalanx (Rust). + +Workflow +-------- +Architecture Spec → Odyssey Implementation → this script → Phalanx Runtime +→ Numerical Comparison → PASS / FAIL + +Procedure +1. Generate identical random Q, K (float32). +2. Apply Odyssey ``OdysseyRoPE``. +3. Serialize inputs + manifest for the Phalanx ``validate_rope`` binary. +4. Run Phalanx RoPE on the same tensors. +5. Compare max / mean absolute error against a tolerance (default 1e-6). + +Example +------- + python scripts/validate_rope.py + python scripts/validate_rope.py --tolerance 1e-6 --seed 0 +""" + +from __future__ import annotations + +import argparse +import json +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +import numpy as np +import torch + +from model import OdysseyRoPE, RopeConfig +from odyssey.config import REPO_ROOT + +PHALANX_ROOT = REPO_ROOT.parent / "runtime" +DEFAULT_REPORT = REPO_ROOT / "experiments" / "ODY-0004" / "rope_validation.json" + + +def _write_f32(path: Path, array: np.ndarray) -> None: + path.write_bytes(np.ascontiguousarray(array, dtype=np.float32).tobytes()) + + +def _read_f32(path: Path, shape: tuple[int, ...]) -> np.ndarray: + data = np.frombuffer(path.read_bytes(), dtype=np.float32) + return data.reshape(shape).copy() + + +def run_odyssey( + q: torch.Tensor, + k: torch.Tensor, + config: RopeConfig, + position_offset: int, +) -> tuple[torch.Tensor, torch.Tensor]: + rope = OdysseyRoPE(config) + return rope.apply_rotary(q, k, position_offset=position_offset) + + +def run_phalanx( + work_dir: Path, + *, + phalanx_root: Path, + release: bool, +) -> None: + """Invoke Phalanx via ``cargo run`` so ``CARGO_TARGET_DIR`` overrides work.""" + cmd = ["cargo", "run", "--quiet", "--bin", "validate_rope"] + if release: + cmd.append("--release") + cmd.extend(["--", str(work_dir)]) + subprocess.run(cmd, cwd=phalanx_root, check=True) + + +def compare( + odyssey: np.ndarray, + phalanx: np.ndarray, + *, + tolerance: float, +) -> dict[str, float | bool | str]: + diff = np.abs(odyssey.astype(np.float64) - phalanx.astype(np.float64)) + max_err = float(diff.max()) if diff.size else 0.0 + mean_err = float(diff.mean()) if diff.size else 0.0 + passed = max_err <= tolerance + return { + "max_error": max_err, + "mean_error": mean_err, + "tolerance": tolerance, + "pass": passed, + "status": "PASS" if passed else "FAIL", + } + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--seed", type=int, default=0) + parser.add_argument("--seq", type=int, default=16) + parser.add_argument("--heads", type=int, default=4) + parser.add_argument("--head-dim", type=int, default=128) + parser.add_argument("--rotary-dim", type=int, default=128) + parser.add_argument("--theta", type=float, default=10000.0) + parser.add_argument("--max-position", type=int, default=4096) + parser.add_argument("--position-offset", type=int, default=3) + parser.add_argument("--scale", type=float, default=1.0, help="linear scale factor") + parser.add_argument("--tolerance", type=float, default=1e-6) + parser.add_argument("--phalanx-root", type=Path, default=PHALANX_ROOT) + parser.add_argument("--release", action="store_true") + parser.add_argument("--keep-work-dir", type=Path, default=None) + parser.add_argument("--report", type=Path, default=DEFAULT_REPORT) + args = parser.parse_args() + + if not args.phalanx_root.is_dir(): + print(f"Phalanx root not found: {args.phalanx_root}", file=sys.stderr) + return 2 + + torch.manual_seed(args.seed) + np.random.seed(args.seed) + + # Phalanx layout: [seq, heads, head_dim] + shape = (args.seq, args.heads, args.head_dim) + q = torch.randn(shape, dtype=torch.float32) + k = torch.randn(shape, dtype=torch.float32) + + scaling = "linear" if args.scale != 1.0 else "none" + config = RopeConfig( + theta=args.theta, + head_dim=args.head_dim, + rotary_dim=args.rotary_dim, + max_position_embeddings=args.max_position, + scaling=scaling, # type: ignore[arg-type] + scaling_factor=args.scale, + device="cpu", + dtype="float32", + ) + + q_ody, k_ody = run_odyssey(q, k, config, args.position_offset) + + work = ( + Path(tempfile.mkdtemp(prefix="rope_val_")) + if args.keep_work_dir is None + else args.keep_work_dir + ) + work.mkdir(parents=True, exist_ok=True) + + manifest = { + "shape": list(shape), + "head_dim": args.head_dim, + "rotary_dim": args.rotary_dim, + "theta": args.theta, + "scale": args.scale, + "max_position": args.max_position, + "position_offset": args.position_offset, + "seed": args.seed, + } + (work / "manifest.json").write_text( + json.dumps(manifest, indent=2) + "\n", encoding="utf-8" + ) + _write_f32(work / "q_in.bin", q.numpy()) + _write_f32(work / "k_in.bin", k.numpy()) + _write_f32(work / "q_ody.bin", q_ody.detach().numpy()) + _write_f32(work / "k_ody.bin", k_ody.detach().numpy()) + + run_phalanx(work, phalanx_root=args.phalanx_root, release=args.release) + + q_ph = _read_f32(work / "q_out.bin", shape) + k_ph = _read_f32(work / "k_out.bin", shape) + + q_cmp = compare(q_ody.detach().numpy(), q_ph, tolerance=args.tolerance) + k_cmp = compare(k_ody.detach().numpy(), k_ph, tolerance=args.tolerance) + max_err = max(float(q_cmp["max_error"]), float(k_cmp["max_error"])) + mean_err = (float(q_cmp["mean_error"]) + float(k_cmp["mean_error"])) / 2.0 + passed = max_err <= args.tolerance + + report = { + "component": "RoPE", + "odyssey_spec": "1.0.0", + "manifest": manifest, + "q": q_cmp, + "k": k_cmp, + "max_error": max_err, + "mean_error": mean_err, + "tolerance": args.tolerance, + "status": "PASS" if passed else "FAIL", + "work_dir": str(work), + "message": ( + "Odyssey and Phalanx are mathematically identical." + if passed + else "RoPE outputs diverge beyond tolerance." + ), + } + args.report.parent.mkdir(parents=True, exist_ok=True) + args.report.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8") + + print("RoPE Validation") + print() + print("Max Error") + print(f"{max_err:.8f}") + print() + print("Mean Error") + print(f"{mean_err:.8f}") + print() + print(report["status"]) + print() + print(report["message"]) + print() + print(f"report: {args.report}") + + if args.keep_work_dir is None: + shutil.rmtree(work, ignore_errors=True) + + return 0 if passed else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_cache.py b/tests/test_cache.py new file mode 100644 index 0000000..769dfbe --- /dev/null +++ b/tests/test_cache.py @@ -0,0 +1,40 @@ +"""RoPE cache tests.""" + +from __future__ import annotations + +import torch + +from model.rope_cache import RopeCacheManager, build_rope_cache + + +def test_build_cache_shapes() -> None: + cache = build_rope_cache(rotary_dim=8, max_position=16, theta=10000.0) + assert cache.cos.shape == (16, 4) + assert cache.sin.shape == (16, 4) + assert cache.inv_freq.shape == (4,) + + +def test_lazy_extension() -> None: + mgr = RopeCacheManager( + rotary_dim=8, theta=10000.0, initial_max_position=16, device="cpu" + ) + assert mgr.cache.max_position == 16 + c1 = mgr.get(16) + c2 = mgr.get(16) + assert c1 is c2 or torch.equal(c1.cos, c2.cos) + grown = mgr.get(40) + assert grown.max_position >= 40 + + +def test_dtype_device_consistency() -> None: + cache = build_rope_cache( + rotary_dim=4, max_position=8, dtype=torch.float32, device="cpu" + ) + assert cache.cos.dtype == torch.float32 + assert cache.cos.device.type == "cpu" + + +def test_position_zero_cos_one() -> None: + cache = build_rope_cache(rotary_dim=4, max_position=4) + assert torch.allclose(cache.cos[0], torch.ones(2), atol=1e-6) + assert torch.allclose(cache.sin[0], torch.zeros(2), atol=1e-6) diff --git a/tests/test_phase0.py b/tests/test_phase0.py index 2a008cb..dfa70ef 100644 --- a/tests/test_phase0.py +++ b/tests/test_phase0.py @@ -17,7 +17,7 @@ def test_version() -> None: - assert __version__ == "0.3.0" + assert __version__ == "0.4.0" def test_package_imports() -> None: @@ -43,8 +43,9 @@ def test_config_loads() -> None: assert config["tokenizer"]["path"] == "assets/tokenizer/bpe/odyssey.model" assert config["tokenizer"]["type"] == "bpe" assert config["tokenizer"]["config"] == "configs/tokenizer.yaml" - assert config["experiment"]["id"] == "ODY-0003" + assert config["experiment"]["id"] == "ODY-0004" assert config["model"]["embedding"]["init_strategy"] == "xavier_uniform" + assert config["model"]["rope"]["theta"] == 10000.0 def test_config_yaml_parses_directly() -> None: @@ -115,6 +116,10 @@ def test_required_docs_exist() -> None: "spec/gguf_mapping.md", "spec/runtime_contract.md", "configs/embedding.yaml", + "configs/model.yaml", + "docs/architecture/rope.md", + "papers/roformer.md", + "scripts/validate_rope.py", "tokenizer/README.md", "tokenizer/docs/bpe.md", ] diff --git a/tests/test_rope.py b/tests/test_rope.py new file mode 100644 index 0000000..7f5c387 --- /dev/null +++ b/tests/test_rope.py @@ -0,0 +1,68 @@ +"""Unit tests for Odyssey RoPE.""" + +from __future__ import annotations + +import pytest +import torch + +from model import EmbeddingConfig, OdysseyEmbedding, OdysseyRoPE, RopeConfig + + +@pytest.fixture +def rope() -> OdysseyRoPE: + return OdysseyRoPE( + RopeConfig( + theta=10000.0, + head_dim=8, + rotary_dim=8, + max_position_embeddings=64, + ) + ) + + +def test_shape_preserved_rank4(rope: OdysseyRoPE) -> None: + q = torch.randn(2, 5, 3, 8) + out = rope(q) + assert out.shape == q.shape + + +def test_shape_preserved_phalanx_layout(rope: OdysseyRoPE) -> None: + x = torch.randn(5, 3, 8) + assert rope(x).shape == x.shape + + +def test_apply_rotary_returns_pair(rope: OdysseyRoPE) -> None: + q = torch.randn(4, 2, 8) + k = torch.randn(4, 2, 8) + q2, k2 = rope.apply_rotary(q, k, position_offset=1) + assert q2.shape == q.shape and k2.shape == k.shape + + +def test_position_zero_near_identity(rope: OdysseyRoPE) -> None: + x = torch.randn(1, 2, 8) + y = rope(x, position_offset=0) + assert torch.allclose(x, y, atol=1e-5) + + +def test_deterministic(rope: OdysseyRoPE) -> None: + x = torch.randn(3, 2, 8) + a = rope(x, position_offset=2) + b = rope(x, position_offset=2) + assert torch.equal(a, b) + + +def test_embedding_then_rope_shapes() -> None: + emb = OdysseyEmbedding( + EmbeddingConfig(vocab_size=50, hidden_size=32, padding_idx=0) + ) + # Reshape embedding to fake multi-head: D=32 → H=4, d=8 + ids = torch.randint(0, 50, (1, 6)) + h = emb(ids).view(1, 6, 4, 8) + rope = OdysseyRoPE(RopeConfig(head_dim=8, rotary_dim=8, max_position_embeddings=32)) + out = rope(h) + assert out.shape == (1, 6, 4, 8) + + +def test_rejects_bad_head_dim(rope: OdysseyRoPE) -> None: + with pytest.raises(ValueError, match="head_dim"): + rope(torch.randn(2, 2, 4)) diff --git a/tests/test_rope_shapes.py b/tests/test_rope_shapes.py new file mode 100644 index 0000000..456d123 --- /dev/null +++ b/tests/test_rope_shapes.py @@ -0,0 +1,32 @@ +"""Additional RoPE shape tests (batch layouts).""" + +from __future__ import annotations + +import pytest +import torch + +from model import OdysseyRoPE, RopeConfig, load_model_config + + +def test_load_model_yaml_rope() -> None: + cfg = load_model_config() + assert cfg.rope.theta == 10000.0 + assert cfg.rope.rotary_dim == 64 + assert cfg.head_dim == 64 + + +@pytest.mark.parametrize( + "shape", + [ + (8, 64), + (8, 4, 64), + (2, 8, 4, 64), + ], +) +def test_layouts(shape: tuple[int, ...]) -> None: + rope = OdysseyRoPE( + RopeConfig(head_dim=64, rotary_dim=64, max_position_embeddings=128) + ) + x = torch.randn(*shape) + y = rope(x, position_offset=0) + assert y.shape == shape diff --git a/tests/test_rotation.py b/tests/test_rotation.py new file mode 100644 index 0000000..d1ee5a1 --- /dev/null +++ b/tests/test_rotation.py @@ -0,0 +1,52 @@ +"""Property tests for RoPE rotations.""" + +from __future__ import annotations + +import torch + +from model import OdysseyRoPE, RopeConfig +from model.rope_math import inverse_frequencies, rotate_adjacent_pairs + + +def test_inverse_freq_length_and_positive() -> None: + inv = inverse_frequencies(16, theta=10000.0) + assert inv.shape == (8,) + assert torch.all(inv > 0) + # First freq is 1.0 when θ^{-0}=1 + assert torch.isclose(inv[0], torch.tensor(1.0)) + + +def test_rotation_preserves_norm() -> None: + rope = OdysseyRoPE( + RopeConfig(head_dim=16, rotary_dim=16, max_position_embeddings=128) + ) + x = torch.randn(7, 3, 16) + y = rope(x, position_offset=11) + nx = torch.linalg.vector_norm(x, dim=-1) + ny = torch.linalg.vector_norm(y, dim=-1) + assert torch.allclose(nx, ny, atol=1e-5) + + +def test_partial_rotary_leaves_tail() -> None: + rope = OdysseyRoPE(RopeConfig(head_dim=8, rotary_dim=4, max_position_embeddings=32)) + x = torch.randn(5, 2, 8) + y = rope(x, position_offset=4) + assert torch.equal(x[..., 4:], y[..., 4:]) + assert not torch.allclose(x[..., :4], y[..., :4]) + + +def test_adjacent_pair_formula() -> None: + x = torch.tensor([[1.0, 0.0, 0.0, 1.0]]) + cos = torch.tensor([[0.0, 1.0]]) # 90° on pair0, 0° on pair1 + sin = torch.tensor([[1.0, 0.0]]) + y = rotate_adjacent_pairs(x, cos, sin) + # pair0: (1,0) → (0,1); pair1: (0,1) → (0,1) + assert torch.allclose(y, torch.tensor([[0.0, 1.0, 0.0, 1.0]]), atol=1e-6) + + +def test_different_positions_change_output() -> None: + rope = OdysseyRoPE(RopeConfig(head_dim=4, rotary_dim=4, max_position_embeddings=64)) + x = torch.tensor([[1.0, 0.0, 0.0, 1.0]]) + y0 = rope(x, position_offset=0) + y7 = rope(x, position_offset=7) + assert (y0 - y7).abs().sum() > 1e-3 diff --git a/tests/test_scaling.py b/tests/test_scaling.py new file mode 100644 index 0000000..10b2864 --- /dev/null +++ b/tests/test_scaling.py @@ -0,0 +1,55 @@ +"""RoPE scaling tests.""" + +from __future__ import annotations + +import pytest +import torch + +from model import OdysseyRoPE, RopeConfig + + +def test_linear_scaling_changes_angles() -> None: + base = RopeConfig( + head_dim=8, + rotary_dim=8, + max_position_embeddings=64, + scaling="none", + scaling_factor=1.0, + ) + scaled = RopeConfig( + head_dim=8, + rotary_dim=8, + max_position_embeddings=64, + scaling="linear", + scaling_factor=2.0, + ) + x = torch.randn(1, 1, 8) + y1 = OdysseyRoPE(base)(x, position_offset=10) + y2 = OdysseyRoPE(scaled)(x, position_offset=10) + assert not torch.allclose(y1, y2) + + +def test_linear_scale_matches_half_position() -> None: + """m'=m/2 at offset 10 ≈ unscaled offset 5 for the same x.""" + cfg_s = RopeConfig( + head_dim=8, + rotary_dim=8, + max_position_embeddings=64, + scaling="linear", + scaling_factor=2.0, + ) + cfg = RopeConfig( + head_dim=8, + rotary_dim=8, + max_position_embeddings=64, + scaling="none", + ) + x = torch.randn(1, 2, 8) + y_scaled = OdysseyRoPE(cfg_s)(x, position_offset=10) + y_half = OdysseyRoPE(cfg)(x, position_offset=5) + assert torch.allclose(y_scaled, y_half, atol=1e-5) + + +def test_rejects_yarn() -> None: + with pytest.raises(ValueError, match="scaling"): + RopeConfig(scaling="yarn") # type: ignore[arg-type]