DEV Community

Jingya for Meshy AI

Posted on Edited on Originally published at meshy.ai

Overmind: Cut ML Model Loading from 15s to 0.2s

Based on an article by Bin Wang, Senior Infrastructure Engineer at Meshy. Adapted for DEV from the original Meshy engineering post.

Your model files are already cached in RAM. Why does loading the model still take seconds?

At Meshy, switching between models made this question hard to ignore. Keeping every checkpoint in GPU memory was impractical, while repeatedly loading weights interrupted both inference workflows and development.

We built Overmind, an open-source model-loading cache, to make repeated loads cheaper.

A warm disk cache is only part of the solution

The Linux page cache helps avoid disk reads. Reconstructing a model can still involve moving gigabytes of tensor data through deserialization buffers and newly allocated storage.

Overmind separates tensor metadata from the underlying bytes. Instead of repeatedly copying those bytes, it reconstructs tensor storage over shared memory.

A separate server keeps the cache available across client-process restarts. The design and implementation are covered in the original engineering walkthrough.

How shared memory becomes a model

The mechanism connects a few useful building blocks:

  • memfd_create provides anonymous memory accessible through a file descriptor.
  • Memory mapping exposes that allocation to participating processes.
  • A Python memoryview exposes the mapped buffer.
  • A small C++ helper constructs PyTorch UntypedStorage over that buffer without copying its contents.

Serialization records how to reconstruct the objects around the shared storage. GPU transfer remains a separate operation.

Real model stacks also require special handling. Overmind restores dynamically loaded diffusers modules, supplies serialization support for bitsandbytes parameters, and handles model arguments that reference previously cached components. Quantization runs in a temporary subprocess so the cache server does not retain the CUDA state created during that work. See the technical overview on Hugging Face.

Try it in an existing loading workflow

Install the package:

pip install overmind-cache
Enter fullscreen mode Exit fullscreen mode

Enable the supported patches before loading models:

import torch
import overmind.api

overmind.api.monkey_patch_all()

from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
)

pipeline.to("cuda")
Enter fullscreen mode Exit fullscreen mode

The first load populates the cache. Later loads can reuse it.

For applications that prefer an explicit call, the library also exposes load:

import torch
from diffusers import DiffusionPipeline
from overmind.api import load

pipeline = load(
    DiffusionPipeline.from_pretrained,
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
)

pipeline.to("cuda")
Enter fullscreen mode Exit fullscreen mode

These examples illustrate the integration options; they are not the script used for the benchmark below. The repository README documents supported loaders and server-management commands.

What the benchmark actually measures

The published benchmark uses a VAE and two ControlNets with a Stable Diffusion pipeline, running on an Intel i9-11900K and an RTX 4090.

Scenario Total loading time, including GPU transfer
Without Overmind, across five runs 5.65–6.27 s
First load with Overmind 24.20 s
Subsequent loads with Overmind 1.12–1.15 s

The original headline’s 0.2 seconds should not be read as the complete loading path. In this benchmark, the cached pipeline-loading step takes approximately 0.20–0.21 seconds; transferring weights to CUDA still takes approximately 0.86–0.90 seconds. Full benchmark

That makes the tradeoff concrete: cache initialization is more expensive, and repeated loads recover that cost.

Measure the part your application repeats

When evaluating a loading cache, measure three stages separately:

  1. Initial cache population.
  2. Reconstruction from an existing cache.
  3. Transfer to the target device.

Then compare the complete workflow your application actually repeats. A service that loads once and stays running has a different cost profile from a development loop that starts a new process after every edit.

Overmind is available under Apache 2.0. Explore the implementation and usage details on GitHub.

When you profile model startup, where does most of the time go: reading weights, reconstructing the model, or moving it to the GPU?

Top comments (0)