Train on any mix of your data.
Give each training set a weight, and set a seed. Spiral streams the batches from storage, in the same order on one GPU or many, with no export step.
Exact table versions, a fixed order, and device batches
Each new mix starts with an export.
A mix is usually a set of weights over named datasets or exported shards. To train on 30% failures and 70% nominal episodes, a team first exports both subsets. The team then manages how stale they get, how they shuffle, and how a stopped run resumes.
Declare the mix, and Spiral plans every batch.
You name each table, its weight, and a seed. Nothing is exported.
Spiral reproduces every batch.
The run record names every table version, the seed, and the weights, so every batch is fixed before the first step. None of these three events changes what the model sees.
Keep the training loop you have.
Start with ScanDataset in a standard PyTorch DataLoader. Move to TrainLoader for weighted mixes, a fixed order, and exact resume.
Spiral feeds PyTorch and imports the dataset formats you have.

Before you connect the trainer.
A change to the seed, the weights, or a table version starts one. A restart or a new rank count does not.
Yes. A table can hold one checkpoint in each row: the weights as a file, the step, the run record, and the saved position. A restart reads one row and continues at its exact step.
You choose. Tables live in your own bucket or in Spiral-managed storage. Training reads them in place, with no copy into a separate training store.
The plan can decode H.264 with NVDEC, convert NV12 frames to tensors in fused CUDA kernels, and give the tensors to PyTorch through DLPack.
At the second mix. The first export is a script. By the second, you maintain an export pipeline, whatever the size of the corpus.
The model’s failures start the next loop.
How it works:GPU data loadingand Reversibility & isolation