Image Feature Extraction
Transformers
Safetensors
clip_vitb_mini
feature-extraction
clip
knowledge-distillation
consensus-distillation
vit
custom_code
Instructions to use AbstractPhil/clip-vitb-mini-distilled with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use AbstractPhil/clip-vitb-mini-distilled with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-feature-extraction", model="AbstractPhil/clip-vitb-mini-distilled", trust_remote_code=True)# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("AbstractPhil/clip-vitb-mini-distilled", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
File size: 12,379 Bytes
dac64fd ebe5983 dac64fd f04f5f0 dac64fd ebe5983 dac64fd ebe5983 dac64fd ebe5983 dac64fd ebe5983 dac64fd ebe5983 dac64fd ebe5983 8359b6f ebe5983 5e4ec21 ebe5983 1d58a6f 5e4ec21 ebe5983 f04f5f0 ebe5983 dac64fd ebe5983 dac64fd ebe5983 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 | ---
license: apache-2.0
library_name: transformers
pipeline_tag: image-feature-extraction
tags:
- clip
- knowledge-distillation
- consensus-distillation
- vit
- safetensors
- custom_code
---
# clip-vitb-mini-distilled
An **8.66M-parameter ViT image encoder** (10.0% of a CLIP-B/16 image
tower) producing 512-d embeddings compatible with the
[CLIP-B/16 LAION-2B](https://huggingface.co/laion/CLIP-ViT-B-16-laion2B-s34B-b88K)
text tower. The primary checkpoint was distilled on **CC12M (10,968,539
images)** against the **generalized-Procrustes consensus of five CLIP
teachers** β never against the deployment teacher β and carries a frozen
512Γ512 rotation that maps its outputs into the deployment frame, where
it outperforms the student distilled directly against that teacher on
every task gauge, both seeds (full tables below).
## Quick start (AutoModel)
```python
import torch
from transformers import AutoModel, AutoImageProcessor
repo = "AbstractPhil/clip-vitb-mini-distilled"
model = AutoModel.from_pretrained(repo, trust_remote_code=True).eval()
proc = AutoImageProcessor.from_pretrained(repo)
px = proc(images=[img], return_tensors="pt")["pixel_values"]
emb = model.get_image_features(px) # (1, 512), L2-normalized,
# deployment (LAION-B/16) frame
```
The rotation is applied by default (`config.apply_rotation`); pass
`apply_rotation=False` to `get_image_features` for the raw consensus-frame
embedding. Weights are safetensors; the modeling code is in this repo
(`modeling_clip_mini.py`, `configuration_clip_mini.py`).
**Why a rotation exists at all β and when it doesn't.** This model's
consensus target is a generalized-Procrustes *running mean* of five
teachers, which has no privileged frame: the student lands in the
consensus frame rather than any teacher's, so a fitted rotation carries
it the rest of the way. That is a property of how the target was built,
not of consensus distillation. A sibling campaign built its consensus by
mapping every teacher into the frame of one *reference member* of the
set; its frame gap fell monotonically to ~.001 during training and it
ships with no rotation. If you build your own consensus target, pick a
reference member for a pinned frame or a mean for symmetry β and know
which you chose.
**Evaluation-path note:** all published numbers were measured with the
tensor-bicubic evaluation pipeline (interpolate to 160px, CLIP norm β the
path implemented in `loader.py` and `train/dist_bed.py`). On CIFAR-scale
(32px) inputs the shipped `CLIPImageProcessor` path yields 0.5545 vs
0.5708 zero-shot for the same weights, a resize-path difference that
matters only for very small source images; verify against ledger numbers
with the tensor path.
## Repository inventory
| path | content |
|---|---|
| `model.safetensors`, `config.json`, `modeling_clip_mini.py`, `configuration_clip_mini.py`, `preprocessor_config.json` | the champion (consensus composite, seed 1) in AutoModel format, rotation baked in as a buffer |
| `cc12m/*_t88000.pt` | **all 18 CC12M finals** β every arm (InfoNCE, feature-MSE, SigLIP-pairwise, affinity-KL, consensus pure-MSE, consensus composite, gradient-operator/spread/verbatim battery variants), both seeds |
| `cc12m/rotation_s{0,1}.pt` | the frozen deployment rotations (fp32, 512Γ512, fit metadata included) |
| `cc12m/mid/*_mid.pt` | rolling mid-training snapshots, 15 of the 18 arm-seeds (last 20k-step multiple) β the trajectory record behind the set-point and descent analyses. The three absent ones (feature-MSE s0, InfoNCE s0, affinity-KL s0) trained before mid-checkpointing was added; their finals are complete. |
| `coco/*_t8000.pt` | **all 24 generation-one finals** (COCO budget: the six matrix arms + the six battery arms, both seeds) |
| `student_infonce_s0.pt` | the original generation-one release, kept at its historical path |
| `loader.py` | dependency-free loader for the raw checkpoints (rotation-aware) |
| `train/` | complete training code: bed, objectives, teacher loading/conversion, CC12M data path, consensus-target builder, reproduction guide (`train/TRAINING.md`) |
| `ledgers/*.jsonl` | per-run ledgers, both generations (COCO rows `steps=8000`, CC12M rows `steps=88000`; `eval_only` rows carry CIFAR-100) |
| `ledgers/frame_check_pod_s{0,1}.json` | rotation forensics, all arms, both seeds |
| `ledgers/rotated_eval_*.json` | full rotated evaluations (champion + pure-MSE consensus) |
| `article_cc12m_distillation.md` | the campaign report |
## Architecture
| field | value |
|---|---|
| type | ViT, CLS-token readout, linear projection head |
| hidden size / depth / heads | 240 / 12 / 4 |
| patch / input | 16 / 160Γ160 |
| projection | 512-d (deployment teacher's projection space) |
| parameters | 8,664,752 total (8,541,360 trunk + 123,392 head) |
| rotation buffer | 512Γ512 orthogonal, frozen; fitted post-hoc on 2,500 COCO-val pairs (fp64 orthogonal Procrustes), maps consensus frame β LAION-B/16 frame |
| preprocessing | shorter edge β 182 (bicubic), center-crop 160, CLIP mean/std |
## Results
**Headline β champion (rotated) vs the directly-distilled student, CC12M,
seed 0 / seed 1:**
| gauge | consensus composite + rotation | InfoNCE vs deployment teacher | teacher | random floor |
|---|---|---|---|---|
| zero-shot CIFAR-10 | **.5412 / .5708** | .5208 / .4979 | .946 | .0996 |
| zero-shot CIFAR-100 | **.2210 / .2487** | .1958 / .2092 | .759 | .0068 |
| COCO R@1 (iβt) | **.1322 / .1360** | .1252 / .1178 | .417 | .000 |
| COCO R@5 | **.3140 / .3300** | .2968 / .2910 | .669 | .001 |
Champion capability: 44.7% / 48.1% of the teacher's zero-shot mean
(CIFAR-10+100) at 10% of its image-tower parameters. Scaling arc across
data generations: 21.2% (118k images) β 42.0/41.5% (11M, direct InfoNCE)
β 44.7/48.1% (11M, consensus + rotation).
**Full CC12M matrix** (nine objectives Γ two seeds, 88k steps β 2.05
epochs; `agree` = cosine to deployment teacher unless *(own)* = the arm's
own target):
| objective | zs C10 | zs C100 | R@1 | R@5 | agree | eff. rank |
|---|---|---|---|---|---|---|
| InfoNCE (deployment teacher) | .5208/.4979 | .1958/.2092 | .1252/.1178 | .2968/.2910 | .543/.542 | 188/188 |
| feature MSE (mimicry) | .4429/.4826 | .1568/.1656 | .0760/.0716 | .2074/.1996 | .735/.738 | 154/153 |
| SigLIP-pairwise (768-d, own tower) | .4534/.4573 | .1625/.1702 | .0904/.0914 | .2278/.2278 | .742/.743 *(own)* | 155/154 |
| consensus composite (NCE+MSE) | .3271/.3928 | .1213/.1254 | .0344/.0374 | .1180/.1178 | .741/.742 *(own)* | 172/173 |
| + gradient operator | .3398/.3315 | .1181/.1335 | .0374/.0352 | .1160/.1154 | .742/.742 *(own)* | 173/172 |
| + spread force (1e-3) | .2819/.3370 | .1144/.1172 | .0386/.0328 | .1230/.1118 | .743/.741 *(own)* | 173/174 |
| verbatim ancestor recipe | .3188/.3616 | .1269/.1377 | .0554/.0506 | .1582/.1512 | .531/.530 | 185/185 |
| consensus pure-MSE | .2738/.2681 | .0575/.0567 | .0114/.0100 | .0410/.0458 | .814/.810 *(own)* | 141/142 |
| affinity (similarity-KL) | .1076/.1035 | .0117/.0105 | .0000/.0008 | .0012/.0022 | β.011/β.017 | 103/89 |
**Rotation forensics** (agreeβdeployment pre β post; zs C10 pre β post;
both seeds):
| arm | agree | zs |
|---|---|---|
| consensus composite | .304β.732 / .302β.731 | .327β.541 / .393β.571 |
| consensus pure-MSE | .297β.765 / .293β.763 | .274β.434 / .268β.394 |
| verbatim recipe | .258β.644 / .258β.642 | .319β.487 / .362β.532 |
| + gradient operator | .302β.731 / .304β.730 | .340β.517 / .332β.568 |
| + spread force | .304β.731 / .304β.728 | .282β.485 / .337β.489 |
| affinity | β.011β.304 / β.017β.301 | .108β.138 / .104β.132 |
| InfoNCE (control) | .543β.633 / .542β.631 | .521β.473 / .498β.503 |
Note the pure-MSE consensus row: rotated agreement .765/.763 *exceeds*
direct mimicry's in-frame .735/.738 β the consensus target carries the
deployment teacher's geometry better than direct distillation preserves
it β but without a contrastive term it cannot retrieve (rotated R@1
.046/.051). The composite's two terms are both load-bearing.
**Generation one (COCO, 118k images, 8k steps), for the scale
comparison:** mimicry .2693/.2657 zs vs InfoNCE .2668/.2308 (mimicry won
coarse zero-shot at small scale; the verdict reversed at 11M); InfoNCE
retrieval .0580/.0544 vs .0248/.0262; consensus raw .1543/.1609 β its
loss to single-teacher distillation was preregistered and refuted 2/2 at
this scale before reversing at CC12M with the rotation. Full
generation-one ledgers included.
## Training
Everything needed to reproduce any checkpoint is in `train/`
(`train/TRAINING.md` is the step-by-step guide). Summary:
| item | value |
|---|---|
| data (gen 2) | CC12M, 10,968,539 images via [pixparse/cc12m-wds](https://huggingface.co/datasets/pixparse/cc12m-wds); read by tar-offset index, no extraction |
| targets | precomputed teacher features, [bulk-cc12m-features](https://huggingface.co/datasets/AbstractPhil/bulk-cc12m-features) (fp16, unnormalized; L2-normalized per batch on GPU) |
| champion objective | symmetric InfoNCE (t=0.07) + per-sample MSE, against the 5-teacher GPA consensus mean |
| consensus target | generalized Procrustes mean of clip_b16_laion2b, clip_b32_openai, clip_b32_laion2b, clip_b32_datacomp, clip_b16_openai (5 iterations, fp64 alignment SVD on a fixed 10k subsample; converged mean alignment β 0.91) |
| optimizer | Adam 3e-4, weight decay 0, fp32, TF32 off (exception: the verbatim replication arm uses its source recipe β AdamW 0.01, warmup+cosine, clip 1.0) |
| schedule | 88,000 steps, batch 256 (β 2.05 epochs); gen-1: 8,000 steps on COCO (β 17.3 epochs) |
| seeds | student and data order CRC-derived from arm name + seed index; two seeds per arm |
| rotation | fitted after training: fp64 orthogonal Procrustes, studentβteacher, on the fixed 2,500-pair COCO-val split; frozen thereafter |
| hardware | one 24 GB GPU per run (peak 4.83 GB); ~8 h per CC12M run on an A40, CPU-decode bound |
## Evaluation protocol
CIFAR-10/100 zero-shot via the LAION-B/16 text tower ("a photo of a
{class}"), images tensor-upscaled (bicubic) to the student's 160px input;
teacher judged at its native 224px in the same harness; floor (random
init) and ceiling (teacher) bracket every table. COCO retrieval:
imageβtext R@1/R@5 over the 5,000 val images against first-caption text
embeddings, paired protocol. Agreement: mean cosine to the arm's target
embeddings on COCO val. Effective rank and a spread statistic (CV of
Cayley-Menger 4-simplex volumes on a fixed 16-d projection) are read-only
health instruments. Every evaluation is deterministic: `--eval-only`
re-runs reproduce ledger rows to four decimal places, and this release
was gated by fresh tokenless downloads reproducing the headline numbers
exactly (raw-loader path and AutoModel path, bit-parity verified).
## Limitations
Research model. 48% of teacher zero-shot at best; the preregistered 60%
viability bar is unmet (the data-scaling curve is unbent β see the
article). CIFAR absolute numbers are harness-scoped (32px upscale; see
the evaluation-path note). Two seeds per objective; one batch size
(256); one student size; one consensus family; one deployment frame.
The rotation fit consumes 2,500 labeled pairs of the deployment frame.
## Related
- Campaign report: `article_cc12m_distillation.md` (in this repo)
- Teacher banks: [bulk-cc12m-features](https://huggingface.co/datasets/AbstractPhil/bulk-cc12m-features) Β· [bulk-coco-features](https://huggingface.co/datasets/AbstractPhil/bulk-coco-features)
- Memory-bank line: [geolip-vit-captionbank-coco](https://huggingface.co/AbstractPhil/geolip-vit-captionbank-coco)
- Objective genealogy: [loss-manifest](https://huggingface.co/AbstractPhil/loss-manifest)
## References
- Radford et al., CLIP β https://arxiv.org/abs/2103.00020
- van den Oord et al., InfoNCE β https://arxiv.org/abs/1807.03748
- Yang et al., CLIP-KD β https://arxiv.org/abs/2307.12732
- Wu et al., TinyCLIP β https://arxiv.org/abs/2309.12314
- Zhai et al., SigLIP β https://arxiv.org/abs/2303.15343
- Gower, Generalized Procrustes Analysis β https://doi.org/10.1007/BF02291478
- Changpinyo et al., Conceptual 12M β https://arxiv.org/abs/2102.08981
- Cherti et al., OpenCLIP scaling β https://arxiv.org/abs/2212.07143
|