Spirula Studio does Gaussian splatting on any graphics card

1 month ago

The left bicycle is a cloud of tiny coloured blobs. The right one is a solid model built from them. Spirula Studio made both, and it runs on NVIDIA, AMD, Intel and Apple graphics chips.

Ask about this presentation

Chapters

  1. 0:00Spirula Studio · Gaussian splatting on any graphics card
  2. 0:11What Spirula Studio makes, and from what
  3. 0:41Why a blob is mostly colour, and the catch in the number
  4. 1:00Several installs and an NVIDIA card, or one program
  5. 1:34The project’s screen: 10 million blobs in 6.23 GiB
  6. 2:01One blob is 59 numbers, and 48 of them are colour
  7. 2:30Each number costs 16 bytes in textbook training
  8. 3:05A range shared by 256 blobs turns decimals into two-byte codes
  9. 3:48The default keeps each blob under a third of its textbook size
  10. 4:25Interleaving the codes cut one read from 32 memory chunks to 2
  11. 5:03Other cards get the same maths without a rewrite
  12. 5:32Frames, masks, cameras and mesh all run inside the app
  13. 5:56The 10 million screenshot is a July test on a computer-made scene
  14. 6:40One maintainer, a changed camera solver, and a copyleft licence
  15. 7:17The whole video-to-mesh trip runs without an NVIDIA card
  16. 7:33Brush covers the same chips, and needs its cameras solved first
  17. 7:54Who else trains splats, and on what
  18. 8:18Who should install it this weekend, and who should wait
  19. 8:46Spirula Studio, Gaussian splatting on any graphics card
Show transcript
  1. The left bicycle is a cloud of tiny coloured blobs. The right one is a solid model built from them. Spirula Studio made both, and it runs on NVIDIA, AMD, Intel and Apple graphics chips.

    Slide text
    splat
    mesh
    the project’s demo reel

    Spirula Studio

    Gaussian splatting on any graphics card, from a phone video to a 3D scene
    GPL-3.0 open source one download NVIDIA, AMD, Intel, Apple
  2. Spirula Studio is a free app, built almost entirely by one developer. You give it photos or a phone video, and it gives back a 3D scene you can fly around. The technique is called Gaussian splatting. The scene becomes millions of tiny see-through coloured blobs, and together they redraw the place from any angle. The usual way to do this takes a stack of research code, and often an NVIDIA card. Spirula Studio is one program, and the project's own screen shows ten million blobs training in about six gigabytes of a laptop card's memory. I wanted to know how.

    Slide text

    Spirula Studio turns photos or a phone video into a 3D scene you can fly around

    the project’s demo reel
    10 million blobs
    6.23 GiB of graphics memory
    the project’s own screenshot, laptop card
  3. By the end, you'll know why a blob is mostly colour. You'll know how Spirula squeezes that colour into two bytes a number. You'll also know the catch. The ten million figure comes from the project's own test, on a computer-made scene, early in the training run. And I'll tell you whether I'd install it over Brush, the free trainer that already runs on AMD and Apple.

    Slide text
    The garage scene from the project’s demo reel, dimmed behind the slide copy
    1
    Why a blob is mostly colour
    2
    How that colour shrinks to two bytes
    3
    The catch in the 10 million number
    4
    Whether I’d pick it over Brush
  4. The usual recipe starts with Python and PyTorch, the programming language and the AI toolkit most research code for this is written in. Then you install COLMAP, a separate tool whose job is working out where the camera stood for every photo. Some trainers also want CUDA, NVIDIA's own toolkit for running code on its cards. Spirula Studio is one self-contained program. It cuts your video into frames, solves the cameras, masks out people who walked through the shot, trains the blobs and builds the mesh, a solid surface of triangles that games and 3D tools open. All five jobs happen inside the same download.

    Slide text

    The usual recipe is several installs, and often an NVIDIA card

    Python and PyTorch
    COLMAP, installed separately
    often an NVIDIA card, for CUDA
    Spirula Studio
    one self-contained program
    video frames cameras masks splat mesh
    camera solving, the project’s demo reel
  5. This is the project's own screenshot, mid-training on an NVIDIA RTX 5070 Laptop card. The counter reads ten million blobs. The app is using six point two three gigabytes of the card's own memory, and the card holds seven point nine six gigabytes. The scene is computer-generated, a spiky mathematical shape, and the run is still early. I'll come back to both. Ten million blobs in six gigabytes needs a trick, and the trick starts with what one blob is made of.

    Slide text

    The project’s screen shows 10 million blobs in 6.23 GiB

    The project’s own screenshot of the July build, called Spirulae Splat, training a spiky computer-made shape with 10.00M splats and VRAM 6.23 / 6.79 / 7.96 GiB in its status row
    computer-made scene · step 4,239 of 30,000
    the project’s own screenshot, July build
    the counter
    10.00M splats
    graphics card memory
    VRAM 6.23 / 6.79 / 7.96 GiB
    graphics card memory
  6. Every blob is a list of fifty-nine numbers. Three numbers say where the blob sits. Three say how big it is, and four say which way it's turned. One number says how see-through it is. The other forty-eight numbers are all colour. Three of them hold the blob's base colour. The last forty-five let the blob change colour with the angle you look from, the way a shiny car door looks different from the left and from the right. So about four fifths of every blob is colour, and most of that colour is the angle part. Those forty-five numbers are where Spirula starts cutting.

    Slide text
    changes with the viewing angle
    where 3
    size 3
    turn 4
    see-through 1
    base colour 3
    colour by angle 45
    colour: 48 of 59, about four fifths
    the project’s training code
  7. Training makes every number more expensive. The textbook method keeps four copies of each one. The first copy is the value itself. The second is the gradient, the nudge that says which way the value should move after each training step. The other two are notes the training keeps, two running averages of how that number has been moving, so the next nudge is steadier. Each copy takes four bytes, the usual size for a decimal number in memory. By my sum, that makes nine hundred and forty-four bytes a blob. For ten million blobs, the textbook method needs eight point eight gigabytes before a single photo loads. This card holds seven point nine six gigabytes. Spirula spends a lot less.

    Slide text
    value
    4 bytes
    nudge
    4 bytes
    note 1
    4 bytes
    note 2
    4 bytes
    note 1
    4 bytes
    note 2
    4 bytes
    59 numbers · 4 copies · 4 bytes = 944 bytes a blob
    ten million blobs
    textbook method: 8.79 GiB
    the card: 7.96 GiB
    textbook cost, our sum from the project’s memory code
  8. This is the part I like most. Spirula stores each of those forty-five angle numbers as a code, a whole number between zero and sixty-five thousand five hundred and thirty-five. The code takes two bytes instead of four. Every block of two hundred and fifty-six blobs shares one smallest value and one largest value. To read a number back, the program starts at that block's smallest value and moves toward the largest by the code's share of the range. A code halfway up the range lands halfway between the two. The notes for those forty-five numbers shrink further, to one byte each, a whole number from zero to two hundred and fifty-five. The other fourteen numbers keep full-size values: where the blob sits, its size, its turn, how see-through it is, and its base colour. Their notes drop to two bytes each.

    Slide text
    1.2873
    4 bytes
    code 43,228
    2 bytes
    example
    every block of 256 blobs shares one smallest and one largest value
    value = low + (high - low) * code / 65535
    example: smallest 0.1, largest 1.9, and code 43,228 reads back as 1.2873
    45 angle numbers
    value 2 bytes · notes 1 byte each
    other 14 numbers
    value 4 bytes · notes 2 bytes each
    the project’s design notes
  9. The nudge slot goes away too. In the default setting, Spirula works out each blob's nudge at full precision and applies it in the same pass, so the nudge never gets written to memory. Add it all up and nine hundred and forty-four bytes a blob drops to two hundred and ninety-two. Ten million blobs now need about two point seven gigabytes for the numbers and their notes, about a third of the card. My sum leaves out the training photos and the working space for each view, and those live in the rest of that six point two three gigabytes. The project calls this default level one. Level zero keeps every number full size and still skips the nudge slot. That comes to seven hundred and eight bytes a blob.

    Slide text
    value
    4 bytes
    nudge
    4 bytes
    note 1
    4 bytes
    note 2
    4 bytes
    the nudge is never written to memory
    full size is level 0 · default is level 1
    ten million blobs
    textbook 8.79 GiB
    default 2.72 GiB
    the card: 7.96 GiB
    our sum from the project’s memory code; photos and working space not included
  10. The codes are also laid out for the way a graphics card reads memory. The card works on a whole batch of blobs at once, and it fetches memory in fixed-size chunks. In the old layout, one batch reading one colour number touched thirty-two separate chunks. Spirula now interleaves the codes across each block of blobs, and the same read touches two. The project timed the piece of each training step that works out the nudges and applies them, on a five-million-blob bicycle scene, with an RTX 4080 Super desktop card. On the NVIDIA path, that piece went from thirteen point eight milliseconds to eight point five. On the cross-vendor path, it went from twenty point three milliseconds to thirteen point one.

    Slide text
    old layout: 32 chunks
    interleaved: 2 chunks
    NVIDIA path (CUDA)
    old layout 13.8 ms · interleaved 8.5 ms
    cross-vendor path (Vulkan)
    old layout 20.3 ms · interleaved 13.1 ms
    the project’s timing · the nudge-and-update step · 5 million blobs · RTX 4080 Super
  11. The cross-vendor path runs on Vulkan, a graphics standard, and Spirula's builds use it on NVIDIA, AMD, Intel and Apple chips. The maths is written once and built two ways, one version for CUDA and one for Vulkan. Each piece of that maths also ships in a few variants, and the program picks the one your card can run when it starts. Some Intel chips lack one instruction, the one that lets many of the card's workers add to the same number safely. Those chips get a slower loop that does the same job, and training still runs.

    Slide text
    one copy of the maths
    CUDA
    NVIDIA
    Vulkan
    NVIDIA, AMD, Intel, Apple
    standard slower fallback no 64-bit whole numbers
    picked for your card at startup
    some Intel chips: a slower adding loop, and training still runs
    the project’s backend docs
  12. Spirula pulls frames out of your video and picks which ones to keep. It masks out people with SAM 3, Meta's model for cutting people and objects out of a picture, so a passer-by drops out of the finished scene. It solves the cameras itself, and the project's demo reel claims five thousand three hundred and seventy-four photos solved in twenty-five minutes on that same laptop card. It exports the mesh, runs whole batches of captures, and has run on Macs since August.

    Slide text
    AI masking with SAM 3, the project’s demo reel
    5,374 photos solved in 25 minutes on a laptop card, the project’s claim
    frames picked from video mesh export batch runs macOS since August
  13. The screenshot with ten million blobs comes from a July build, when the app still had its old name, Spirulae Splat. The scene is a mathematical shape rendered by a computer. The run sits at step four thousand two hundred and thirty-nine of thirty thousand. Six point two three gigabytes is what the app itself uses. Six point seven nine gigabytes is everything running on the card, and seven point nine six gigabytes is the card's full size. The quality cost of the two-byte codes is unpublished. The settings file lists level one under speed and memory options, and says in its own words that none of them change the result. The project hasn't published an image comparison to back that line. So I'd treat six point two three gigabytes as the figure for this scene, at this step.

    Slide text
    The project’s own screenshot of the July build, called Spirulae Splat, training a spiky computer-made shape with 10.00M splats and VRAM 6.23 / 6.79 / 7.96 GiB in its status row
    old name: Spirulae Splat
    200 camera views of a computer-made shape, half resolution
    step 4,239 of 30,000
    the app
    6.23 GiB
    whole card in use
    6.79 GiB
    the card
    7.96 GiB
    “none of these change the result”
    the project’s settings file, on its speed and memory options
    image quality at level 1: no published comparison
  14. Spirula Studio is almost entirely one developer's work, and the README says so. This weekend's build changed the camera solver, and the release notes ask you to file an issue if it got worse. The licence is GPL version three. If you ship a program built on Spirula's code, your program's code has to be open too. If I were building a paid product, that's where I'd stop first. The downloadable builds also decode H.264 and H.265 video on the graphics card, two of the most common video formats. The project's build docs flag those formats for patent risk, and a build from source leaves that part off unless you switch it on. And SAM 3 downloads the first time you mask, under Meta's own licence.

    Slide text
    built almost entirely by one developer
    this weekend’s build changed the camera solver and asks you to report it if it got worse
    GPL-3.0: ship a program built on it, and your code opens too
    the downloads include H.264 and H.265 decoding, which the build docs flag for patents
    SAM 3 downloads on first use, under Meta’s own licence
    the project’s README, release notes and build docs
  15. If your laptop has an AMD or Intel chip, or you're on a Mac, Spirula is the only tool in this video that solves its own cameras and runs on your hardware. The whole trip, from video to frames to cameras to blobs to mesh, is one download. A new build has landed about once a week this month.

    Slide text
    the exported mesh, the project’s demo reel
    video to mesh in one download, a new build about once a week
  16. Brush, a free and open source splat trainer, already runs on AMD, Intel and Apple, and even in a web browser. That's true. Brush starts from cameras you've already solved, in COLMAP or a similar tool. Spirula solves the cameras and masks the frames itself, so your phone video goes straight in. If my cameras were already solved, I'd still reach for Brush, because it runs in a browser tab.

    Slide text
    Brush
    AMD, NVIDIA, Intel · macOS, Windows, Linux, Android · in a browser
    starts from cameras you already solved (COLMAP or Nerfstudio data)
    starts from cameras you already solved (COLMAP or Nerfstudio data)
    Spirula Studio
    NVIDIA, AMD, Intel, Apple
    solves cameras and masks frames itself
    solves cameras and masks frames itself
    Brush’s README
  17. OpenSplat runs on NVIDIA, AMD and Apple graphics, and it also needs cameras from another tool. LichtFeld Studio takes COLMAP input and runs on NVIDIA only. Postshot, a desktop app from a company called Jawset, does solve its own cameras. It needs Windows and an NVIDIA card, and its free plan is for non-commercial use. As I read this table, Spirula Studio is the only one that solves its own cameras and runs on AMD, Intel and Apple.

    Slide text

    Two of the five solve their own cameras, and one needs NVIDIA

    solves its own cameras
    graphics
    licence
    Brush
    ✗
    NVIDIA, AMD, Intel, Apple, browser
    Apache-2.0, fine in closed products
    OpenSplat
    ✗
    NVIDIA, AMD, Apple, even the processor
    AGPL-3.0, open your code too
    LichtFeld Studio
    ✗
    NVIDIA only
    GPL-3.0, open your code too
    Postshot
    ✓
    NVIDIA on Windows
    free for non-commercial use
    Postshot
    ✓
    NVIDIA on Windows
    free for non-commercial use
    Spirula Studio
    ✓
    NVIDIA, AMD, Intel, Apple
    GPL-3.0, open your code too
    Spirula Studio
    ✓
    NVIDIA, AMD, Intel, Apple
    GPL-3.0, open your code too
    each project’s README and Jawset’s pricing page
  18. Should you install it? If you have an AMD or Intel laptop, or a Mac, and a phone video of a room, I'd install it this weekend. If you need camera solving you can trust for client work, I'd wait a few releases, because this weekend's build changed the solver and one person maintains it. And if Postshot already runs on your NVIDIA card and its licence fits your work, you don't need Spirula at all. The two-byte codes are the part I'm most curious about. I'd want the project to publish a side-by-side image test before I trusted them on paid work.

    Slide text
    install this weekend
    AMD, Intel or Mac, and a phone video
    wait
    camera solving for client work
    skip
    Postshot already fits your card and licence
    what I’d want next: a published quality test of the codes
  19. Spirula Studio has downloads for Windows, Linux and Macs with Apple chips, under GPL version three. What graphics card is in your laptop, and has it ever trained a splat? Tell me in the comments. It's harry seven five five seven five five eight, slash spirula studio, on GitHub. New repo tomorrow.

    Slide text
    The Spirula Studio icon, an orange and blue swirl
    Windows · Linux · macOS on Apple chips GPL-3.0 this weekend’s build
    What graphics card is in your laptop, and has it trained a splat?
    github.com/harry7557558/spirula-studio

What happened in AI today, in your inbox

One short email each evening. Read it and you’re caught up.

Built with ❤️ in New York