Nodes/ComfyUi-MpiNodes/Mpi Brush Train
ComfyUI Node

Mpi Brush Train

Train a real Gaussian splat in ComfyUI without touching a CUDA compiler

By MadPonyInteractive·Created 10 months ago·Updated a day ago· 3
Mpi Brush Train
    • ply_path
    dataset_path
    total_steps30000
    export_every5000
    sh_degree3
    max_splats10000000
    brush_path

    The shortest path from photos to a splat

    Gaussian splatting has a dirty secret in the ComfyUI world: the usual way to train a splat inside the graph is ComfyUI-3D-Pack, and that means compiling diff-gaussian-rasterization and friends against your exact PyTorch/CUDA combo. If your environment differs from the pinned build target by one version, you're down a Visual Studio Build Tools hole for an evening. There's a better door.

    MpiBrushTrain (from MadPonyInteractive's big ComfyUi-MpiNodes pack) takes a COLMAP dataset - the standard photogrammetry output you get from Polycam, RealityCapture, or any phone-scan app - and trains a real 3D Gaussian splat from it, handing you the exported .ply. No CUDA compilation, no pip installs of rasterizers. It shells out to Brush (ArthurBrussee's Apache-2.0 trainer), a prebuilt native binary that's downloaded and checksum-verified on first use. Closest thing ComfyUI has to "just works" splat training.

    How it works

    Three things happen under the hood when you run it - two of them because somebody measured how Brush behaves instead of assuming.

    First, the binary. On first use the node downloads the right Brush build for your platform from GitHub releases, verifies it against a pinned SHA-256 - pinned rather than fetched at runtime, because a checksum served from the same host as the payload proves nothing about that host - and caches it in the pack's bin/ folder. Set brush_path to point at a copy you manage and it never touches the network again.

    Second, dataset staging. Here's the trap that's burned plenty of people: a SplatKit dataset doesn't contain one COLMAP model, it contains four - two of them tucked under _spheresfm_work/ using camera model 11 (SPHERE). Brush picks between them nondeterministically and dies with Invalid camera model on the unlucky runs. So the node stages a clean root holding exactly one model, hardlinking the images rather than copying them - a SplatKit dataset runs to double-digit gigabytes.

    Third, progress. Brush writes zero bytes to stdout when it's not attached to a TTY, so there's no step counter to parse. A silent run is a working run. Progress is read from the export directory instead, where Brush drops export_{iter}.ply every --export-every steps - that's what drives the ComfyUI progress bar. And interrupting the prompt genuinely kills the trainer, so you're not stuck with Brush burning your GPU for 45 more minutes after you've given up.

    The inputs that matter

    • dataset_path - required. The COLMAP/SplatKit dataset directory (the one with images/ and sparse/). It has to be a real directory; the node raises otherwise.
    • total_steps - default 30000. The bake length, and where the time goes: a 30k-step run takes tens of minutes even on a decent GPU.
    • export_every (5000) - how often an intermediate .ply is written. Lower it if you want checkpoints you can abort and keep.
    • sh_degree (3) - spherical harmonic order for view-dependent colour. 3 is standard full quality; drop to 0 for a noticeably faster, flatter look.
    • max_splats (10M) - the cap on gaussian count.
    • brush_path - optional. Point it at your own Brush binary to skip the download entirely.

    The single output, ply_path, is a STRING path to the final export_*.ply in ComfyUI/output/splats/. Wire it into a splat viewer (core's PreviewGaussianSplat works) or just grab the file.

    Installing it

    The pack is on ComfyUI Manager - search "ComfyUi-MpiNodes" - or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/MadPonyInteractive/ComfyUi-MpiNodes
    # restart ComfyUI
    

    No extra Python dependencies, no model downloads - the only thing pulled is the Brush binary, on this node's first run. Licence note: the pack is AGPL-3.0 as of 1.2.7 (earlier versions stayed MIT) - fine for personal use, read it before you ship anything built on it.

    What bites people

    The two gotchas worth knowing before your first bake:

    • Tens of minutes of silence. At 30000 steps expect 10–30 minutes depending on your GPU. The progress bar moves, the console stays quiet, and the node looks hung. It isn't. A splat is a durable asset you'll reuse, not a generation you'll re-roll. Splat training is also VRAM-hungry; 16GB is a comfortable floor.
    • The dataset shape matters. It must be a proper COLMAP/SplatKit structure, not a folder of loose photos. Feed it an arbitrary folder and you get a FileNotFoundError or a cryptic Brush failure. Capture with a phone-scan app and let SplatKit (or the scanner's own export) build the sparse reconstruction first.

    Platform note: Brush ships prebuilt binaries for Windows amd64, macOS arm64, and Linux amd64. On anything else the node tells you rather than guesses - build from source and hand it in via brush_path.

    If you've been avoiding splat training over the 3D-Pack install horror stories: this is the escape hatch. Same output, none of the build fight.

    CategoryMpiNodes/Splat

    Inputs (6)

    NameTypeDefaultDescription
    dataset_pathSTRING
    total_stepsINT30000100–200000
    export_everyoptINT5000100–200000
    sh_degreeoptINT30–3
    max_splatsoptINT1000000010000–100000000
    brush_pathoptSTRING

    Outputs (1)

    NameTypeDescription
    ply_pathSTRING