Spirula Studio does Gaussian splatting on any graphics card

1 hour 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

Ask about this presentation

Answers are generated from 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

Spirula Studio · Gaussian splatting on any graphics card

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 sourceone downloadNVIDIA, AMD, Intel, Apple

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.

What Spirula Studio makes, and from what

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

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.

Why a blob is mostly colour, and the catch in the number

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

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.

Several installs and an NVIDIA card, or one program

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
videoframescamerasmaskssplatmesh
camera solving, the project’s demo reel

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.

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

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

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.

One blob is 59 numbers, and 48 of them are colour

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

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.

Each number costs 16 bytes in textbook training

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

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.

A range shared by 256 blobs turns decimals into two-byte codes

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

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.

The default keeps each blob under a third of its textbook size

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

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.

Interleaving the codes cut one read from 32 memory chunks to 2

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

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.

Other cards get the same maths without a rewrite

one copy of the maths
CUDA
NVIDIA
Vulkan
NVIDIA, AMD, Intel, Apple
standardslower fallbackno 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

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.

Frames, masks, cameras and mesh all run inside the app

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 videomesh exportbatch runsmacOS since August

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.

The 10 million screenshot is a July test on a computer-made scene

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

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.

One maintainer, a changed camera solver, and a copyleft licence

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

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.

The whole video-to-mesh trip runs without an NVIDIA card

the exported mesh, the project’s demo reel
video to mesh in one download, a new build about once a week

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.

Brush covers the same chips, and needs its cameras solved first

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

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.

Who else trains splats, and on what

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

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.

Who should install it this weekend, and who should wait

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

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.

Spirula Studio, Gaussian splatting on any graphics card

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

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.