| """d1_lune_sampler.py — SD15-Lune rectified-flow sampler + 225-token CLIP encoder.
|
|
|
| PORTED VERBATIM (read-only law) from E:\\coworkers\\qwen_runner_1\\colab\\
|
| sd15_lune_before_after.py (the sampler of record — repos/geolip-aleph-diffusion.md):
|
| encode_clip_225 — 3 x 75-token chunked CLIP -> [B, 227, 768]. ALL judging in
|
| this line conditions through THIS, never a bare 77-token encode.
|
| flow_sample — Euler ODE sigma 1->0 on the SHIFT-warped grid
|
| sigma = (shift*u)/(1+(shift-1)*u), v = noise - x0, batched CFG.
|
| NOTE: pod/v35_expP1_sd15.py used an UNSHIFTED grid — that
|
| discrepancy is ledgered in R0a; THIS grid matches the trainer.
|
| Defaults from the source bed: STEPS 30, SHIFT 2.5, VAE_SCALE 0.18215, 64x64
|
| latents (512px). Guidance differs across Phil's beds (6.0 before/after bed,
|
| 4.0 expP1) — beds pass it explicitly and ledger it.
|
|
|
| CPU cert: python pod2/d1_lune_sampler.py (sigma-grid math + dummy-UNet
|
| integration shape check only; real sampling is pod work).
|
| """
|
| from __future__ import annotations
|
|
|
| import torch
|
|
|
| VAE_SCALE = 0.18215
|
| SHIFT = 2.5
|
| STEPS = 30
|
|
|
|
|
| def encode_clip_225(prompts, tokenizer, text_encoder, device):
|
| """Encode text as 3 x 75-token chunks -> one 227-length hidden sequence."""
|
| chunk_len = tokenizer.model_max_length
|
| body_len = chunk_len - 2
|
| n_chunks = 3
|
| ids = tokenizer(prompts, padding="max_length",
|
| max_length=body_len * n_chunks + 2,
|
| truncation=True, return_tensors="pt").input_ids
|
| bos, eos = ids[:, :1], ids[:, -1:]
|
| chunks = []
|
| for k in range(n_chunks):
|
| s = 1 + k * body_len
|
| chunks.append(torch.cat([bos, ids[:, s:s + body_len], eos], dim=1))
|
| ids = torch.stack(chunks, dim=1).reshape(-1, chunk_len).to(device)
|
| hs = text_encoder(ids)[0]
|
| hs = hs.reshape(len(prompts), n_chunks * chunk_len, -1)
|
| out = [hs[:, :1]]
|
| for k in range(n_chunks):
|
| s = k * chunk_len + 1
|
| out.append(hs[:, s:s + body_len])
|
| out.append(hs[:, -1:])
|
| return torch.cat(out, dim=1)
|
|
|
|
|
| def shifted_sigmas(n_steps: int, shift: float = SHIFT,
|
| device="cpu") -> torch.Tensor:
|
| u = torch.linspace(1.0, 0.0, n_steps + 1, device=device)
|
| return (shift * u) / (1 + (shift - 1) * u)
|
|
|
|
|
| @torch.no_grad()
|
| def flow_sample(unet, ehs_cond, *, n_steps=STEPS, guidance=6.0, shift=SHIFT,
|
| seed=1234, device="cuda", latent_hw=64,
|
| encoder_attention_mask=None):
|
| """Integrate the rectified-flow ODE sigma 1->0; unet predicts v = noise - x0.
|
| encoder_attention_mask (optional, [2B, L]): the Tier-A masked-append toggle
|
| path — passed through to the UNet when provided."""
|
| B = ehs_cond.shape[0]
|
| g = torch.Generator(device=device).manual_seed(seed)
|
| x = torch.randn(B, 4, latent_hw, latent_hw, generator=g, device=device,
|
| dtype=torch.float32).to(ehs_cond.dtype)
|
|
|
| ehs_in = torch.cat([ehs_cond, torch.zeros_like(ehs_cond)], dim=0)
|
| sigmas = shifted_sigmas(n_steps, shift, device)
|
| kw = {}
|
| if encoder_attention_mask is not None:
|
| kw["encoder_attention_mask"] = encoder_attention_mask
|
| for i in range(n_steps):
|
| s, s_next = float(sigmas[i]), float(sigmas[i + 1])
|
| t = torch.full((2 * B,), s * 1000.0, device=device)
|
| v = unet(torch.cat([x, x], dim=0), t, ehs_in, return_dict=False,
|
| **kw)[0]
|
| v_cond, v_uncond = v.chunk(2)
|
| v = v_uncond + guidance * (v_cond - v_uncond)
|
| x = x + (s_next - s) * v
|
| return x
|
|
|
|
|
| @torch.no_grad()
|
| def decode(vae, latents):
|
| img = vae.decode(latents / VAE_SCALE).sample
|
| img = (img / 2 + 0.5).clamp(0, 1)
|
| return img.permute(0, 2, 3, 1).float().cpu().numpy()
|
|
|
|
|
| def _smoke():
|
| s = shifted_sigmas(30)
|
| assert abs(float(s[0]) - 1.0) < 1e-6 and abs(float(s[-1])) < 1e-6, \
|
| "shifted grid must span 1 -> 0 exactly"
|
| assert (s[:-1] > s[1:]).all(), "sigmas must be strictly decreasing"
|
| mid_shifted = float(shifted_sigmas(2)[1])
|
| assert abs(mid_shifted - (1.25 / 1.75)) < 1e-6, "SHIFT=2.5 warp wrong"
|
|
|
| class DummyUNet:
|
| def __call__(self, x, t, ehs, return_dict=False, **kw):
|
| return (torch.zeros_like(x),)
|
|
|
| out = flow_sample(DummyUNet(), torch.zeros(2, 227, 768), n_steps=4,
|
| guidance=1.0, seed=0, device="cpu")
|
| assert out.shape == (2, 4, 64, 64)
|
| print("d1_lune_sampler smoke PASSED (shifted grid endpoints + monotone, "
|
| "warp value, dummy integration shape)")
|
|
|
|
|
| if __name__ == "__main__":
|
| _smoke()
|
|
|