Configuration API

This section documents the configuration management system.

Main Configuration Classes

Model Configuration

Configure model architecture:

from jepa.config import ModelConfig

config = ModelConfig(
    encoder_type="transformer",
    encoder_dim=768,
    encoder_layers=12,
    predictor_type="mlp",
    predictor_dim=256
)

Or via YAML:

model:
  encoder_type: "transformer"
  encoder_dim: 768
  encoder_layers: 12
  encoder_heads: 12
  dropout: 0.1
  
  predictor_type: "mlp"
  predictor_dim: 256
  predictor_layers: 3
  
  loss_function: "contrastive"
  temperature: 0.1

Training Configuration

Configure training parameters:

from jepa.config import TrainingConfig

config = TrainingConfig(
    epochs=100,
    batch_size=64,
    learning_rate=1e-4,
    optimizer="adamw",
    scheduler="cosine"
)

Or via YAML:

training:
  epochs: 100
  batch_size: 64
  learning_rate: 1e-4
  weight_decay: 1e-2
  
  optimizer:
    type: "adamw"
    betas: [0.9, 0.999]
    eps: 1e-8
  
  scheduler:
    type: "cosine"
    warmup_epochs: 10
    min_lr: 1e-6
  
  mixed_precision: true
  gradient_clip: 1.0

Data Configuration

Configure data loading and processing:

from jepa.config import DataConfig

config = DataConfig(
    dataset_type="csv",
    dataset_path="data/train.csv",
    batch_size=64,
    num_workers=4
)

Or via YAML:

data:
  dataset_type: "csv"
  dataset_path: "data/train.csv"
  data_columns: ["feature1", "feature2", "feature3"]
  temporal_offset: 1
  
  batch_size: 64
  num_workers: 4
  pin_memory: true
  shuffle: true
  
  transforms:
    normalize: true
    mask_ratio: 0.15
    augmentation: true

Logging Configuration

Configure logging backends:

from jepa.config import LoggingConfig

config = LoggingConfig(
    backends=["wandb", "tensorboard"],
    level="INFO",
    log_frequency=10
)

Or via YAML:

logging:
  level: "INFO"
  backends: ["wandb", "tensorboard", "console"]
  
  wandb:
    project: "jepa-experiments"
    entity: "my-team"
    tags: ["baseline"]
  
  tensorboard:
    log_dir: "logs/tensorboard"
    log_images: true
  
  console:
    level: "INFO"
    colored: true

Experiment Configuration

Complete experiment configuration:

from jepa.config import ExperimentConfig

config = ExperimentConfig(
    name="jepa_baseline",
    model=model_config,
    training=training_config,
    data=data_config,
    logging=logging_config
)

Configuration Loading

Load from File

Load configuration from YAML files:

from jepa.config import load_config

# Load complete configuration
config = load_config("config/experiment.yaml")

# Load specific section
model_config = load_config("config/model.yaml", section="model")

Default Configurations

Get default configurations for different domains:

from jepa.config import get_default_config

# Get default configuration for vision tasks
vision_config = get_default_config("vision")

# Get default configuration for NLP tasks
nlp_config = get_default_config("nlp")

# Get default configuration for time series
timeseries_config = get_default_config("timeseries")

Configuration Merging

Merge multiple configurations:

from jepa.config import merge_configs

# Load base and override configurations
base_config = load_config("config/base.yaml")
override_config = load_config("config/overrides.yaml")

# Merge configurations (override takes precedence)
final_config = merge_configs(base_config, override_config)

Available Configuration Templates

Default Configuration

Complete default configuration for general use:

Vision Configuration

Optimized for computer vision tasks:

NLP Configuration

Optimized for natural language processing:

Time Series Configuration

Optimized for time series forecasting:

Configuration Validation

Validation Functions

Validate configuration files:

from jepa.config.validation import validate_config

# Validate complete configuration
is_valid, errors = validate_config(config)

if not is_valid:
    print("Configuration errors:")
    for error in errors:
        print(f"  - {error}")

Schema Validation

Use schemas for strict validation:

from jepa.config.validation import ConfigSchema

schema = ConfigSchema({
    'model': {
        'encoder_dim': {'type': int, 'min': 1},
        'encoder_layers': {'type': int, 'min': 1, 'max': 50}
    },
    'training': {
        'batch_size': {'type': int, 'min': 1},
        'learning_rate': {'type': float, 'min': 0.0, 'max': 1.0}
    }
})

# Validate against schema
schema.validate(config)

Environment-Specific Configurations

Development Configuration

# dev_config.yaml
model:
  encoder_dim: 128      # Smaller for faster iteration
  encoder_layers: 2
  
training:
  epochs: 5             # Quick testing
  batch_size: 16
  
logging:
  backends: ["console"] # Simple logging
  level: "DEBUG"

Production Configuration

# prod_config.yaml
model:
  encoder_dim: 1024     # Large model
  encoder_layers: 24
  
training:
  epochs: 1000          # Long training
  batch_size: 128
  mixed_precision: true
  
logging:
  backends: ["wandb", "tensorboard"]
  wandb:
    project: "production-runs"

Testing Configuration

# test_config.yaml
model:
  encoder_dim: 64       # Minimal for testing
  encoder_layers: 1
  
training:
  epochs: 1
  batch_size: 4
  
data:
  dataset_size: 100     # Small test dataset

Configuration Utilities

Environment Variable Substitution

Use environment variables in configurations:

logging:
  wandb:
    project: "${WANDB_PROJECT}"
    api_key: "${WANDB_API_KEY}"
    
data:
  dataset_path: "${DATA_PATH}/train"
from jepa.config.utils import substitute_env_vars
import os

os.environ['WANDB_PROJECT'] = 'my-project'
os.environ['DATA_PATH'] = '/path/to/data'

config = load_config("config.yaml")
config = substitute_env_vars(config)

Configuration Templates

Generate configuration templates:

from jepa.config.utils import create_config_template

# Create template for vision task
template = create_config_template(
    task="vision",
    model_size="large",
    training_type="self_supervised"
)

# Save template
with open("my_config.yaml", "w") as f:
    yaml.dump(template, f)

CLI Configuration

Command Line Overrides

Override configuration values from the command line:

# Override single values
python -m jepa.cli train \
  --config config/base.yaml \
  --learning-rate 0.01 \
  --batch-size 128

# Override nested values
python -m jepa.cli train \
  --config config/base.yaml \
  --model.encoder_dim 1024 \
  --training.optimizer.type adamw

Configuration Generation

# Generate default configuration
python -m jepa.cli config --create-default my_config.yaml

# Generate configuration for specific task
python -m jepa.cli config --create-template vision my_vision_config.yaml

# Validate configuration
python -m jepa.cli config --validate my_config.yaml

# Show current configuration
python -m jepa.cli config --show my_config.yaml

Best Practices

Configuration Organization

  1. Hierarchical Structure: Organize configs by domain (model, training, data)

  2. Environment Separation: Separate configs for dev, test, prod

  3. Version Control: Track configuration changes with git

  4. Documentation: Comment configuration options

Configuration Management

# Good: Use descriptive names
vision_large_config.yaml
nlp_bert_base_config.yaml
timeseries_lstm_config.yaml

# Good: Environment-specific configs
configs/
  base/
    model.yaml
    training.yaml
  environments/
    dev.yaml
    prod.yaml
  experiments/
    exp_001.yaml
    exp_002.yaml

Parameter Sweeps

from jepa.config import ConfigSweep

# Define parameter sweep
sweep = ConfigSweep({
    'model.encoder_dim': [256, 512, 768],
    'training.learning_rate': [1e-4, 1e-3, 1e-2],
    'training.batch_size': [32, 64, 128]
})

# Generate all combinations
for config in sweep.generate():
    train_model(config)

Examples

Basic Configuration Usage

from jepa.config import load_config
from jepa.models import JEPA
from jepa.models.encoder import Encoder
from jepa.models.predictor import Predictor
from jepa.trainer import create_trainer

config = load_config("config/my_experiment.yaml")

encoder = Encoder(hidden_dim=config.model.encoder_dim)
predictor = Predictor(hidden_dim=config.model.encoder_dim)
model = JEPA(encoder=encoder, predictor=predictor)

trainer = create_trainer(
    model,
    learning_rate=config.training.learning_rate,
    weight_decay=config.training.weight_decay,
)
trainer.train(train_loader, num_epochs=config.training.num_epochs)  # assumes `train_loader`

Dynamic Configuration

from jepa.config import ExperimentConfig, ModelConfig, TrainingConfig
from jepa.models import JEPA
from jepa.models.encoder import Encoder
from jepa.models.predictor import Predictor
from jepa.trainer import create_trainer

# Create configuration programmatically
config = ExperimentConfig(
    name="dynamic_experiment",
    model=ModelConfig(
        encoder_type="transformer",
        encoder_dim=768
    ),
    training=TrainingConfig(
        epochs=100,
        batch_size=64
    )
)

# Modify configuration
config.training.learning_rate = 1e-4
config.model.encoder_layers = 12

# Use configuration
encoder = Encoder(hidden_dim=config.model.encoder_dim)
predictor = Predictor(hidden_dim=config.model.encoder_dim)
model = JEPA(encoder=encoder, predictor=predictor)

trainer = create_trainer(model, learning_rate=config.training.learning_rate)

Configuration Inheritance

# base_config.yaml
model:
  encoder_type: "transformer"
  encoder_dim: 768
  
training:
  epochs: 100
  batch_size: 64

# experiment_config.yaml
base_config: "base_config.yaml"

# Override specific values
model:
  encoder_layers: 24  # Larger model
  
training:
  learning_rate: 1e-4  # Specific LR

For more examples and detailed usage, see the Configuration Guide and Examples.