trash-panda
Run models bigger than your GPU: stream weights layer by layer across GPU, RAM and disk.
Status: early (Phase 1). The API may change. The package name is temporary.
Why
Loading a big checkpoint the usual way needs two full copies in RAM, and a model that does not fit in VRAM simply fails. trash-panda builds the model without allocating weights (meta device), reads the checkpoint tensor by tensor, and keeps each block of the model wherever it fits best:
| Tier | Where the block waits | Cost per forward pass |
|---|---|---|
gpu |
on the GPU, in compact form (for example fp8) | only the expansion to bf16 |
ram |
in system RAM, in compact form | a transfer over PCIe |
disk |
in the checkpoint file | a file read |
Only one block at a time is expanded to the compute dtype, so peak VRAM is roughly one block plus your activations, whatever the model size.
It works with any floating-point checkpoint: fp32, fp16 and bf16 are streamed as they are (no quantization needed), and fp8 (with or without scale tensors) is kept compact so more fits.
Install
Install PyTorch first (the build that matches your GPU), then:
pip install git+https://github.com/yla382/trashpanda.git
Use
import torch
from trash_panda import plan, stream_load, install_offload
with torch.device("meta"): # the structure only, no weights in memory
model = MyModel(config).eval()
p = plan(model, "model.safetensors") # what fits where, with warnings
print(p)
print(stream_load(model, "model.safetensors", plan=p)) # lazy load straight into the right tiers
install_offload(model) # hooks that stream blocks during forward
out = model(x)
Automatic or manual
plan() decides from the checkpoint's sizes and the free memory on your machine. Everything it decides can be
overridden:
from trash_panda import Plan, Tier, plan
p = plan(model, path, resident_blocks=12, max_vram="9GB", min_free_ram="4GB", compute_dtype="bf16")
p.assign(Tier.DISK, indices=[27]) # edit it afterwards
p = Plan.manual(resident=["blocks.0.", "blocks.1."], streamed=["blocks.2.", "blocks.3."]) # or write it by hand
Or skip plans entirely and give prefixes directly (the low-level API):
stream_load(model, path, offload_prefixes=["blocks."], resident_prefixes=["blocks.0."], compute_dtype="bf16")
offload_blocks(model.blocks, device="cuda", compute_dtype=torch.bfloat16)
Storage dtype
By default weights are kept exactly as stored in the file. Optionally, storage_dtype="bf16" casts waiting
weights down, and storage_dtype="fp8" quantizes large 2-D weights to fp8 on load (lossy; small tensors such
as norms are left alone).
What it does not do (yet)
- prefetching the next block while the current one computes
- int8 / 4-bit formats (fp8 and ordinary float dtypes only)
- LoRA/LoKr adapters, multi-GPU, model definitions
Development
pip install pytest psutil
pytest
Tests run on the CPU with a tiny fake model.
License
Apache-2.0
Metadata
Release files for dumpsterpanda 0.0.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| dumpsterpanda-0.0.3.tar.gz | 21.2 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dumpsterpanda-0.0.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 46.2 kB
Release files / dumpsterpanda-0.0.3.tar.gz
| Download URL | dumpsterpanda-0.0.3.tar.gz |
|---|---|
| Size | 21.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a78645437a7d0086afce758de754654e8ff5a0015757ad57982fc89aad87119a
|
|
BLAKE2b-256 checksum How to use checksums |
ad2d26eff425ee83581aafe6e3882e86ab4cd22b3355d98f3034a580359eefbb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logRelease files / dumpsterpanda-0.0.3-py3-none-any.whl
| Download URL | dumpsterpanda-0.0.3-py3-none-any.whl |
|---|---|
| Size | 25.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b2d577c7ee05b120330a72d7e09acb013724952f110cb8a9f6afd03ea762e78c
|
|
BLAKE2b-256 checksum How to use checksums |
b2b78277ea71d67ce8a9f02ac69b39821b5007cd393b94daab0a12696ddbfc24
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logSecurity for dumpsterpanda 0.0.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for dumpsterpanda-0.0.3.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.