Attribute Decoder
The attribute decoder reads dataset-level metadata for the decode service: the names of the columns, their per-column statistics, and the set of values observed for label columns. This lets the rest of the run size its tensors and resolve normalization parameters without scanning the data itself.
Usage
Selected under services.decode.attrs.
services:
decode:
attrs:
name: standard
kwargs: {}
Variants
Standard: reads the standard attribute schema written by the pipeline.
Registering a new attribute decoder
An attribute decoder is a subclass of AttributeDecoder that declares a name
and version and implements the abstract extraction methods below. Each receives
attrs (a callable yielding the per-file attributes) and global_attrs (the
dataset-wide attributes) as keyword arguments. Register it with
AttributeDecoderFactory.
build(self) -> NoneOne-time setup.
_extract_columns(self, role, *, attrs, global_attrs) -> list[str] | NoneThe column names for a role.
_extract_offsets(self, role, *, attrs, global_attrs) -> ArrayI | NoneThe per-column offsets for a role.
_extract_keys(self, split, *, attrs, global_attrs) -> ArrayI | NoneThe record keys belonging to a split.
_extract_stats(self, split, role, *, attrs, global_attrs) -> StatisticServiceThe statistics for a split and role.
_extract_count_by_weight_group(self, *, attrs, global_attrs) -> dict[str, int]The record count per weight group.
from typing import Any, ClassVar
from collections.abc import Callable, Iterator
from icegraph.statistics import StatisticService
from icegraph.typing.common import ArrayI
from icegraph.common.record import Attributes, GlobalAttributes
from icegraph.engine.services.decode.attrs import AttributeDecoder, AttributeDecoderFactory
from .config import MyConfig
Attrs = Callable[[], Iterator[Attributes]]
class MyAttributeDecoder(AttributeDecoder[MyConfig]):
name: ClassVar[str] = "my-attrs"
version: ClassVar[int] = 1
@classmethod
def validate_config(cls, config: dict[str, Any]) -> MyConfig:
return MyConfig(**config)
def build(self) -> None:
...
def _extract_columns(self, role: str, *, attrs: Attrs, global_attrs: GlobalAttributes) -> list[str] | None:
...
def _extract_offsets(self, role: str, *, attrs: Attrs, global_attrs: GlobalAttributes) -> ArrayI | None:
...
def _extract_keys(self, split: int, *, attrs: Attrs, global_attrs: GlobalAttributes) -> ArrayI | None:
...
def _extract_stats(self, split: int, role: str, *, attrs: Attrs, global_attrs: GlobalAttributes) -> StatisticService:
...
def _extract_count_by_weight_group(self, *, attrs: Attrs, global_attrs: GlobalAttributes) -> dict[str, int]:
...
AttributeDecoderFactory.register(MyAttributeDecoder)