raev2-compressor / configuration_efficient_rae.py
toilaluan's picture
Upload folder using huggingface_hub
846e221 verified
Raw
History Blame Contribute Delete
5.22 kB
from __future__ import annotations
from transformers import PretrainedConfig
class EfficientRAEConfig(PretrainedConfig):
"""Configuration for the spatial compression modules around a frozen RAE."""
model_type = "efficient_rae"
def __init__(
self,
image_size: int = 256,
patch_size: int = 16,
encoder_hidden_size: int = 1024,
pool_size: int = 2,
hidden_size: int = 1024,
num_attention_heads: int = 16,
mlp_ratio: float = 4.0,
pooler_num_hidden_layers: int = 16,
unpooler_num_hidden_layers: int = 4,
pooler_depth_attention: bool = True,
unpooler_depth_attention: bool = True,
depth_attention_stride: int = 4,
rms_norm_eps: float = 1e-6,
layer_norm_eps: float = 1e-6,
dropout: float = 0.1,
attention_dropout: float = 0.1,
semantic_num_queries: int | None = None,
mask_ratio_min: float = -0.1,
mask_ratio_max: float = 0.5,
noise_t_max: float = 1.0,
checkpoint_format_version: int = 2,
**kwargs,
):
# Legacy adapter checkpoints included RAE source metadata. Ignore it:
# the RAE is now loaded independently and injected into the model.
kwargs.pop("base_model_name_or_path", None)
kwargs.pop("base_model_revision", None)
super().__init__(**kwargs)
self.image_size = image_size
self.patch_size = patch_size
self.encoder_hidden_size = encoder_hidden_size
self.pool_size = pool_size
self.hidden_size = hidden_size
self.num_attention_heads = num_attention_heads
self.mlp_ratio = mlp_ratio
self.pooler_num_hidden_layers = pooler_num_hidden_layers
self.unpooler_num_hidden_layers = unpooler_num_hidden_layers
self.pooler_depth_attention = pooler_depth_attention
self.unpooler_depth_attention = unpooler_depth_attention
self.depth_attention_stride = depth_attention_stride
self.rms_norm_eps = rms_norm_eps
self.layer_norm_eps = layer_norm_eps
self.dropout = dropout
self.attention_dropout = attention_dropout
self.semantic_num_queries = (
semantic_num_queries
if semantic_num_queries is not None
else self.encoder_grid_size**2 + 5
)
self.mask_ratio_min = mask_ratio_min
self.mask_ratio_max = mask_ratio_max
self.noise_t_max = noise_t_max
self.checkpoint_format_version = checkpoint_format_version
self._validate()
@property
def encoder_grid_size(self) -> int:
return self.image_size // self.patch_size
@property
def compact_grid_size(self) -> int:
return self.encoder_grid_size // self.pool_size
@property
def intermediate_size(self) -> int:
return int(self.hidden_size * self.mlp_ratio)
def _validate(self) -> None:
if self.image_size < 1 or self.patch_size < 1:
raise ValueError("image_size and patch_size must be positive")
if self.image_size % self.patch_size:
raise ValueError("image_size must be divisible by patch_size")
if self.pool_size < 1 or self.encoder_grid_size % self.pool_size:
raise ValueError("encoder grid size must be divisible by pool_size")
if self.hidden_size < 1 or self.hidden_size % self.num_attention_heads:
raise ValueError("hidden_size must be divisible by num_attention_heads")
head_size = self.hidden_size // self.num_attention_heads
if head_size % 4:
raise ValueError("attention head size must be divisible by 4 for 2D RoPE")
if self.mlp_ratio <= 0:
raise ValueError("mlp_ratio must be positive")
if self.pooler_num_hidden_layers < 1 or self.unpooler_num_hidden_layers < 1:
raise ValueError("pooler and unpooler must each have at least one layer")
if self.depth_attention_stride < 1:
raise ValueError("depth_attention_stride must be positive")
if self.rms_norm_eps <= 0 or self.layer_norm_eps <= 0:
raise ValueError("normalization epsilons must be positive")
if not 0.0 <= self.dropout < 1.0:
raise ValueError("dropout must be in [0, 1)")
if not 0.0 <= self.attention_dropout < 1.0:
raise ValueError("attention_dropout must be in [0, 1)")
if self.encoder_hidden_size % self.num_attention_heads:
raise ValueError(
"encoder_hidden_size must be divisible by num_attention_heads"
)
if self.semantic_num_queries < 1:
raise ValueError("semantic_num_queries must be positive")
if self.mask_ratio_min > self.mask_ratio_max:
raise ValueError("mask_ratio_min must not exceed mask_ratio_max")
if self.mask_ratio_max > 1.0:
raise ValueError("mask_ratio_max must not exceed 1")
if not 0.0 <= self.noise_t_max <= 1.0:
raise ValueError("noise_t_max must be in [0, 1]")
if self.checkpoint_format_version != 2:
raise ValueError("only checkpoint_format_version=2 is supported")
EfficientRAEConfig.register_for_auto_class()