patdev's picture
Use robust CPU SLat shell construction for positional buffers
2dd1f5a verified
Raw
History Blame Contribute Delete
1.41 kB
from __future__ import annotations
import json,torch,gc
from pathlib import Path
from safetensors.torch import load_file
def _strip_core(model):
import torch.nn as nn
model.blocks=nn.ModuleList();model.blocks_vert_skin=nn.ModuleList();model.blocks_skl=nn.ModuleList();model.adapter_geo_to_skin=nn.ModuleList();gc.collect()
return model
def load_slat_shell(runtime_root:Path,device='cuda'):
"""Load the 188MB sparse shell without the 2.46GB trained transformer core.
Construct on CPU so ordinary (non-buffer) positional-frequency tensors are
initialized correctly, strip the random core immediately, then load only the
shell weights and move the small shell to CUDA.
"""
cfg=json.loads((runtime_root/'weights/anigen/slat-flow-shell/config.json').read_text());mc=cfg['models']['denoiser']
from anigen import models
model=getattr(models,mc['name'])(**mc['args']);_strip_core(model)
sd=load_file(str(runtime_root/'weights/anigen/slat-flow-shell/shell.safetensors'),device='cpu')
missing,unexpected=model.load_state_dict(sd,strict=False)
bad=[k for k in missing if not k.startswith(('blocks.','blocks_vert_skin.','blocks_skl.','adapter_geo_to_skin.'))]
if bad or unexpected:raise RuntimeError(f'SLat shell state mismatch: missing={bad[:8]} unexpected={unexpected[:8]}')
model.to(device).eval();model._companion_meta_shell=False
return model,cfg