{ "cells": [ { "cell_type": "markdown", "id": "b4265954", "metadata": {}, "source": [ "# APC MNIST Training Example\n", "\n", "This notebook is a compact, notebook-first APC training walkthrough for MNIST.\n", "\n", "Design choices are intentionally fixed to keep code short:\n", "\n", "- Binomial data distribution\n", "- Conv-PC encoder\n", "- NN decoder\n", "- AdamW optimizer\n", "- MultiStepLR scheduler (milestones at 66% and 90%)\n", "- Training progress printed only at 10%, 20%, ..., 100%\n", "- Inline metrics and reconstructions only (no checkpoint/JSON/image file outputs)\n" ] }, { "cell_type": "markdown", "id": "9a85ca9a", "metadata": {}, "source": [ "## Imports\n", "\n", "We keep imports explicit so you can quickly see which pieces handle modeling, training, and visualization.\n", "\n", "- Standard library: lightweight config and serialization helpers\n", "- PyTorch + Lightning Fabric: tensor ops and runtime orchestration\n", "- SPFlow APC modules: encoder/decoder/model/loss tooling\n", "- Torchvision + plotting stack: data loading and inline analysis\n" ] }, { "cell_type": "code", "id": "3b3ba0b6", "metadata": { "execution": { "iopub.execute_input": "2026-03-04T14:46:20.912698Z", "iopub.status.busy": "2026-03-04T14:46:20.912460Z", "iopub.status.idle": "2026-03-04T14:46:22.455980Z", "shell.execute_reply": "2026-03-04T14:46:22.455479Z" }, "ExecuteTime": { "end_time": "2026-03-04T15:04:07.772178Z", "start_time": "2026-03-04T15:04:07.747505Z" } }, "source": [ "from __future__ import annotations\n", "\n", "# Standard-library helpers for config handling and lightweight reporting.\n", "import json\n", "import math\n", "from dataclasses import asdict, dataclass\n", "from pathlib import Path\n", "\n", "# Core scientific stack used throughout the notebook.\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import torch\n", "from torch import nn\n", "from torch.optim import AdamW, Optimizer\n", "from torch.optim.lr_scheduler import MultiStepLR\n", "from torch.utils.data import DataLoader, random_split\n", "\n", "# APC/SPFlow model components.\n", "from spflow.modules.leaves import Binomial, Normal\n", "from spflow.modules.leaves.leaf import LeafModule\n", "from spflow.zoo.apc.config import ApcConfig, ApcLossWeights\n", "from spflow.zoo.apc.decoders import NeuralDecoder2D\n", "from spflow.zoo.apc.encoders.convpc_joint_encoder import ConvPcJointEncoder\n", "from spflow.zoo.apc.model import AutoencodingPC\n", "from spflow.zoo.apc.train import evaluate_apc\n", "\n", "# Runtime orchestration and dataset transforms/utilities.\n", "import lightning as L\n", "from torchvision import datasets, transforms\n", "from torchvision.utils import make_grid\n" ], "outputs": [], "execution_count": 35 }, { "cell_type": "markdown", "id": "e5ccebb3", "metadata": {}, "source": [ "## Defaults\n", "\n", "A single dataclass holds all fixed tutorial settings so runs stay reproducible and easy to modify.\n", "\n", "These values prioritize a fast, stable guide run over full hyperparameter tuning.\n" ] }, { "cell_type": "code", "id": "a4586299", "metadata": { "execution": { "iopub.execute_input": "2026-03-04T14:46:22.457243Z", "iopub.status.busy": "2026-03-04T14:46:22.457135Z", "iopub.status.idle": "2026-03-04T14:46:22.461588Z", "shell.execute_reply": "2026-03-04T14:46:22.461193Z" }, "ExecuteTime": { "end_time": "2026-03-04T15:04:07.816927Z", "start_time": "2026-03-04T15:04:07.787446Z" } }, "source": [ "@dataclass\n", "class Config:\n", " \"\"\"Fixed configuration for this simplified APC MNIST tutorial notebook.\"\"\"\n", "\n", " # Reproducibility and dataset location.\n", " seed: int = 0\n", " data_dir: Path = Path(\"./data/mnist\")\n", " download: bool = True\n", "\n", " # Input representation used in this notebook.\n", " dist_data: str = \"binomial\"\n", " image_size: int = 32\n", " n_bits: int = 8\n", "\n", " # Runtime execution settings.\n", " device: str = \"auto\"\n", " precision: str = \"bf16-mixed\"\n", " num_workers: int = 0\n", "\n", " # Training budget and dataset caps for notebook speed.\n", " iters: int = 1000\n", " batch_size: int = 128\n", " val_size: int = 10_000\n", " max_train_samples: int | None = 60_000\n", " max_val_samples: int | None = 2_000\n", " max_test_samples: int | None = 2_000\n", "\n", " # Optimizer and scheduler hyperparameters.\n", " lr_encoder: float = 1e-1\n", " lr_decoder: float = 1e-3\n", " weight_decay: float = 0.0\n", " lr_gamma: float = 0.1\n", "\n", " # Encoder/decoder architecture controls.\n", " latent_dim: int = 64\n", " conv_channels: int = 64\n", " conv_depth: int = 3\n", " conv_latent_depth: int = 0\n", " conv_use_sum_conv: bool = False\n", " num_repetitions: int = 1\n", "\n", " nn_hidden: int = 64\n", " nn_res_hidden: int = 16\n", " nn_res_layers: int = 2\n", " nn_scales: int = 2\n", " nn_bn: bool = True\n", " nn_out_activation: str = \"identity\"\n", "\n", " # APC objective weighting and sampling setup.\n", " rec_loss: str = \"mse\"\n", " sample_tau: float = 1.0\n", " w_rec: float = 1.0\n", " w_kld: float = 1.0\n", " w_nll: float = 1.0\n", "\n", " grad_clip_norm: float | None = None\n", " warmup_pct: float = 2.0\n", " num_vis: int = 8\n", "\n", "\n", "cfg = Config()\n", "cfg\n" ], "outputs": [ { "data": { "text/plain": [ "Config(seed=0, data_dir=PosixPath('data/mnist'), download=True, dist_data='binomial', image_size=32, n_bits=8, device='auto', precision='bf16-mixed', num_workers=0, iters=1000, batch_size=128, val_size=10000, max_train_samples=60000, max_val_samples=2000, max_test_samples=2000, lr_encoder=0.1, lr_decoder=0.001, weight_decay=0.0, lr_gamma=0.1, latent_dim=64, conv_channels=64, conv_depth=3, conv_latent_depth=0, conv_use_sum_conv=False, num_repetitions=1, nn_hidden=64, nn_res_hidden=16, nn_res_layers=2, nn_scales=2, nn_bn=True, nn_out_activation='identity', rec_loss='mse', sample_tau=1.0, w_rec=1.0, w_kld=1.0, w_nll=1.0, grad_clip_norm=None, warmup_pct=2.0, num_vis=8)" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 36 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Configuration Notes\n", "\n", "When you start experimenting, change one group of settings at a time:\n", "\n", "- `iters` / `batch_size`: runtime and optimization smoothness\n", "- `latent_dim` + conv settings: encoder capacity\n", "- `w_rec`, `w_kld`, `w_nll`: reconstruction vs regularization trade-off\n", "\n", "Small, isolated changes make the loss table and reconstructions easier to interpret.\n" ], "id": "8ca06aaa" }, { "cell_type": "markdown", "id": "e75595f1", "metadata": {}, "source": [ "## Minimal Helpers (Data, Model, Train)\n", "\n", "This helper block keeps the rest of the notebook compact by grouping the end-to-end APC workflow:\n", "\n", "1. Build deterministic dataset splits and loaders\n", "2. Construct the Conv-PC encoder + neural decoder APC model\n", "3. Configure optimizer and learning-rate schedule\n", "4. Train for a fixed iteration budget with periodic validation\n", "5. Build a reconstruction grid for qualitative inspection\n" ] }, { "cell_type": "code", "id": "fd8e841b", "metadata": { "execution": { "iopub.execute_input": "2026-03-04T14:46:22.462662Z", "iopub.status.busy": "2026-03-04T14:46:22.462585Z", "iopub.status.idle": "2026-03-04T14:46:22.472605Z", "shell.execute_reply": "2026-03-04T14:46:22.472182Z" }, "ExecuteTime": { "end_time": "2026-03-04T15:04:07.833334Z", "start_time": "2026-03-04T15:04:07.818042Z" } }, "source": [ "def seed_everything(seed: int) -> None:\n", " \"\"\"Seed torch RNGs for reproducible notebook runs.\"\"\"\n", " torch.manual_seed(seed)\n", " if torch.cuda.is_available():\n", " torch.cuda.manual_seed_all(seed)\n", "\n", "\n", "def resolve_device(name: str) -> torch.device:\n", " \"\"\"Resolve the runtime device from `auto`, `cpu`, or `cuda`.\"\"\"\n", " if name == \"auto\":\n", " return torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", " return torch.device(name)\n", "\n", "\n", "def build_fabric(*, device: torch.device, precision: str) -> L.Fabric:\n", " \"\"\"Create a single-device Lightning Fabric runtime.\"\"\"\n", " accelerator = \"cuda\" if device.type == \"cuda\" else \"cpu\"\n", " return L.Fabric(accelerator=accelerator, devices=1, precision=precision)\n", "\n", "\n", "class QuantizeToNBits:\n", " \"\"\"Torchvision transform: map pixels to integer counts in [0, 2^n_bits-1].\"\"\"\n", "\n", " def __init__(self, n_bits: int) -> None:\n", " self.n_bits = int(n_bits)\n", "\n", " def __call__(self, x: torch.Tensor) -> torch.Tensor:\n", " max_value = float(2**self.n_bits - 1)\n", " return torch.floor(x * max_value)\n", "\n", "\n", "def _cap_subset(subset: torch.utils.data.Subset, max_samples: int | None) -> torch.utils.data.Subset:\n", " \"\"\"Optionally cap a subset length for quick notebook iterations.\"\"\"\n", " if max_samples is None or max_samples >= len(subset):\n", " return subset\n", " return torch.utils.data.Subset(subset.dataset, subset.indices[:max_samples])\n", "\n", "\n", "def build_loaders(cfg: Config) -> tuple[DataLoader, DataLoader, DataLoader]:\n", " \"\"\"Build train/val/test dataloaders for MNIST with fixed binomial preprocessing.\"\"\"\n", " # Keep preprocessing fixed so architecture/loss changes are easier to compare.\n", " if cfg.dist_data != \"binomial\":\n", " raise ValueError(f\"This notebook only supports dist_data='binomial', got {cfg.dist_data!r}\")\n", "\n", " tfm = transforms.Compose(\n", " [\n", " transforms.Resize((cfg.image_size, cfg.image_size)),\n", " transforms.ToTensor(),\n", " QuantizeToNBits(cfg.n_bits),\n", " ]\n", " )\n", "\n", " train_full = datasets.MNIST(root=str(cfg.data_dir), train=True, transform=tfm, download=cfg.download)\n", " test_full = datasets.MNIST(root=str(cfg.data_dir), train=False, transform=tfm, download=cfg.download)\n", "\n", " if cfg.val_size <= 0 or cfg.val_size >= len(train_full):\n", " raise ValueError(f\"val_size must be in [1, {len(train_full)-1}], got {cfg.val_size}\")\n", "\n", " # Use a seeded generator so train/validation split is deterministic.\n", " gen = torch.Generator().manual_seed(cfg.seed)\n", " train_subset, val_subset = random_split(\n", " train_full, [len(train_full) - cfg.val_size, cfg.val_size], generator=gen\n", " )\n", "\n", " train_subset = _cap_subset(train_subset, cfg.max_train_samples)\n", " val_subset = _cap_subset(val_subset, cfg.max_val_samples)\n", " test_subset = _cap_subset(torch.utils.data.Subset(test_full, list(range(len(test_full)))), cfg.max_test_samples)\n", "\n", " # Pin memory only when CUDA is used to speed up host-to-device copies.\n", " pin = torch.cuda.is_available() and resolve_device(cfg.device).type == \"cuda\"\n", " train_loader = DataLoader(train_subset, batch_size=cfg.batch_size, shuffle=True, num_workers=cfg.num_workers, pin_memory=pin)\n", " val_loader = DataLoader(val_subset, batch_size=cfg.batch_size, shuffle=False, num_workers=cfg.num_workers, pin_memory=pin)\n", " test_loader = DataLoader(test_subset, batch_size=cfg.batch_size, shuffle=False, num_workers=cfg.num_workers, pin_memory=pin)\n", " return train_loader, val_loader, test_loader\n", "\n", "\n", "def make_x_leaf_factory(n_bits: int):\n", " \"\"\"Create the observed-data leaf factory (Binomial).\"\"\"\n", " total_count_tensor = torch.tensor(float(2**n_bits - 1))\n", "\n", " def _factory(scope_indices: list[int], out_channels: int, num_repetitions: int) -> LeafModule:\n", " shape = (len(scope_indices), out_channels, num_repetitions)\n", " probs = 0.5 + (torch.rand(shape) - 0.5) * 0.2\n", " return Binomial(\n", " scope=scope_indices,\n", " out_channels=out_channels,\n", " num_repetitions=num_repetitions,\n", " total_count=total_count_tensor,\n", " probs=probs,\n", " )\n", "\n", " return _factory\n", "\n", "\n", "def make_z_leaf_factory():\n", " \"\"\"Create the latent leaf factory (Normal).\"\"\"\n", "\n", " def _factory(scope_indices: list[int], out_channels: int, num_repetitions: int) -> LeafModule:\n", " shape = (len(scope_indices), out_channels, num_repetitions)\n", " loc = torch.randn(shape)\n", " logvar = torch.randn(shape)\n", " scale = torch.exp(0.5 * logvar)\n", " return Normal(\n", " scope=scope_indices,\n", " out_channels=out_channels,\n", " num_repetitions=num_repetitions,\n", " loc=loc,\n", " scale=scale,\n", " )\n", "\n", " return _factory\n", "\n", "\n", "def build_model(cfg: Config) -> AutoencodingPC:\n", " \"\"\"Build a fixed Conv-PC encoder with an NN decoder.\"\"\"\n", " encoder = ConvPcJointEncoder(\n", " input_height=cfg.image_size,\n", " input_width=cfg.image_size,\n", " input_channels=1,\n", " latent_dim=cfg.latent_dim,\n", " channels=cfg.conv_channels,\n", " depth=cfg.conv_depth,\n", " kernel_size=2,\n", " num_repetitions=cfg.num_repetitions,\n", " use_sum_conv=cfg.conv_use_sum_conv,\n", " latent_depth=cfg.conv_latent_depth,\n", " architecture=\"reference\",\n", " perm_latents=False,\n", " x_leaf_factory=make_x_leaf_factory(cfg.n_bits),\n", " z_leaf_factory=make_z_leaf_factory(),\n", " )\n", "\n", " decoder = NeuralDecoder2D(\n", " latent_dim=cfg.latent_dim,\n", " output_shape=(1, cfg.image_size, cfg.image_size),\n", " num_hidden=cfg.nn_hidden,\n", " num_res_hidden=cfg.nn_res_hidden,\n", " num_res_layers=cfg.nn_res_layers,\n", " num_scales=cfg.nn_scales,\n", " bn=cfg.nn_bn,\n", " out_activation=cfg.nn_out_activation,\n", " )\n", "\n", " apc_config = ApcConfig(\n", " latent_dim=cfg.latent_dim,\n", " rec_loss=cfg.rec_loss,\n", " sample_tau=cfg.sample_tau,\n", " loss_weights=ApcLossWeights(rec=cfg.w_rec, kld=cfg.w_kld, nll=cfg.w_nll),\n", " )\n", " return AutoencodingPC(encoder=encoder, decoder=decoder, config=apc_config)\n", "\n", "\n", "def build_optimizer(cfg: Config, model: AutoencodingPC) -> Optimizer:\n", " \"\"\"Build AdamW with separate encoder/decoder learning rates.\"\"\"\n", " return AdamW(\n", " [\n", " {\"params\": model.encoder.parameters(), \"lr\": cfg.lr_encoder},\n", " {\"params\": model.decoder.parameters(), \"lr\": cfg.lr_decoder},\n", " ],\n", " weight_decay=cfg.weight_decay,\n", " )\n", "\n", "\n", "def build_scheduler(cfg: Config, optimizer: Optimizer) -> MultiStepLR:\n", " \"\"\"Build fixed MultiStepLR with milestones at 66% and 90% of training.\"\"\"\n", " milestones = sorted({max(1, int(0.66 * cfg.iters)), max(1, int(0.9 * cfg.iters))})\n", " return MultiStepLR(optimizer, milestones=milestones, gamma=cfg.lr_gamma)\n", "\n", "\n", "def _extract_x(batch: torch.Tensor | tuple | list) -> torch.Tensor:\n", " \"\"\"Extract the image tensor from `(x, y)` dataset batches.\"\"\"\n", " if isinstance(batch, torch.Tensor):\n", " return batch\n", " if isinstance(batch, (tuple, list)) and len(batch) > 0 and isinstance(batch[0], torch.Tensor):\n", " return batch[0]\n", " raise TypeError(f\"Unsupported batch type: {type(batch)}\")\n", "\n", "\n", "def collect_vis_batch(loader: DataLoader, device: torch.device, num_vis: int) -> torch.Tensor:\n", " \"\"\"Collect a small fixed test batch used for reconstruction visualization.\"\"\"\n", " chunks: list[torch.Tensor] = []\n", " n = 0\n", " for batch in loader:\n", " x = _extract_x(batch).to(device)\n", " take = min(num_vis - n, x.shape[0])\n", " chunks.append(x[:take])\n", " n += take\n", " if n >= num_vis:\n", " break\n", " if not chunks:\n", " raise RuntimeError(\"Could not collect visualization samples\")\n", " return torch.cat(chunks, dim=0)\n", "\n", "\n", "def _to_image_batch(x: torch.Tensor, image_size: int) -> torch.Tensor:\n", " \"\"\"Ensure tensors are in image shape `(B, 1, H, W)`.\"\"\"\n", " if x.dim() == 4 and x.shape[1:] == (1, image_size, image_size):\n", " return x\n", " if x.dim() == 2 and x.shape[1] == image_size * image_size:\n", " return x.view(-1, 1, image_size, image_size)\n", " raise ValueError(f\"Unexpected shape {tuple(x.shape)}\")\n", "\n", "\n", "def build_recon_grid(model: AutoencodingPC, x_batch: torch.Tensor, cfg: Config) -> torch.Tensor:\n", " \"\"\"Return an inline visualization grid (top row data, bottom row reconstruction).\"\"\"\n", " model.eval()\n", " with torch.no_grad():\n", " x_rec = model.reconstruct(x_batch)\n", "\n", " denom = float(2**cfg.n_bits - 1)\n", " x_img = _to_image_batch(x_batch.detach().cpu(), cfg.image_size).float().div(denom).clamp(0.0, 1.0)\n", " x_rec_img = _to_image_batch(x_rec.detach().cpu(), cfg.image_size).float().div(denom).clamp(0.0, 1.0)\n", " return make_grid(torch.cat([x_img, x_rec_img], dim=0), nrow=x_img.shape[0], padding=1, pad_value=1.0)\n", "\n", "\n", "def _progress_map(iters: int) -> dict[int, int]:\n", " \"\"\"Map training steps to progress percentages: 10, 20, ..., 100.\"\"\"\n", " marks: dict[int, int] = {}\n", " for p in range(1, 11):\n", " step = max(1, int(round(iters * p / 10)))\n", " marks[step] = p * 10\n", " return marks\n", "\n", "\n", "def train_apc_iters(\n", " *,\n", " fabric: L.Fabric,\n", " model: AutoencodingPC,\n", " train_loader: DataLoader,\n", " val_loader: DataLoader,\n", " optimizer: Optimizer,\n", " scheduler: MultiStepLR,\n", " cfg: Config,\n", ") -> list[dict[str, float]]:\n", " \"\"\"Train for a fixed iteration budget and log exactly 10 progress lines.\"\"\"\n", " history: list[dict[str, float]] = []\n", " train_iter = iter(train_loader)\n", "\n", " base_lrs = [float(group[\"lr\"]) for group in optimizer.param_groups]\n", " # Warmup duration is expressed as a fraction of total iterations.\n", " warmup_steps = int(cfg.iters * cfg.warmup_pct / 100.0)\n", " progress_marks = _progress_map(cfg.iters)\n", "\n", " # Track running means between progress checkpoints.\n", " window_totals = {\"rec\": 0.0, \"kld\": 0.0, \"nll\": 0.0, \"total\": 0.0}\n", " window_steps = 0\n", "\n", " for step in range(1, cfg.iters + 1):\n", " try:\n", " batch = next(train_iter)\n", " except StopIteration:\n", " train_iter = iter(train_loader)\n", " batch = next(train_iter)\n", "\n", " x = _extract_x(batch).to(fabric.device)\n", "\n", " model.train()\n", " optimizer.zero_grad(set_to_none=True)\n", " losses = model.loss_components(x)\n", " fabric.backward(losses[\"total\"])\n", "\n", " if cfg.grad_clip_norm is not None:\n", " fabric.clip_gradients(model, optimizer, max_norm=cfg.grad_clip_norm)\n", "\n", " optimizer.step()\n", " scheduler.step()\n", "\n", " # Keep the script-style warmup behavior in compact form.\n", " if warmup_steps > 0 and step <= warmup_steps:\n", " factor = math.exp(-5.0 * (1.0 - (step / warmup_steps)) ** 2)\n", " for group, base_lr in zip(optimizer.param_groups, base_lrs):\n", " group[\"lr\"] = base_lr * factor\n", "\n", " for k in window_totals:\n", " window_totals[k] += float(losses[k].item())\n", " window_steps += 1\n", "\n", " if step not in progress_marks:\n", " continue\n", "\n", " # Run validation only at progress checkpoints to keep notebook runtime low.\n", " val = evaluate_apc(model, val_loader, batch_size=cfg.batch_size)\n", " row = {\n", " \"iter\": float(step),\n", " \"progress_pct\": float(progress_marks[step]),\n", " \"train_total\": window_totals[\"total\"] / window_steps,\n", " \"train_rec\": window_totals[\"rec\"] / window_steps,\n", " \"train_kld\": window_totals[\"kld\"] / window_steps,\n", " \"train_nll\": window_totals[\"nll\"] / window_steps,\n", " \"val_total\": float(val[\"total\"]),\n", " \"val_rec\": float(val[\"rec\"]),\n", " \"val_kld\": float(val[\"kld\"]),\n", " \"val_nll\": float(val[\"nll\"]),\n", " }\n", " history.append(row)\n", "\n", " print(\n", " f\"[APC] {int(row['progress_pct']):3d}% ({step}/{cfg.iters}) \"\n", " f\"train_total={row['train_total']:.4f} val_total={row['val_total']:.4f}\"\n", " )\n", "\n", " window_totals = {\"rec\": 0.0, \"kld\": 0.0, \"nll\": 0.0, \"total\": 0.0}\n", " window_steps = 0\n", "\n", " return history\n" ], "outputs": [], "execution_count": 37 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Before Running Training\n", "\n", "The run cell follows this order:\n", "\n", "1. Set seed/device/Fabric\n", "2. Build loaders, model, optimizer, scheduler\n", "3. Move components into Fabric-managed runtime\n", "4. Train, evaluate on test set, and prepare plotting payloads\n" ], "id": "49bb8dc1" }, { "cell_type": "markdown", "id": "140dbcf9", "metadata": {}, "source": [ "## Training\n", "\n", "The following wires all helper functions into one runnable pipeline and prints compact progress logs at 10% checkpoints.\n" ] }, { "cell_type": "code", "id": "aa9d03fd", "metadata": { "execution": { "iopub.execute_input": "2026-03-04T14:46:22.473716Z", "iopub.status.busy": "2026-03-04T14:46:22.473634Z", "iopub.status.idle": "2026-03-04T14:51:47.439238Z", "shell.execute_reply": "2026-03-04T14:51:47.438515Z" }, "ExecuteTime": { "end_time": "2026-03-04T15:11:34.130517Z", "start_time": "2026-03-04T15:04:07.833800Z" } }, "source": [ "# Seed first so data splits and initial parameters remain reproducible.\n", "seed_everything(cfg.seed)\n", "\n", "# Resolve backend and initialize a single-device Fabric runtime.\n", "device = resolve_device(cfg.device)\n", "fabric = build_fabric(device=device, precision=cfg.precision)\n", "\n", "# Build data pipeline and APC model from the fixed config.\n", "train_loader, val_loader, test_loader = build_loaders(cfg)\n", "model = build_model(cfg)\n", "optimizer = build_optimizer(cfg, model)\n", "scheduler = build_scheduler(cfg, optimizer)\n", "\n", "# Let Fabric place loaders/model/optimizer on the selected runtime device.\n", "train_loader, val_loader, test_loader = fabric.setup_dataloaders(train_loader, val_loader, test_loader)\n", "# Keep a fixed mini-batch for consistent reconstruction snapshots.\n", "vis_batch = collect_vis_batch(test_loader, device=device, num_vis=cfg.num_vis)\n", "model, optimizer = fabric.setup(model, optimizer)\n", "\n", "print(f\"[APC] Device: {device}\")\n", "print(\n", " f\"[APC] Dataset sizes: train={len(train_loader.dataset)}, val={len(val_loader.dataset)}, test={len(test_loader.dataset)}\"\n", ")\n", "print(\n", " f\"[APC] Fixed setup: Conv-PC + NN decoder, AdamW, MultiStepLR(66/90), \"\n", " f\"batch_size={cfg.batch_size}, iters={cfg.iters}\"\n", ")\n", "\n", "# Run the fixed-iteration training loop.\n", "history = train_apc_iters(\n", " fabric=fabric,\n", " model=model,\n", " train_loader=train_loader,\n", " val_loader=val_loader,\n", " optimizer=optimizer,\n", " scheduler=scheduler,\n", " cfg=cfg,\n", ")\n", "\n", "# Evaluate on held-out data and unwrap model if Fabric wrapped it.\n", "test_metrics = evaluate_apc(model, test_loader, batch_size=cfg.batch_size)\n", "model_unwrapped = model.module if hasattr(model, \"module\") else model\n", "\n", "history_df = pd.DataFrame(history)\n", "recon_grid = build_recon_grid(model_unwrapped, vis_batch, cfg)\n", "\n", "inline_payload = {\n", " \"config\": {k: (str(v) if isinstance(v, Path) else v) for k, v in asdict(cfg).items()},\n", " \"apc_config\": asdict(model_unwrapped.config),\n", " \"test_metrics\": test_metrics,\n", "}\n", "\n", "print(\"[APC] Test metrics:\", test_metrics)" ], "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using bfloat16 Automatic Mixed Precision (AMP)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[APC] Device: cpu\n", "[APC] Dataset sizes: train=50000, val=2000, test=2000\n", "[APC] Fixed setup: Conv-PC + NN decoder, AdamW, MultiStepLR(66/90), batch_size=128, iters=1000\n", "[APC] 10% (100/1000) train_total=4504533.5300 val_total=2967835.8420\n", "[APC] 20% (200/1000) train_total=2212066.5950 val_total=1748269.8230\n", "[APC] 30% (300/1000) train_total=1558427.6600 val_total=1445993.7350\n", "[APC] 40% (400/1000) train_total=1366740.8050 val_total=1326261.4410\n", "[APC] 50% (500/1000) train_total=1273774.9087 val_total=1247038.0190\n", "[APC] 60% (600/1000) train_total=1229806.9688 val_total=1215286.8020\n", "[APC] 70% (700/1000) train_total=1168145.4112 val_total=1143536.5570\n", "[APC] 80% (800/1000) train_total=1128152.8813 val_total=1124754.1210\n", "[APC] 90% (900/1000) train_total=1105665.3219 val_total=1105524.4530\n", "[APC] 100% (1000/1000) train_total=1098820.8000 val_total=1104452.4800\n", "[APC] Test metrics: {'rec': 1058982.502, 'kld': 904.2743515625, 'nll': 20949.222015625, 'total': 1080835.999}\n", "\n", "[APC] Inline payload (no file output):\n", "{\n", " \"config\": {\n", " \"seed\": 0,\n", " \"data_dir\": \"data/mnist\",\n", " \"download\": true,\n", " \"dist_data\": \"binomial\",\n", " \"image_size\": 32,\n", " \"n_bits\": 8,\n", " \"device\": \"auto\",\n", " \"precision\": \"bf16-mixed\",\n", " \"num_workers\": 0,\n", " \"iters\": 1000,\n", " \"batch_size\": 128,\n", " \"val_size\": 10000,\n", " \"max_train_samples\": 60000,\n", " \"max_val_samples\": 2000,\n", " \"max_test_samples\": 2000,\n", " \"lr_encoder\": 0.1,\n", " \"lr_decoder\": 0.001,\n", " \"weight_decay\": 0.0,\n", " \"lr_gamma\": 0.1,\n", " \"latent_dim\": 64,\n", " \"conv_channels\": 64,\n", " \"conv_depth\": 3,\n", " \"conv_latent_depth\": 0,\n", " \"conv_use_sum_conv\": false,\n", " \"num_repetitions\": 1,\n", " \"nn_hidden\": 64,\n", " \"nn_res_hidden\": 16,\n", " \"nn_res_layers\": 2,\n", " \"nn_scales\": 2,\n", " \"nn_bn\": true,\n", " \"nn_out_activation\": \"identity\",\n", " \"rec_loss\": \"mse\",\n", " \"sample_tau\": 1.0,\n", " \"w_rec\": 1.0,\n", " \"w_kld\": 1.0,\n", " \"w_nll\": 1.0,\n", " \"grad_clip_norm\": null,\n", " \"warmup_pct\": 2.0,\n", " \"num_vis\": 8\n", " },\n", " \"apc_config\": {\n", " \"latent_dim\": 64,\n", " \"rec_loss\": \"mse\",\n", " \"sample_tau\": 1.0,\n", " \"train_decode_mpe\": false,\n", " \"nll_x_and_z\": true,\n", " \"loss_weights\": {\n", " \"rec\": 1.0,\n", " \"kld\": 1.0,\n", " \"nll\": 1.0\n", " }\n", " },\n", " \"test_metrics\": {\n", " \"rec\": 1058982.502,\n", " \"kld\": 904.2743515625,\n", " \"nll\": 20949.222015625,\n", " \"total\": 1080835.999\n", " }\n", "}\n" ] } ], "execution_count": 38 }, { "cell_type": "markdown", "id": "239d3b6d", "metadata": {}, "source": "## Results" }, { "cell_type": "code", "id": "ed5c8ca0", "metadata": { "execution": { "iopub.execute_input": "2026-03-04T14:51:47.441367Z", "iopub.status.busy": "2026-03-04T14:51:47.441224Z", "iopub.status.idle": "2026-03-04T14:51:47.558455Z", "shell.execute_reply": "2026-03-04T14:51:47.557971Z" }, "ExecuteTime": { "end_time": "2026-03-04T15:11:35.524078Z", "start_time": "2026-03-04T15:11:34.162333Z" } }, "source": [ "# Show the checkpoint-level training history table.\n", "display(history_df)\n", "# Plot train/validation total loss across 10% progress checkpoints.\n", "plt.figure(figsize=(9, 4))\n", "plt.plot(history_df[\"iter\"], history_df[\"train_total\"], marker=\"o\", label=\"train_total\")\n", "plt.plot(history_df[\"iter\"], history_df[\"val_total\"], marker=\"o\", label=\"val_total\")\n", "plt.xlabel(\"Iteration\")\n", "plt.ylabel(\"Loss\")\n", "plt.title(\"APC Loss Curve\")\n", "plt.grid(alpha=0.3)\n", "plt.legend()\n", "plt.show()\n", "\n", "# Display originals (top row) against reconstructions (bottom row).\n", "img = recon_grid.detach().cpu()\n", "plt.figure(figsize=(12, 3))\n", "if img.shape[0] == 1:\n", " plt.imshow(img.squeeze(0), cmap=\"gray\", vmin=0.0, vmax=1.0)\n", "else:\n", " plt.imshow(img.permute(1, 2, 0).clamp(0.0, 1.0))\n", "plt.axis(\"off\")\n", "plt.title(\"Reconstructions (top: data, bottom: reconstruction)\")\n", "plt.show()\n" ], "outputs": [ { "data": { "text/plain": [ " iter progress_pct train_total train_rec train_kld train_nll \\\n", "0 100.0 10.0 4.504534e+06 4.446900e+06 186.001488 57447.176172 \n", "1 200.0 20.0 2.212067e+06 2.185646e+06 513.629837 25907.362402 \n", "2 300.0 30.0 1.558428e+06 1.534141e+06 695.762187 23591.010215 \n", "3 400.0 40.0 1.366741e+06 1.343259e+06 773.251157 22708.204551 \n", "4 500.0 50.0 1.273775e+06 1.250953e+06 835.988552 21985.431719 \n", "5 600.0 60.0 1.229807e+06 1.207507e+06 887.402727 21412.433613 \n", "6 700.0 70.0 1.168145e+06 1.145592e+06 911.301548 21642.418105 \n", "7 800.0 80.0 1.128153e+06 1.105444e+06 921.173979 21787.575938 \n", "8 900.0 90.0 1.105665e+06 1.083133e+06 917.388387 21614.657539 \n", "9 1000.0 100.0 1.098821e+06 1.076440e+06 919.010759 21461.837246 \n", "\n", " val_total val_rec val_kld val_nll \n", "0 2967835.842 2.939025e+06 349.067951 28461.813141 \n", "1 1748269.823 1.723398e+06 635.257547 24236.865609 \n", "2 1445993.735 1.422170e+06 747.875771 23076.016375 \n", "3 1326261.441 1.303142e+06 799.736663 22320.137344 \n", "4 1247038.019 1.224443e+06 862.661738 21732.708234 \n", "5 1215286.802 1.192928e+06 896.726700 21462.263781 \n", "6 1143536.557 1.120679e+06 912.463941 21945.340609 \n", "7 1124754.121 1.102065e+06 914.862308 21774.091844 \n", "8 1105524.453 1.083016e+06 915.413808 21593.535422 \n", "9 1104452.480 1.081957e+06 917.645335 21577.747719 " ], "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
iterprogress_pcttrain_totaltrain_rectrain_kldtrain_nllval_totalval_recval_kldval_nll
0100.010.04.504534e+064.446900e+06186.00148857447.1761722967835.8422.939025e+06349.06795128461.813141
1200.020.02.212067e+062.185646e+06513.62983725907.3624021748269.8231.723398e+06635.25754724236.865609
2300.030.01.558428e+061.534141e+06695.76218723591.0102151445993.7351.422170e+06747.87577123076.016375
3400.040.01.366741e+061.343259e+06773.25115722708.2045511326261.4411.303142e+06799.73666322320.137344
4500.050.01.273775e+061.250953e+06835.98855221985.4317191247038.0191.224443e+06862.66173821732.708234
5600.060.01.229807e+061.207507e+06887.40272721412.4336131215286.8021.192928e+06896.72670021462.263781
6700.070.01.168145e+061.145592e+06911.30154821642.4181051143536.5571.120679e+06912.46394121945.340609
7800.080.01.128153e+061.105444e+06921.17397921787.5759381124754.1211.102065e+06914.86230821774.091844
8900.090.01.105665e+061.083133e+06917.38838721614.6575391105524.4531.083016e+06915.41380821593.535422
91000.0100.01.098821e+061.076440e+06919.01075921461.8372461104452.4801.081957e+06917.64533521577.747719
\n", "
" ] }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwAAAAGJCAYAAAA9oVS3AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbzVJREFUeJzt3Qd8U1X7B/Bf0jbdEzqglL33luFAQIbs4UAU98SBvG5fByjDLehfFBfOVwUEEZEhCMgQoQzZs0CBlhZK927u//OcNCHdBdokTX5fP9ckNzfJbXJJznPPc56j0zRNAxERERERuQS9vXeAiIiIiIhshwEAEREREZELYQBARERERORCGAAQEREREbkQBgBERERERC6EAQARERERkQthAEBERERE5EIYABARERERuRAGAERERERELoQBABERERGRC2EAQERkQx999BF0Oh2uuuqqMreR+82LXq9H3bp1MWDAAKxdu7bEtgUFBfjyyy/Rp08fhISEwNPTEw0bNsTdd9+Nbdu2lbsvx48fV6/x9ttvoyY4e/YsnnrqKbRs2RI+Pj7w9fVFly5d8PrrryM5Odneu0dEVGO423sHiIhcyXfffaca6P/88w+OHDmCpk2blrrdDTfcgAkTJkDTNMTExKjAoW/fvvjtt98wePBgtU1WVhZGjx6N5cuX49prr8ULL7ygggBp2P/000/46quvcPLkSdSrVw813datW3HjjTciPT0dt99+u2r4CwlyZs6cifXr12PlypX23k0iohqBAQARkY1IQ37Tpk34+eef8eCDD6pg4JVXXil12+bNm6uGrtmoUaPQvn17vP/++5YA4Omnn1aN//feew+TJk0q8nh5XlnvDOTsvvz9bm5u2LFjh+oBsDZt2jR8+umnVfJaGRkZqmeBiMiZMQWIiMhGpMEfHByMIUOGYOzYsep2ZbVr1w61a9dWQYQ4deoUPvnkE9VTULzxL6SxLOkyVXH2PyEhAffeey/Cw8Ph5eWFDh06qN6F4n744Qd1Zt7f3x8BAQFqn2fNmmW5Py8vD1OmTEGzZs3U89SqVQtXX301Vq1aVe7ry995+vRpvPvuuyUa/0L267///a/ltqQ1vfrqqyW2k56Xu+66y3J73rx5att169bhkUceQVhYmHq/FixYYFlf2r7IfXv27LGsO3DggPo8pfdF/q6uXbtiyZIl5f5N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DGxjSnlauP2UvXeHiIiIiGoYu5cBtbZ27dpyb4ubbrpJLa5M0oCW7DqDX3aewYtDWsHT3bkqAhERERGRi/YAUOl6N62NiAAvpGTlYfV+TvRBRERERJXHAKAGctPrMLpzpLq+MJppQERERERUeQwAaqgxhdWA1h5KREJazZrQjIiIiIjshwFADdUk1A+d6gehwKjhlx1n7L07RERERFRDMACowTgnABERERFdKgYANdjQ9nVhcNfj4Nk07D2Tau/dISIiIqIagAFADRbo7YEBrcMtMwMTEREREVWEAYCTpAH9svM0cvON9t4dIiIiInJwDABquGuahSLM3xMXMvOw5gDnBCAiIiKi8jEAcII5AUYVzgnANCAiIiIiqggDACcwtnPhnAAHE3AuPcfeu0NEREREDowBgBNoFu6PDlFByJc5AXZyTgAiIiIiKhsDACcxlmlARERERFQJDACcxLAOdWFw02N/XCr2nkmx9+4QERERkYNiAOAkgnwMuIFzAhARERFRBRgAOJExXUzVgGQcAOcEICIiIqLSMABwItc2C0VtP08kZeSqikBERERERMUxAHAi7m56jOZgYCIiIiIqBwMAJzOmcE4AmRX4POcEICIiIqJiGAA4mRYR/mgXGajmBFiyi3MCEBEREVFRDACc0Ngupl6ABdGn7L0rRERERORgGAA4oeEd6sLDTYe9Z1LVvABERERERGYMAJxQsK8B/VqGq+sL2QtARERERFYYADh5GtDinaeRV2C09+4QERERkYNgAOCkrmshcwIYcC49F+sOJtp7d4iIiIjIQTAAcFIebnqM6GiaGXjhdg4GJiIiIiITBgAukAb0x/6zuJCRa+/dISIiIiIHwADAibWqE4A2dQOQV8A5AYiIiIjIhAGAi8wMzDQgIiIiIhIMAJzciI514a7X4d9TKTgYn2bv3SEiIiIiVw4A5syZg/bt2yMgIEAtPXv2xO+//17m9vPmzYNOpyuyeHl52XSfa5pafp7o2zJMXWcvABERERHZNQCoV68eZs6ciejoaGzbtg19+/bFiBEjsHfv3jIfI4FCXFycZTlx4oRN97kmGlM4GHjRjtPI55wARERERC7N3Z4vPmzYsCK3p02bpnoF/v77b7Rp06bUx8hZ/4iICBvtoXO4vkUYQnwNSEzLwV+Hz+H6wh4BIiIiInI9dg0ArBUUFGD+/PnI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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "data": { "text/plain": [ "
" ], "image/png": "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zlPCvsPatWuL9WoLSqO0aK20jq+//vpiHduk357+2Pc88sgji4uaUhnZonvIkCGF888/v1kZti0urE3YAsnKbtWqVcmPFh77rI9+9KOFc845p/Duu+8WF+42yb777rsLJ510UvEYk7ebksAWMZ/97GeLf7OyNaxsTPJoG7TY+a3//OpXvyp+f1uo2ES9Gt54443CiSeeWFxAWL1Zf7M6sHZlfStrOVubtuux91o/tb5j7LPPPsV2vmTJkmLbsO+o2MLTyuWRRx4pLnpHjhxZuP/++4uLFquLUp2XeOKJJ4r93OrQsHI/+eSTi4tCW9xZ/7LvZP3Xrt/6RYnnnnuuuKCzBWUWf6vVpyk8rMzthxprI/bk0K73ySefLNaRtRVrP3adM2fOTPmBm+urhuXbcUcffXSx7Ey6auVo9W19Rp8Y2vc6/vjji2Vr9WU/apg30n70ses0TPb6xS9+sfjDntWLtfOXXnqp+Llnn3128b12nX/5y1+K12xjpVH6QcGw67N2YHVt+Ta2VSL1tc+z8dmu3crI3m8/Pt51113FxWKWa1BsTLIytB8V7LvZDzL2g4jVg5VB6b5Q4gc/+EFRDWI/mNnYYW3B+p2VgVL6YcPK2Z8DANo4TQDQ7rjuuuvscUfTgw8+2LRixYqmhQsXNt16661N3bt3b+rYsWPxdYmjjjqqafjw4U1vv/128rcPP/yw6aCDDmoaOHBg8rd/+7d/K57ztttu2+Tz7Hjjpz/9afGYG264Icl79913mw488MCmzp07N61bt674t3nz5hWP69atW9Pq1auTY++4447i3++6667i6zfeeKP4+kc/+lH0++69995N48aNC5bDIYcc0vT++++n8s4///ymvn37bvKeb3/728X3lJg1a1bTlltu2XTqqac2ffDBB2W/d+waHnnkkeL57P+l8ujRo0fTsGHDmt56663kuLvvvrt4nJWzXqP97corr0ydc9SoUU2jR49OXn/pS19q2n777Tf5js0xe/bs4vl//vOfb5J30kknlS2fSut42223bVq0aFFy7IQJE4p///KXv5z8rXSsfd/mGDlyZFOvXr2a1qxZk/ztgQceKL7fX+/GjRtTr+06rdyPPPLI1N87depU9rP9+41nnnmm+FnXX399UzVYG7H3/+QnP0n+9s477xS/l7ULu8ZKytn6tx1n7dbz+c9/PtWW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pQAAAAAAAJAbLEoBAAAAAAAgN1iUAgAAAAAAQG7gKYVc2HvvvVOvL7rooiR9yimnpPJ69eqVpN9///1U3vr165P0nDlzkvS2224b/DwNMWMsWLCgbHgYA/9h/dK7d+/U60996lNJunv37qm8H/7wh0maOq0dW2+9dZLec889U3nf+MY3kvRhhx2WytPQS1dddVWSvu2221LHLV26tIZX277RMXH33XcP5qn/viXo2LFj6nXnzp2T9IYNG4Ke/qampha9Lvhfdtppp+A+DVtt9X9TxtmzZyfp5cuXp46jruJj5R577JHKUz/+ypUrg2Pg22+/nVsz1bo3dtxxx7L91l8jbQEqgSelAAAAAAAAkBssSgEAAAAAACA3kO9Cq4SLMLbZZpskfemll6byTj311LLyIS/1W7hwYSpv1qxZSXrKlClBaefpp5+epHv27JnKGzlyZFCuhNSzftltt91Sr7XdvPHGG8E2BNWz5Zbp3zG7du1aNqyTccQRRwTPs+uuu5YN+fTUU0+ljkO+Wzs0fNb555+fylO5+2c+85lCS7LzzjsHQwctXrw4ladSYm/dgNrwkY98JPV67NixSfprX/taKq9Lly5J+he/+EXZsGrGBx980O6rx5fr4MGDk/QFF1yQyuvfv3+Svv/++1N5t956a6vJd/2cTSXHw4YNS+XpuD1hwoSyczLjvffeK7QXtPy22267svdJX64+DNoH7bzv8KQUAAAAAAAAcoNFKQAAAAAAAOQGi1IAAAAAAADIjbrxlMa07JqObS/tPSeqzfbv+/DDDzfreqFy/9mQIUOCISJUc+99o3/4wx+S9G9/+9tU3tq1a8v6LTTMgPcfHnXUUZnaGtR3m+rXr18qT+v8hRdeSOW99NJLrXB1bRMNBbD99tun8g455JAk/YUvfGGzvVcdOnRI5elr77Vp796bSlHfmvfOa2itlsb7q4477rgk3alTp1Te5z//+ST95ptvtsLVtT80HIlxzjnnJOkDDjggGDroYx/7WJK+6aabUse1176p81jvnf72t7+dpI855pjg3hU+9MqKFSsKeflgdd503XXXBX3ol19+edAXrnO0toYvL52DqFdew9UZPXr0SNJnnXVWKu8N2Q+jPYbT4UkpAAAAAAAA5AaLUgAAAAAAAMiNupHvelmYyhvOOOOMJL1u3brUcRs3bgxK9jREiA8t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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } } ], "execution_count": 39 } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.12" } }, "nbformat": 4, "nbformat_minor": 5 }