Two disks, two jobs#
| Local NVMe scratch | Persistent volume | |
|---|---|---|
| Mounted at | /mnt/scratch | /mnt/vol |
| Size | Fixed by the node (2 TB on a 1× H100) | 10–4,000 GB, your choice |
| Price | Included | $0.08 per GB-month |
| Survives a stop or a reclaim | No | Yes |
| Moves to another instance | No | Yes, one at a time |
| Put here | Datasets being read at speed, shard files, temporary output, the model cache | Checkpoints, final weights, results, anything a resume depends on |
Mount points#
$ df -h /mnt/vol /mnt/scratch Filesystem Size Used Avail Mounted on /dev/vdb 500G 12G 488G /mnt/vol # persistent volume /dev/nvme0n1 2 TB 0G 2 TB /mnt/scratch # wiped with the instance # Point the tool caches at scratch, the outputs at the volume. $ export HF_HOME=/mnt/scratch/hf $ export TORCH_HOME=/mnt/scratch/torch $ export OUTPUT_DIR=/mnt/vol/run-42
The volume is mounted before your entrypoint runs, so a container that writes to /mnt/vol on the first line works with no ordering tricks. If no volume is attached, /mnt/vol does not exist — check for it rather than assuming.
What survives what#
| Event | Scratch | Volume | Instance config |
|---|---|---|---|
| You stop the instance | Lost | Kept | Kept |
| Spot reclaim | Lost | Kept | Kept |
| Auto-relaunch on new capacity | Empty again | Reattached | Reused |
| You terminate the instance | Lost | Kept, detached | Gone |
| Balance reaches zero | Lost with the stop | Kept and still billed | Kept |
| You delete the volume | — | Gone, billing stops | — |
Getting data in#
There are no egress or ingress fees, and instances have full outbound access at node bandwidth. Pull from wherever your data lives:
# From your machine $ rsync -avP ./dataset/ root@<instance>:/mnt/scratch/dataset/ # From a model hub (cache on scratch, weights that matter on the volume) $ HF_HOME=/mnt/scratch/hf huggingface-cli download meta-llama/Llama-3.1-8B # From your own object storage $ rclone copy s3:my-bucket/corpus /mnt/scratch/corpus --transfers 16 # From a private registry, as part of your own image $ docker login ghcr.io && docker pull ghcr.io/acme/trainer:2026-09
Getting results out#
Same road, opposite direction — and still not metered. A useful habit on spot: push final artefacts off the platform as part of the job, so a finished run does not depend on a volume you might delete later.
Sizing a volume#
A rough rule for training: weights × 4 for a full-precision optimiser state, plus two or three checkpoints, plus room for the final export. Fine-tuning with LoRA needs a fraction of that — adapters are megabytes, not gigabytes.
| Job | Volume that fits comfortably | Per month |
|---|---|---|
| LoRA on a 7B model | 100 GB | $8.00 |
| Full fine-tune of a 7B model | 250 GB | $20.00 |
| Serving a 70B model from local weights | 500 GB | $40.00 |
| A team corpus plus several model versions | 2,000 GB | $160.00 |
Volumes cannot be resized in place today. Create a larger one, copy across while both are attached to the same instance, then delete the old one — or keep the dataset outside the platform and pull it again.
What it costs#
$0.08 per GB-month, prorated by the minute, from creation to deletion — attached or not, running or not. Nothing else about storage is billed: no I/O charges, no snapshot fees, no transfer fees.
A 1 TB volume left behind costs $80.00 a month. The console lists every volume with its size and monthly cost — delete the ones whose job finished.