cherry-alpha / configuration_cherry_alpha.py
Banaxi-Tech's picture
Initialize Cherry Alpha
426ab3f verified
Raw History Blame Contribute Delete
4.43 kB
"""Configuration for Cherry Alpha."""
from __future__ import annotations
from transformers import PretrainedConfig
class CherryAlphaConfig(PretrainedConfig):
model_type = "cherry_alpha"
def __init__(
self,
vocab_size: int = 2048,
hidden_size: int = 256,
intermediate_size: int = 1488,
num_hidden_layers: int = 3,
num_attention_heads: int = 8,
num_key_value_heads: int = 1,
head_dim: int = 32,
ngram_buckets: int = 156250,
loop_schedule: tuple[int, ...] | list[int] = (0, 1, 1, 2),
refresh_kernel_size: int = 9,
max_position_embeddings: int = 4096,
rope_theta: float = 100000.0,
rms_norm_eps: float = 1e-5,
initializer_range: float = 0.02,
gradient_checkpointing: bool = True,
tie_word_embeddings: bool = True,
use_cache: bool = False,
bos_token_id: int = 1,
eos_token_id: int = 2,
pad_token_id: int = 0,
unk_token_id: int = 3,
**kwargs,
):
if hidden_size != num_attention_heads * head_dim:
raise ValueError("hidden_size must equal num_attention_heads * head_dim")
if num_attention_heads % num_key_value_heads:
raise ValueError("num_attention_heads must be divisible by num_key_value_heads")
if num_hidden_layers != 3:
raise ValueError("Cherry Alpha requires exactly three physical layers")
loop_schedule = tuple(int(index) for index in loop_schedule)
if loop_schedule != (0, 1, 1, 2):
raise ValueError("Cherry Alpha requires L1 -> L2 -> L2 -> L3")
if ngram_buckets <= 0:
raise ValueError("ngram_buckets must be positive")
if refresh_kernel_size <= 0 or refresh_kernel_size % 2 == 0:
raise ValueError("refresh_kernel_size must be a positive odd integer")
self.vocab_size = vocab_size
self.hidden_size = hidden_size
self.intermediate_size = intermediate_size
self.num_hidden_layers = num_hidden_layers
self.num_attention_heads = num_attention_heads
self.num_key_value_heads = num_key_value_heads
self.head_dim = head_dim
self.ngram_buckets = ngram_buckets
self.loop_schedule = list(loop_schedule)
self.refresh_kernel_size = refresh_kernel_size
self.max_position_embeddings = max_position_embeddings
self.rope_theta = rope_theta
self.rms_norm_eps = rms_norm_eps
self.initializer_range = initializer_range
self.gradient_checkpointing = gradient_checkpointing
self.use_cache = False
super().__init__(
tie_word_embeddings=tie_word_embeddings,
bos_token_id=bos_token_id,
eos_token_id=eos_token_id,
pad_token_id=pad_token_id,
unk_token_id=unk_token_id,
**kwargs,
)
def parameter_counts(self) -> dict[str, int]:
hidden = self.hidden_size
query_width = self.num_attention_heads * self.head_dim
kv_width = self.num_key_value_heads * self.head_dim
token_embedding = self.vocab_size * hidden
ngram_embedding = self.ngram_buckets * hidden + 1
attention = (
hidden * query_width
+ 2 * hidden * kv_width
+ query_width * hidden
+ 2 * self.head_dim
)
refresh = (
3 * hidden * hidden
+ hidden * self.refresh_kernel_size
+ 3 * hidden
+ 1
)
mlp = 3 * hidden * self.intermediate_size
block_norms = 2 * hidden
physical_layer = attention + refresh + mlp + block_norms
neural_core = (
token_embedding
+ self.num_hidden_layers * physical_layer
+ hidden
)
total = neural_core + ngram_embedding
if not self.tie_word_embeddings:
total += token_embedding
neural_core += token_embedding
return {
"total": total,
"neural_core": neural_core,
"ngram": ngram_embedding,
"token_embedding": token_embedding,
"physical_layer": physical_layer,
"physical_layers": self.num_hidden_layers,
"effective_layer_passes": len(self.loop_schedule),
}
CherryAlphaConfig.register_for_auto_class("AutoConfig")
__all__ = ["CherryAlphaConfig"]