Source: src/mcss/mechanism_pilot/rgbd_pretrained_carrier.py · Plain text

src/mcss/mechanism_pilot/rgbd_pretrained_carrier.py

"""V31: the V17 L carrier with frozen DINOv2 ViT-S/14 (reg4) patch features through a zero bypass.

PLAN_BEFORE_V31.md fixed V31 before any V31 training. The V17 L carrier (width 32, 32^3, eight
learned channels per view from two 3x3 convolutions) gains PROJECTED = 24 channels per view: the
frozen DINOv2 patch tokens of the same RGB frame (ImageNet normalization, bilinear resize of the
128x160 frame to 252x322, i.e. 18x23 patches of 384 dimensions) through a learned 384->24
projection, bilinearly resized back to the frame. The lifted mean and variance of those 24
channels (48 statistics per voxel candidate) enter the fuse pre-activation through a bias-free
48->64 map that starts at zero, so a new carrier computes exactly what the V17 L draw of the same
seed computes. The projection comes from its own seeded generator; initialization, scene order,
rays and extra views keep V17 L's random streams. The backbone is never trained, never part of
the state_dict, and identified by the sha256 of its weights and code; its tokens depend only on
the frame and are cached per process and device.
"""

from __future__ import annotations

import hashlib
import math
import warnings
from dataclasses import asdict
from pathlib import Path

import torch
import torch.nn.functional as functional
from torch import nn

from mcss.dynamic.carrier import _CarrierComputation
from mcss.dynamic.config import CarrierConfig
from mcss.dynamic.lifting import lift_cached_observations
from mcss.dynamic.types import WriteTrace, hash_value
from mcss.mechanism_pilot import rgbd_evidence_carrier as v5
from mcss.mechanism_pilot import rgbd_long_train_carrier as v17
from mcss.mechanism_pilot import rgbd_resolution_carrier as v8
from mcss.mechanism_pilot.small_training import sha

EXPERIMENT = "EXP-3D-RGBD-PRETRAINED-FEATURES-V31"
SCHEMA = "mcss.rgbd_pretrained_carrier.v31"
MODELS = Path("/home/xmum26_zonghan/zonghan_o_mirror/_models/dinov2")
BACKBONE = {
    "name": "dinov2_vits14_reg",
    "code_commit": "7764ea0f912e53c92e82eb78a2a1631e92725fc8",
    "code_zip_sha256": "04276715cddb29d45d05bff3a6fc132224dc27749b279ac98ad2ce4620e20d48",
    "code_tree_sha256": "117c2d9278ba282500e5d3924dae634672bd19cf892f3f8f4800fbd80b7b6af4",
    "weights": "dinov2_vits14_reg4_pretrain.pth",
    "weights_sha256": "f433177089a681826f849f194ece3bb48f4d63fb38d32fc837e3dc7a4e5641fb",
    "input_size": [252, 322],
    "patch_grid": [18, 23],
    "embed_dim": 384,
    "mean": [0.485, 0.456, 0.406],
    "std": [0.229, 0.224, 0.225],
    "output": "x_norm_patchtokens",
}
PROJECTED = 24
PROJECTION_SEED_OFFSET = 31
EXTRA_SEED_OFFSET = v17.EXTRA_SEED_OFFSET
VARIANT_SPECS = v17.VARIANT_SPECS
VARIANTS = v17.VARIANTS
build_state = v17.build_state
carrier_config = v17.carrier_config
extra_count = v17.extra_count
parameter_hash = v17.parameter_hash
scene_data = v17.scene_data
train_records = v17.train_records
training_loss = v17.training_loss
with_extra_views = v17.with_extra_views
_BACKBONES = {}
_TOKENS = {}

__all__ = [
    "BACKBONE",
    "EXPERIMENT",
    "EXTRA_SEED_OFFSET",
    "PROJECTED",
    "VARIANTS",
    "VARIANT_SPECS",
    "PretrainedFeatureCarrier",
    "backbone_files_present",
    "build_state",
    "carrier_config",
    "code_tree_sha256",
    "extra_count",
    "load_backbone",
    "load_checkpoint",
    "make_carrier",
    "parameter_hash",
    "patch_tokens",
    "save_checkpoint",
    "scene_data",
    "train_records",
    "training_loss",
    "with_extra_views",
]


def repository():
    return MODELS / f"dinov2-{BACKBONE['code_commit']}"


def backbone_files_present():
    return (MODELS / BACKBONE["weights"]).is_file() and (repository() / "hubconf.py").is_file()


def code_tree_sha256(repo):
    """sha256 over (relative path, file sha256) of hubconf.py and every dinov2/**/*.py."""
    repo = Path(repo)
    digest = hashlib.sha256()
    for path in sorted([repo / "hubconf.py", *repo.glob("dinov2/**/*.py")]):
        name = path.relative_to(repo).as_posix().encode()
        digest.update(name + b"\0" + sha(path).encode() + b"\n")
    return digest.hexdigest()


def load_backbone(device):
    """The frozen DINOv2 backbone on one device, loaded offline after every hash check."""
    key = str(torch.device(device))
    if key not in _BACKBONES:
        weights, repo = MODELS / BACKBONE["weights"], repository()
        if sha(weights) != BACKBONE["weights_sha256"]:
            raise PermissionError("DINOv2 weights differ from the registered file")
        if sha(MODELS / f"dinov2_{BACKBONE['code_commit']}.zip") != BACKBONE["code_zip_sha256"]:
            raise PermissionError("DINOv2 code archive differs from the registered snapshot")
        if code_tree_sha256(repo) != BACKBONE["code_tree_sha256"]:
            raise PermissionError("DINOv2 code differs from the registered snapshot")
        with warnings.catch_warnings():
            warnings.simplefilter("ignore", UserWarning)  # xFormers is optional
            model = torch.hub.load(str(repo), BACKBONE["name"], source="local", pretrained=False)
        model.load_state_dict(torch.load(weights, map_location="cpu", weights_only=True))
        model.requires_grad_(False).eval()
        _BACKBONES[key] = model.to(device)
    return _BACKBONES[key]


def patch_tokens(rgb):
    """Frozen [384, 18, 23] patch tokens of one RGB frame in [0, 1], cached per device and frame."""
    if rgb.ndim != 3 or rgb.shape[0] != 3:
        raise ValueError("One RGB frame [3,H,W] required")
    frame = rgb.detach().to(device="cpu", dtype=torch.float32).contiguous()
    key = (str(rgb.device), tuple(rgb.shape), hashlib.sha256(frame.numpy().tobytes()).hexdigest())
    tokens = _TOKENS.get(key)
    if tokens is None:
        model = load_backbone(rgb.device)
        mean = torch.tensor(BACKBONE["mean"], device=rgb.device).view(3, 1, 1)
        std = torch.tensor(BACKBONE["std"], device=rgb.device).view(3, 1, 1)
        image = ((rgb.detach().to(torch.float32) - mean) / std).unsqueeze(0)
        image = functional.interpolate(
            image, size=tuple(BACKBONE["input_size"]), mode="bilinear", align_corners=False
        )
        with torch.no_grad():
            patches = model.forward_features(image)[BACKBONE["output"]][0]
        tokens = patches.transpose(0, 1).reshape(BACKBONE["embed_dim"], *BACKBONE["patch_grid"])
        tokens = tokens.contiguous()
        _TOKENS[key] = tokens
    return tokens


class PretrainedFeatureCarrier(v8.ResolutionRGBDCarrier):
    """V17 L carrier plus frozen DINOv2 features through a zero-initialized fuse bypass."""

    def __init__(self, config: CarrierConfig) -> None:
        super().__init__(config)
        # Created without consuming the RNG, so the shared parameters are the V17 L draw.
        self.feature_projection = nn.Parameter(torch.zeros(PROJECTED, BACKBONE["embed_dim"]))
        self.feature_projection_bias = nn.Parameter(torch.zeros(PROJECTED))
        self.pretrained_weight = nn.Parameter(torch.zeros(config.expansion_dim, 2 * PROJECTED))

    def encode(self, observation):
        """The eight learned channels followed by the 24 projected backbone channels."""
        learned = super().encode(observation)
        tokens = patch_tokens(observation.rgb).to(dtype=learned.dtype)
        projected = torch.einsum("kc,chw->khw", self.feature_projection, tokens)
        projected = projected + self.feature_projection_bias.view(-1, 1, 1)
        projected = functional.interpolate(
            projected.unsqueeze(0),
            size=tuple(learned.shape[-2:]),
            mode="bilinear",
            align_corners=False,
        ).squeeze(0)
        return torch.cat((learned, projected), 0)

    def _compute(self, cache, fast):
        self._validate_fast(cache, fast)
        if self._pending_depth is None:
            raise PermissionError("RGB-D carrier states are built only through build_state")
        frame_ids, depths = self._pending_depth
        if tuple(entry.observation.frame_id for entry in cache.entries) != frame_ids:
            raise ValueError("Measured depth maps must align with the cached context views")
        width = self.config.feature_dim
        total = width + PROJECTED
        lifted = lift_cached_observations(
            cache,
            self._candidate_points,
            self._candidate_normalized_xyz,
            feature_dim=total,
        )
        full = lifted.observed_feature_statistics.to(dtype=self.fuse_up.weight.dtype)
        mean, variance, rest = full[:, :total], full[:, total : 2 * total], full[:, 2 * total :]
        # The V17 L statistics of the eight learned channels, in V17 L's order.
        statistics = torch.cat((mean[:, :width], variance[:, :width], rest), -1)
        pretrained = torch.cat((mean[:, width:], variance[:, width:]), -1)
        support_weights = lifted.support_weights.to(dtype=statistics.dtype)
        fuse_activation = functional.gelu(
            self.fuse_up(statistics) + functional.linear(pretrained, self.pretrained_weight)
        )
        fused_hidden = functional.linear(
            fuse_activation,
            self.fuse_down.weight + fast.delta_fuse,
            self.fuse_down.bias,
        )
        fused_hidden = fused_hidden * support_weights.unsqueeze(-1)
        grid = torch.tensor(
            tuple(self.config.grid_size), device=self._bounds.device, dtype=self._bounds.dtype
        )
        edge = ((self._bounds[:, 1] - self._bounds[:, 0]) / grid).mean()
        measured = v5.depth_statistics(
            [entry.observation for entry in cache.entries],
            depths,
            self._candidate_points,
            self.depth_log_sigma,
            edge.to(device=self._candidate_points.device, dtype=torch.float32),
        ).to(dtype=statistics.dtype)
        fused_hidden = fused_hidden + functional.linear(measured, self.depth_weight)
        refined = self.refinement(self._scatter_candidates(fused_hidden))
        complete_input = self._gather_candidates(refined)
        complete_activation = functional.gelu(self.complete_up(complete_input))
        trace = WriteTrace(
            episode_id=cache.episode_id,
            cache_revision=cache.revision,
            fast_step=fast.step,
            fuse_activation=fuse_activation,
            complete_activation=complete_activation,
            observed_feature_statistics=statistics,
            support_weights=support_weights,
            candidate_ids=self._candidate_ids.clone(),
            branch_id=fast.branch_id,
            source_state_id=fast.state_id,
        )
        return _CarrierComputation(trace, refined)


def make_carrier(variant, seed, device, near=None, far=None):
    """The V17 L draw of every shared parameter; the projection from its own seeded generator."""
    del near, far
    torch.manual_seed(seed)
    if torch.cuda.is_available():
        torch.cuda.manual_seed_all(seed)
    carrier = PretrainedFeatureCarrier(carrier_config(variant))
    generator = torch.Generator().manual_seed(seed + PROJECTION_SEED_OFFSET)
    bound = 1.0 / math.sqrt(BACKBONE["embed_dim"])
    shape = carrier.feature_projection.shape
    with torch.no_grad():
        carrier.feature_projection.copy_((torch.rand(shape, generator=generator) * 2 - 1) * bound)
    return carrier.to(device)


def save_checkpoint(path, carrier, *, variant, seed, step, lock_sha256):
    payload = {
        "schema": SCHEMA,
        "config": asdict(carrier.config),
        "carrier": {k: v.detach().cpu() for k, v in carrier.state_dict().items()},
        "depth_bypass": True,
        "backbone": BACKBONE,
        "projected": PROJECTED,
        "variant": variant,
        "seed": seed,
        "step": step,
        "lock_sha256": lock_sha256,
        "test_time_input": "RGB+DEPTH+CAMERA",
        "writer_trained": False,
    }
    path = Path(path)
    if path.exists():
        raise FileExistsError(path)
    torch.save(payload, path)
    restored, _ = load_checkpoint(path, "cpu")
    if hash_value(restored.state_dict()) != hash_value(payload["carrier"]):
        raise RuntimeError("Checkpoint restore mismatch")
    return sha(path)


def load_checkpoint(path, device):
    payload = torch.load(path, map_location=device, weights_only=True)
    if payload.get("schema") != SCHEMA or payload.get("writer_trained"):
        raise PermissionError("V31 pretrained-feature carrier schema required")
    if payload.get("backbone") != BACKBONE or payload.get("projected") != PROJECTED:
        raise PermissionError("The checkpoint was trained with another backbone or projection")
    config = CarrierConfig(**payload["config"])
    v17._check_config(config)
    model = PretrainedFeatureCarrier(config).to(device)
    model.load_state_dict(payload["carrier"], strict=True)
    return model, payload