Inspect, convert, diff, and merge model checkpoints. The missing Swiss Army knife for ML weights.
Project description
ckptkit
The missing Swiss Army knife for model checkpoints.
ckptkit inspects, diffs, validates, and merges model checkpoints without loading them into GPU memory. Parse SafeTensors headers in milliseconds, compare checkpoints after fine-tuning, merge LoRA adapters, and validate file integrity — all from the command line or Python.
Why ckptkit?
Working with model weights means dealing with:
- "What layers are in this checkpoint?" →
ckptkit info - "What changed after fine-tuning?" →
ckptkit diff - "Is this download corrupt?" →
ckptkit validate - "Merge this LoRA adapter into the base" →
merge_lora_state_dicts() - "Show me parameter counts per layer" →
ckptkit stats
mergekit handles model merging (TIES, DARE, SLERP), but nobody built the everyday checkpoint utility. ckptkit is that tool.
Install
pip install ckptkit
With SafeTensors support (recommended):
pip install ckptkit[safetensors]
With PyTorch support:
pip install ckptkit[torch]
Everything:
pip install ckptkit[all]
CLI
Inspect
# See what's inside a checkpoint
ckptkit info model.safetensors
# JSON output for scripts
ckptkit info model.safetensors --json | jq '.n_parameters'
Diff
Compare two checkpoints — see what changed during fine-tuning:
ckptkit diff base_model.safetensors finetuned_model.safetensors
Validate
Check for corruption before a long training run:
ckptkit validate model.safetensors
# ✓ model.safetensors: valid (safetensors)
Stats
ckptkit stats model.safetensors
Python API
Inspect
from ckptkit import inspect
info = inspect("model.safetensors")
print(f"Parameters: {info.n_parameters:,}")
print(f"Tensors: {info.n_tensors}")
print(f"Format: {info.format.value}")
for t in info.tensors[:5]:
print(f" {t.name}: {t.shape} {t.dtype.value} ({t.numel:,} params)")
Diff
from ckptkit import diff, format_diff
result = diff("base.safetensors", "finetuned.safetensors")
print(f"Changes: {result.n_changes}")
print(f"Identical: {result.n_identical} / {result.n_shared}")
for entry in result.entries:
print(f" {entry.change_type}: {entry.tensor_name} — {entry.details}")
Merge LoRA
import torch
from ckptkit import merge_lora_state_dicts
base = torch.load("base_model.bin", map_location="cpu")
adapter = torch.load("adapter_model.bin", map_location="cpu")
merged = merge_lora_state_dicts(base, adapter, alpha=1.0)
torch.save(merged, "merged_model.bin")
Validate
from ckptkit import validate
result = validate("model.safetensors")
if not result.valid:
for issue in result.issues:
print(f" {issue.severity}: {issue.message}")
Stats
from ckptkit import inspect, stats_from_info
info = inspect("model.safetensors")
stats = stats_from_info(info)
print(f"Total size: {stats.total_size_human}")
for dtype, count in stats.dtype_counts.items():
print(f" {dtype}: {count:,} parameters")
Format support
| Format | Inspect | Diff | Validate | Merge |
|---|---|---|---|---|
| SafeTensors | ✓ (header-only, fast) | ✓ | ✓ (full integrity) | ✓ |
| PyTorch (.bin/.pt) | ✓ (requires torch) | ✓ | basic | ✓ |
How it works
SafeTensors inspection is fast because the format puts all tensor metadata (names, shapes, dtypes, offsets) in a JSON header at the start of the file. ckptkit reads only the first few KB, never loading the actual weight data.
LoRA merging performs base_weight += alpha * (lora_B @ lora_A) for each matched layer pair, with automatic key resolution for common adapter formats (PEFT, HuggingFace).
See Also
Part of the stef41 LLM toolkit — open-source tools for every stage of the LLM lifecycle:
| Project | What it does |
|---|---|
| tokonomics | Token counting & cost management for LLM APIs |
| datacrux | Training data quality — dedup, PII, contamination |
| castwright | Synthetic instruction data generation |
| datamix | Dataset mixing & curriculum optimization |
| toksight | Tokenizer analysis & comparison |
| trainpulse | Training health monitoring |
| quantbench | Quantization quality analysis |
| infermark | Inference benchmarking |
| modeldiff | Behavioral regression testing |
| vibesafe | AI-generated code safety scanner |
| injectionguard | Prompt injection detection |
License
Apache-2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ckptkit-0.3.0.tar.gz.
File metadata
- Download URL: ckptkit-0.3.0.tar.gz
- Upload date:
- Size: 44.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d67df27288b7d4f3e193cdc0634f2f05e12f67ef6bab8b2c44ecc466fcddbcc4
|
|
| MD5 |
586f2f1502d08806b983df2c561e9edf
|
|
| BLAKE2b-256 |
2ee5aac6341db4b5001c407f64636631f0a85178fa71256f4860586112e728ec
|
File details
Details for the file ckptkit-0.3.0-py3-none-any.whl.
File metadata
- Download URL: ckptkit-0.3.0-py3-none-any.whl
- Upload date:
- Size: 30.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
15f28b9ac4ad6d21679e5dcea32bcb3eeccebaa95e923c1a2d58887057f97ff5
|
|
| MD5 |
30dadd3de2ac9848e3a37658f317881e
|
|
| BLAKE2b-256 |
4230d7fde04bba6cdcba42db9efa0d3add5a5da39ff2cb408a0c1e9e9fff1160
|