Configuration¶
Overview¶
Configuration is defined by config.py and values are stored in YAML files within the src/samudra/configs/
directory. Configuration files can include other configuration files using the !include directive.
Each configuration file is associated with a Pydantic model — you can generate JSON schemas
for them with uv run src/samudra/config_schema.py (which is run automatically in pre-commit).
To associate a configuration file with a Pydantic model, generate the JSON schema (if it doesn't
already exist) and then add this line to the top of the config file:
This is what the config_schema.py script uses to determine which model to validate against,
and also enables autocomplete/type checking in VS Code via the YAML extension.
Command Line Configuration¶
The train and eval modules accept the configuration file as a positional argument.
You can override arbitrary keys on the command line — see --help for details. When overriding
an object (as opposed to a single scalar value) via the command line, you can either supply JSON
like --data '{"key": "value"}' or a YAML file with a leading @ symbol: --data @src/samudra/configs/data/file.yaml.
Training runs create a YAML file in the checkpoint directory with the final configuration used which
you can use to reproduce the run by passing to train e.g. uv run -m samudra.train path/to/config.yaml.
Data locations¶
Each data source names three stores — data_location, data_means_location, and
data_stds_location. Every one of them is a location, which can be written two ways:
- A relative string (e.g.
OM4.zarr). It is resolved againstexperiment.data_root, so the same data config works against a local copy or a bucket just by changing the root:--experiment.data_root /scratch/om4or a structured root in the config. - A structured, absolute location with an explicit
type. This ignoresdata_rootand points at exactly one place. Two types are supported:
# Read a Zarr store directly from S3 (or an S3-compatible endpoint like OSN).
data_location:
type: s3
endpoint_url: "https://nyu1.osn.mghpcc.org" # omit for AWS S3
anon: true # read a public bucket without credentials
bucket: m2lines-pubs
path: Samudra/v2026-07/om4_twodeg/OM4.zarr
# Read a Zarr/NetCDF store from an absolute local path.
data_location:
type: local
path: /scratch/om4/OM4.zarr
For a signed request (anon: false, the default) credentials come from the environment
(the usual AWS_* variables); the config never carries secrets. Set anon: true to read a
public bucket — such as the open datasets on OSN — with no credentials at all, which also
avoids a stale AWS_ACCESS_KEY_ID being rejected by a non-AWS endpoint.
src/samudra/configs/data/om4_demo.yaml is a ready-made source that streams the public 2°
OM4 dataset from OSN over S3 with no local download and no credentials. Because its
locations are absolute, experiment.data_root is unused and can be omitted entirely. The
same --data flag works across train, eval, and viz — for viz it names the ground-truth
source (groundtruth_location defaults to the source's data_location):
samudra train samudra_om4/train.yaml --data @data/om4_demo.yaml
samudra eval samudra_om4/eval.yaml --data @data/om4_demo.yaml
samudra viz samudra_om4/viz.yaml --data @data/om4_demo.yaml
API Reference¶
samudra.config
¶
JulianDate(value)
¶
Represents a Julian date as a cftime.datetime at noon on the relevant day.
This is the format the OM4 data uses, so we match that here. TODO(jder): probably worth asserting the date format when opening the data.
Source code in src/samudra/config.py
PerceiverConfig
¶
Bases: BaseConfig
A standard config interface to various perceiver implementations.
Builds either a regular Perceiver (for the encoder, via build) or a
PerceiverIO (for the decoder, via build_io). Both respect the shared
implementation setting from SamudraMultiConfig.perceiver_implementation.
build(in_channels, out_channels, max_patch_size, implementation)
¶
Build a regular Perceiver (used by the encoder).
Source code in src/samudra/config.py
build_io(in_channels, queries_dim, out_channels, implementation)
¶
Build a PerceiverIO (used by the decoder).
Source code in src/samudra/config.py
DecoderConfig
¶
Bases: BaseConfig
A PerceiverIO-based decoder configuration.
Uses PerceiverIO (with an explicit query mechanism) rather than a regular
Perceiver. Output pixel positions are encoded as queries, so the output
size is determined by the query count — not by num_latents.
When window_patches is set, the decoder tiles the output grid into
spatial blocks of that many patches per side. Each block's PerceiverIO
call receives only the overlapping latent tokens plus context_patches
extra rings of neighbors, keeping cost bounded even when the latent grid
is large (i.e. fine patch_extent).
samudra.config_base
¶
BaseConfig
¶
Bases: BaseModel
Base class for all configs.
TopLevelConfig(*args, **kwargs)
¶
Bases: BaseSettings
Base class for top-level configs (ie tasks like train or eval).
Source code in src/samudra/config_base.py
from_yaml_and_cli(args_to_parse=None)
classmethod
¶
Load config from YAML & CLI with validation.
Source code in src/samudra/config_base.py
IncludeYamlCliSettingsSource(*args, **kwargs)
¶
register_include_constructor()
¶
Set up yaml.safe_load to include other yaml files via !include.
Source code in src/samudra/config_base.py
resolve_config_path(config)
¶
Resolve a config argument to a file on disk.
A real filesystem path wins, so a checkout behaves exactly as before. If it
doesn't exist, fall back to a preset bundled in the installed package (e.g.
samudra_om4/train.yaml), so samudra train samudra_om4/train.yaml
works with no checkout. The bundled configs install as real co-located
files, so their relative !includes resolve unchanged.