Nodes/ComfyUI-LoopedDiT/Looped-DiT Loader
ComfyUI Node

Looped-DiT Loader

No VAE, no CLIP, and that's not a broken workflow

By hiroki-abe-58·Created 14 days ago·Updated 14 days ago· 0
Looped-DiT Loader
    • model
    • report
    ◄checkpoint▾►
    ◄text_encoder▾►
    ◄verify_hashestrue►

    If you're coming from SDXL or Flux, this node will look half-finished. There's no CLIP loader downstream, no VAE, no separate UNet and no CheckpointLoaderSimple. That's the architecture, not a missing node. Looped-DiT generates in pixel space - the transformer works on raw RGB with no VAE anywhere in the stack - and its text conditioning is a FLAN-T5-Large you load here, alongside the checkpoint. Two combo boxes instead of five nodes.

    It reads the checkpoint into bfloat16, loads FLAN-T5-Large, checks the two actually belong together, and hands back a LOOPED_DIT handle. It's the entry point to the pack, so if this one misbehaves, nothing downstream runs.

    How it works

    The pack registers its own model folder - ComfyUI/models/looped_dit, overridable through extra_model_paths.yaml - and tells ComfyUI to only look for .pt files there. Checkpoints are those .pt files; the text encoder is a sub-folder inside it, not a file. The two combos are populated by scanning those directories, which explains most of the "the dropdown is empty" reports: there's nothing to list.

    Loading is deliberately single-slot. The pack keeps one resident model, and asking for a different checkpoint frees the old one before loading the new one. That's a real behaviour to know about, because ComfyUI's own memory manager doesn't manage this model at all - the pack is running its own show. There's also a sanity check at load: the T5's hidden width has to match the checkpoint's text_dim, otherwise you get a ValueError rather than silent garbage.

    verify_hashes is the interesting one. With it on, the pack computes SHA-256 for the checkpoint and the T5 model.safetensors and compares them to the official release files - about 2.6 seconds the first time, then cached per file. It doesn't just pass or fail; the report labels the file as the official release or as not an official release file. That's a diagnostic, not a refusal, so a converted or re-uploaded checkpoint still loads while the report tells you it isn't what the verification results were measured on.

    The inputs and outputs

    Three inputs, all required:

    • checkpoint - the .pt file. Should be looped-dit-b16.pt unless you deliberately pulled B/32.
    • text_encoder - the folder name, e.g. flan-t5-large. It only appears in the list if the folder holds config.json, tokenizer.json and model.safetensors. A folder with two of the three is invisible.
    • verify_hashes - on by default. Leave it on. The cost is a couple of seconds once and it's the only way to know your weights are the ones that were tested.

    Outputs are model, which only the other three nodes in this pack accept - don't expect to feed it into a standard KSampler - and report, a JSON string with the SHA-256 values, release labels, load timings and a dump of the model config. When something feels wrong, that's where you check which checkpoint you actually loaded.

    Install

    cd ComfyUI/custom_nodes
    git clone https://github.com/hiroki-abe-58/ComfyUI-LoopedDiT
    python custom_nodes/ComfyUI-LoopedDiT/tools/download_models.py --models-dir models --b32
    

    The download script is the reliable route: it pins Hugging Face revisions, verifies SHA-256 per file and skips anything already correct. Drop the --b32 flag if you only want B/16. Everything lands under models/looped_dit/; the script figures the sub-folder out itself.

    There's nothing to pip install. The pack has no requirements file and declares no dependencies - it runs on ComfyUI's own torch, transformers and tokenizers. What it does need is ComfyUI 0.38.0 or newer (it's written against the new comfy_api node interface) and an NVIDIA GPU with CUDA. Loading is not shy about RAM: the 3.1 GB T5 file plus the checkpoint pass through system memory for a few seconds.

    Things that go wrong

    Empty checkpoint or text-encoder list. Either you skipped the download, or ComfyUI was started before the files existed. Restart so the folder scan reruns; a browser refresh alone won't always do it after adding new paths.

    The text encoder folder won't show up. As above, all three files have to be present. model.safetensors is the one people miss when they hand-assemble the folder from a Hugging Face download page.

    "needs a CUDA GPU" on startup of the graph. The loader raises this by design on CPU-only or Apple Silicon machines. There is no fallback path - MPS support exists as a planning document in the repo, not as code.

    Loading feels slow every queue. Each new checkpoint means unloading and reloading, so swapping between B/16 and B/32 mid-graph pays the full cost each time - around 1.7s for the model, 1.5s for T5, plus the hash pass on first use. Settle on one model for a session.

    The hash says "not an official release file." You're running something other than the published weights. Fine if you meant to - just note every bit-identical claim in the README was measured on the official files.

    Categoryloaders/looped-dit

    Inputs (3)

    NameTypeDefaultDescription
    checkpointCOMBOA .pt file in models/looped_dit
    text_encoderCOMBOA folder in models/looped_dit with config.json, tokenizer.json, model.safetensors
    verify_hashesBOOLEANtrueSHA-256 of the checkpoint and text encoder, compared with the official releases (once per file)

    Outputs (2)

    NameTypeDescription
    modelLOOPED_DIT—
    reportSTRING—