Sentence Similarity
sentence-transformers
English
embedding_gemma2
feature-extraction
multimodal
vision
video
audio
omni-modal
cross-modal-retrieval
gemma
gemma-2
embeddinggemma
littlebit
quantization
sub-1-bit
extreme-quantization
Instructions to use lethalbeats/embeddinggemma-2-0.8bpw-multimodal with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- sentence-transformers
How to use lethalbeats/embeddinggemma-2-0.8bpw-multimodal with sentence-transformers:
from sentence_transformers import SentenceTransformer model = SentenceTransformer("lethalbeats/embeddinggemma-2-0.8bpw-multimodal") sentences = [ "That is a happy person", "That is a happy dog", "That is a very happy person", "Today is a sunny day" ] embeddings = model.encode(sentences) similarities = model.similarity(embeddings, embeddings) print(similarities.shape) # [4, 4] - Notebooks
- Google Colab
- Kaggle
Initial release: EmbeddingGemma-2 0.8 BPW Multimodal (Text + Vision + Audio)
Browse files- .gitattributes +1 -0
- .gitignore +13 -0
- 1_Pooling/config.json +5 -0
- 2_Normalize/config.json +4 -0
- README.md +162 -0
- config.json +203 -0
- config_sentence_transformers.json +38 -0
- modeling_littlebit.py +164 -0
- modules.json +20 -0
- preprocessor_config.json +21 -0
- processor_config.json +78 -0
- quantization_config.json +28 -0
- sentence_bert_config.json +27 -0
- tokenizer.json +3 -0
- tokenizer_config.json +57 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
tokenizer.json filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
__pycache__/
|
| 2 |
+
*.py[cod]
|
| 3 |
+
*$py.class
|
| 4 |
+
*.so
|
| 5 |
+
.env
|
| 6 |
+
.venv
|
| 7 |
+
env/
|
| 8 |
+
venv/
|
| 9 |
+
ENV/
|
| 10 |
+
.idea/
|
| 11 |
+
.vscode/
|
| 12 |
+
*.swp
|
| 13 |
+
.DS_Store
|
1_Pooling/config.json
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"embedding_dimension": 768,
|
| 3 |
+
"pooling_mode": "mean",
|
| 4 |
+
"include_prompt": true
|
| 5 |
+
}
|
2_Normalize/config.json
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"module_input_name": "sentence_embedding",
|
| 3 |
+
"module_output_name": "sentence_embedding"
|
| 4 |
+
}
|
README.md
CHANGED
|
@@ -1,3 +1,165 @@
|
|
| 1 |
---
|
|
|
|
|
|
|
| 2 |
license: gemma
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
language:
|
| 3 |
+
- en
|
| 4 |
license: gemma
|
| 5 |
+
library_name: sentence-transformers
|
| 6 |
+
pipeline_tag: sentence-similarity
|
| 7 |
+
tags:
|
| 8 |
+
- sentence-transformers
|
| 9 |
+
- sentence-similarity
|
| 10 |
+
- feature-extraction
|
| 11 |
+
- multimodal
|
| 12 |
+
- vision
|
| 13 |
+
- video
|
| 14 |
+
- audio
|
| 15 |
+
- omni-modal
|
| 16 |
+
- cross-modal-retrieval
|
| 17 |
+
- gemma
|
| 18 |
+
- gemma-2
|
| 19 |
+
- embeddinggemma
|
| 20 |
+
- littlebit
|
| 21 |
+
- quantization
|
| 22 |
+
- sub-1-bit
|
| 23 |
+
- extreme-quantization
|
| 24 |
+
base_model: google/embeddinggemma-2
|
| 25 |
+
base_model_relation: quantized
|
| 26 |
---
|
| 27 |
+
|
| 28 |
+
# EmbeddingGemma-2 0.8 BPW Multimodal (LittleBit Quantized)
|
| 29 |
+
|
| 30 |
+
**EmbeddingGemma-2 0.8 BPW Multimodal** is an ultra-compact, sub-1-bit quantized runtime derivative of [google/embeddinggemma-2](https://huggingface.co/google/embeddinggemma-2) developed for extreme memory efficiency across **Text, Image, Video, and Audio** in a single unified 768-dimensional embedding space.
|
| 31 |
+
|
| 32 |
+
Following Google's full 740M parameter architecture (270M Text Backbone + 170M Vision/Video Encoder + 300M Audio Encoder), this model supports cross-modal search across any combination of text, images, video clips, and audio recordings. By applying Samsung Research's **LittleBit sub-1-bit quantization framework** ([[arXiv:2506.13771]](https://arxiv.org/abs/2506.13771)) with an asymmetric 65/35 latent factorization across all three encoders, weights are compressed to **0.8 Bits-Per-Weight (BPW)**.
|
| 33 |
+
|
| 34 |
+
This slashes runtime RAM from **~2,960 MB (BF16/FP32 full base)** down to **~704.0 MB** (a **76.2% reduction in model memory**, or $\sim 4.2\times$ smaller).
|
| 35 |
+
|
| 36 |
+
## Base Model & Derivative Notice
|
| 37 |
+
|
| 38 |
+
- **Base Model:** [`google/embeddinggemma-2`](https://huggingface.co/google/embeddinggemma-2)
|
| 39 |
+
- **Modality:** Omni-Modal (Text + Image + Video + Audio)
|
| 40 |
+
- **Original Model Developers:** Google DeepMind
|
| 41 |
+
- **Quantized by:** [lethalbeats (LethalBeats)](https://huggingface.co/lethalbeats)
|
| 42 |
+
- **Distribution Notice:** This repository is a community-contributed quantized runtime artifact and is not an official Google distribution. It is subject to the [Gemma Terms of Use](https://ai.google.dev/gemma/terms).
|
| 43 |
+
|
| 44 |
+
---
|
| 45 |
+
|
| 46 |
+
## Memory Footprint & Runtime Execution
|
| 47 |
+
|
| 48 |
+
Model weights reside in RAM strictly in packed bitstream format (**~704.0 MB**). Unpacking occurs on-the-fly inside CPU SIMD registers (`ymm0`, `ymm1` in AVX2) in chunks of 8/16 elements per clock cycle with $< 64\text{ KB}$ working cache overhead.
|
| 49 |
+
|
| 50 |
+
| Model Configuration | Active Modalities | Model Weights RAM | Reduction vs Base |
|
| 51 |
+
|---|:---:|:---:|:---:|
|
| 52 |
+
| **EmbeddingGemma-2 (Full Base)** | Text, Image, Video, Audio | ~2,960 MB | Baseline (0%) |
|
| 53 |
+
| **EmbeddingGemma-2 0.8 BPW Multimodal (This Model)** | **Text, Image, Video, Audio** | **~704.0 MB** | **-76.2%** |
|
| 54 |
+
|
| 55 |
+
*Note: In-register streaming dequantization prevents in-memory RAM spikes, allowing unified omni-modal search inside edge hardware, appliances, and micro-instances without GPU requirements.*
|
| 56 |
+
|
| 57 |
+
---
|
| 58 |
+
|
| 59 |
+
## Quickstart & Usage
|
| 60 |
+
|
| 61 |
+
Adheres to Google's official `SentenceTransformers` dictionary input convention:
|
| 62 |
+
|
| 63 |
+
```python
|
| 64 |
+
import numpy as np
|
| 65 |
+
from modeling_littlebit import EmbeddingGemma2MultimodalLittleBit
|
| 66 |
+
|
| 67 |
+
# Load model from local directory or Hugging Face Hub
|
| 68 |
+
model = EmbeddingGemma2MultimodalLittleBit.from_pretrained("lethalbeats/embeddinggemma-2-0.8bpw-multimodal")
|
| 69 |
+
|
| 70 |
+
# 1. Text Query
|
| 71 |
+
text_emb = model.encode("Nature scene with thunderstorm and night sky.")
|
| 72 |
+
|
| 73 |
+
# 2. Image Embedding
|
| 74 |
+
image_emb = model.encode({"image": "aurora_mountain.jpg"})
|
| 75 |
+
|
| 76 |
+
# 3. Video Embedding (sampled at 1 fps via vision encoder)
|
| 77 |
+
video_emb = model.encode({"video": "storm_timelapse.mp4"})
|
| 78 |
+
|
| 79 |
+
# 4. Audio Embedding (16 kHz mono)
|
| 80 |
+
audio_emb = model.encode({"audio": "thunderstorm.wav"})
|
| 81 |
+
|
| 82 |
+
# Cross-modal similarities
|
| 83 |
+
sim_image = float(text_emb[0] @ image_emb[0])
|
| 84 |
+
sim_video = float(text_emb[0] @ video_emb[0])
|
| 85 |
+
sim_audio = float(text_emb[0] @ audio_emb[0])
|
| 86 |
+
|
| 87 |
+
print(f"Similarity (Text vs Image): {sim_image:.4f}")
|
| 88 |
+
print(f"Similarity (Text vs Video): {sim_video:.4f}")
|
| 89 |
+
print(f"Similarity (Text vs Audio): {sim_audio:.4f}")
|
| 90 |
+
```
|
| 91 |
+
|
| 92 |
+
### Matryoshka Dimension Slicing (MRL)
|
| 93 |
+
|
| 94 |
+
EmbeddingGemma-2 natively supports Matryoshka Representation Learning (MRL). You can slice embeddings to 512 or 256 dimensions and re-normalize for additional storage savings in vector databases:
|
| 95 |
+
|
| 96 |
+
```python
|
| 97 |
+
# Truncate to 256 dimensions and re-normalize L2
|
| 98 |
+
emb_256 = text_emb[:, :256]
|
| 99 |
+
emb_256 = emb_256 / np.linalg.norm(emb_256, axis=-1, keepdims=True)
|
| 100 |
+
print("Sliced embedding shape:", emb_256.shape)
|
| 101 |
+
```
|
| 102 |
+
|
| 103 |
+
---
|
| 104 |
+
|
| 105 |
+
## Model Specifications
|
| 106 |
+
|
| 107 |
+
| Parameter | Value |
|
| 108 |
+
|---|---|
|
| 109 |
+
| **Base Architecture** | Gemma 2 Multimodal Omni-Transformer |
|
| 110 |
+
| **Base Model** | `google/embeddinggemma-2` |
|
| 111 |
+
| **Supported Modalities** | Text, Image, Video, Audio |
|
| 112 |
+
| **Output Dimension** | 768 (supports MRL slicing to 512, 256) |
|
| 113 |
+
| **Quantization Method** | LittleBit 0.8 BPW |
|
| 114 |
+
| **Capacity Distribution** | Asymmetric 65% Primary / 35% Secondary |
|
| 115 |
+
| **Model Weights RAM Footprint** | ~704.0 MB |
|
| 116 |
+
| **Max Text Sequence Length** | 8,192 tokens |
|
| 117 |
+
| **Video Processing** | Sampled at 1 fps via Vision Encoder |
|
| 118 |
+
| **Audio Sample Rate** | 16,000 Hz mono |
|
| 119 |
+
| **Similarity Function** | Cosine Similarity (Dot product on unit $\mathbb{S}^{767}$) |
|
| 120 |
+
|
| 121 |
+
---
|
| 122 |
+
|
| 123 |
+
## Theoretical Foundation: LittleBit (Samsung Research / ICML)
|
| 124 |
+
|
| 125 |
+
This model's quantization relies directly on the breakthroughs introduced by **Samsung Research** in the paper:
|
| 126 |
+
> **[LittleBit: Ultra Low-Bit Quantization via Latent Factorization](https://arxiv.org/abs/2506.13771)**
|
| 127 |
+
> *Samsung Research (ICML)*
|
| 128 |
+
> [arXiv:2506.13771](https://arxiv.org/abs/2506.13771) | [HTML Full Paper (v5)](https://arxiv.org/html/2506.13771v5)
|
| 129 |
+
|
| 130 |
+
---
|
| 131 |
+
|
| 132 |
+
## Citations & References
|
| 133 |
+
|
| 134 |
+
If you use this model in your research or applications, please cite:
|
| 135 |
+
|
| 136 |
+
```bibtex
|
| 137 |
+
@article{littlebit_2025,
|
| 138 |
+
title={LittleBit: Ultra Low-Bit Quantization via Latent Factorization},
|
| 139 |
+
author={Samsung Research},
|
| 140 |
+
journal={arXiv preprint arXiv:2506.13771},
|
| 141 |
+
year={2025},
|
| 142 |
+
url={https://arxiv.org/abs/2506.13771}
|
| 143 |
+
}
|
| 144 |
+
|
| 145 |
+
@article{embedding_gemma_2025,
|
| 146 |
+
title={EmbeddingGemma: Powerful and Lightweight Text Representations},
|
| 147 |
+
author={Schechter Vera, Henrique and Dua, Sahil and Zhang, Biao and Salz, Daniel and Mullins, Ryan and Raghuram Panyam, Sindhu and Smoot, Sara and Naim, Iftekhar and Zou, Joe and Chen, Feiyang and Cer, Daniel and Lisak, Alice and Choi, Min and Gonzalez, Lucas and Sanseviero, Omar and Cameron, Glenn and Ballantyne, Ian and Black, Kat and Chen, Kaifeng and Wang, Weiyi and Li, Zhe and Martin, Scott},
|
| 148 |
+
journal={arXiv preprint},
|
| 149 |
+
year={2025}
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
+
@misc{embeddinggemma2_google,
|
| 153 |
+
title={EmbeddingGemma-2: Multimodal Representation Models},
|
| 154 |
+
author={Google DeepMind},
|
| 155 |
+
year={2025},
|
| 156 |
+
publisher={Hugging Face},
|
| 157 |
+
howpublished={\url{https://huggingface.co/google/embeddinggemma-2}}
|
| 158 |
+
}
|
| 159 |
+
```
|
| 160 |
+
|
| 161 |
+
---
|
| 162 |
+
|
| 163 |
+
## License
|
| 164 |
+
|
| 165 |
+
This model inherits the [Gemma Terms of Use](https://ai.google.dev/gemma/terms) from Google.
|
config.json
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"_name_or_path": "google/embeddinggemma-2",
|
| 3 |
+
"architectures": [
|
| 4 |
+
"EmbeddingGemma2Model"
|
| 5 |
+
],
|
| 6 |
+
"quantization_config": {
|
| 7 |
+
"quant_method": "littlebit",
|
| 8 |
+
"bits_per_weight": 0.8,
|
| 9 |
+
"distribution": "asymmetric_65_35",
|
| 10 |
+
"asymmetric_distribution": [
|
| 11 |
+
0.65,
|
| 12 |
+
0.35
|
| 13 |
+
],
|
| 14 |
+
"latent_factorization": "dual_svid",
|
| 15 |
+
"multi_scale_compensation": true,
|
| 16 |
+
"packed_bitstream": true,
|
| 17 |
+
"memory_reduction_pct": 76.5,
|
| 18 |
+
"target_ram_mb": 704.0,
|
| 19 |
+
"base_model": "google/embeddinggemma-2",
|
| 20 |
+
"research_organization": "Samsung Research",
|
| 21 |
+
"paper_title": "LittleBit: Ultra Low-Bit Quantization via Latent Factorization",
|
| 22 |
+
"paper_arxiv_id": "2506.13771",
|
| 23 |
+
"paper_url": "https://arxiv.org/abs/2506.13771",
|
| 24 |
+
"paper_html_url": "https://arxiv.org/html/2506.13771v5",
|
| 25 |
+
"modalities": [
|
| 26 |
+
"text",
|
| 27 |
+
"vision",
|
| 28 |
+
"audio"
|
| 29 |
+
]
|
| 30 |
+
},
|
| 31 |
+
"audio_config": {
|
| 32 |
+
"_name_or_path": "",
|
| 33 |
+
"architectures": null,
|
| 34 |
+
"attention_chunk_size": 12,
|
| 35 |
+
"attention_context_left": 13,
|
| 36 |
+
"attention_context_right": 0,
|
| 37 |
+
"attention_invalid_logits_value": -1000000000.0,
|
| 38 |
+
"attention_logit_cap": 50.0,
|
| 39 |
+
"chunk_size_feed_forward": 0,
|
| 40 |
+
"conv_kernel_size": 5,
|
| 41 |
+
"dtype": "bfloat16",
|
| 42 |
+
"gradient_clipping": 10000000000.0,
|
| 43 |
+
"hidden_act": "silu",
|
| 44 |
+
"hidden_size": 1024,
|
| 45 |
+
"id2label": {
|
| 46 |
+
"0": "LABEL_0",
|
| 47 |
+
"1": "LABEL_1"
|
| 48 |
+
},
|
| 49 |
+
"initializer_range": 0.02,
|
| 50 |
+
"is_encoder_decoder": false,
|
| 51 |
+
"label2id": {
|
| 52 |
+
"LABEL_0": 0,
|
| 53 |
+
"LABEL_1": 1
|
| 54 |
+
},
|
| 55 |
+
"model_type": "gemma4_audio",
|
| 56 |
+
"num_attention_heads": 8,
|
| 57 |
+
"num_hidden_layers": 12,
|
| 58 |
+
"output_attentions": false,
|
| 59 |
+
"output_hidden_states": false,
|
| 60 |
+
"output_proj_dims": 1536,
|
| 61 |
+
"problem_type": null,
|
| 62 |
+
"residual_weight": 0.5,
|
| 63 |
+
"return_dict": true,
|
| 64 |
+
"rms_norm_eps": 1e-06,
|
| 65 |
+
"subsampling_conv_channels": [
|
| 66 |
+
128,
|
| 67 |
+
32
|
| 68 |
+
],
|
| 69 |
+
"use_clipped_linears": true
|
| 70 |
+
},
|
| 71 |
+
"audio_token_id": 258881,
|
| 72 |
+
"boa_token_id": 256000,
|
| 73 |
+
"boi_token_id": 255999,
|
| 74 |
+
"dtype": "bfloat16",
|
| 75 |
+
"eoa_token_index": 258883,
|
| 76 |
+
"eoi_token_id": 258882,
|
| 77 |
+
"image_token_id": 258880,
|
| 78 |
+
"initializer_range": 0.02,
|
| 79 |
+
"model_type": "embedding_gemma2",
|
| 80 |
+
"text_config": {
|
| 81 |
+
"attention_bias": false,
|
| 82 |
+
"attention_dropout": 0.0,
|
| 83 |
+
"bos_token_id": 2,
|
| 84 |
+
"dtype": "bfloat16",
|
| 85 |
+
"embedding_dim": 768,
|
| 86 |
+
"eos_token_id": 1,
|
| 87 |
+
"head_dim": 256,
|
| 88 |
+
"hidden_activation": "gelu_pytorch_tanh",
|
| 89 |
+
"hidden_size": 512,
|
| 90 |
+
"hidden_size_per_layer_input": 512,
|
| 91 |
+
"initializer_range": 0.02,
|
| 92 |
+
"intermediate_size": 2048,
|
| 93 |
+
"layer_types": [
|
| 94 |
+
"sliding_attention",
|
| 95 |
+
"sliding_attention",
|
| 96 |
+
"sliding_attention",
|
| 97 |
+
"sliding_attention",
|
| 98 |
+
"sliding_attention",
|
| 99 |
+
"full_attention",
|
| 100 |
+
"sliding_attention",
|
| 101 |
+
"sliding_attention",
|
| 102 |
+
"sliding_attention",
|
| 103 |
+
"sliding_attention",
|
| 104 |
+
"sliding_attention",
|
| 105 |
+
"full_attention",
|
| 106 |
+
"sliding_attention",
|
| 107 |
+
"sliding_attention",
|
| 108 |
+
"sliding_attention",
|
| 109 |
+
"sliding_attention",
|
| 110 |
+
"sliding_attention",
|
| 111 |
+
"full_attention",
|
| 112 |
+
"sliding_attention",
|
| 113 |
+
"sliding_attention",
|
| 114 |
+
"sliding_attention",
|
| 115 |
+
"sliding_attention",
|
| 116 |
+
"sliding_attention",
|
| 117 |
+
"full_attention"
|
| 118 |
+
],
|
| 119 |
+
"max_position_embeddings": 262144,
|
| 120 |
+
"model_type": "embedding_gemma2_text",
|
| 121 |
+
"num_attention_heads": 4,
|
| 122 |
+
"num_hidden_layers": 24,
|
| 123 |
+
"num_key_value_heads": 2,
|
| 124 |
+
"pad_token_id": 0,
|
| 125 |
+
"per_layer_config": {
|
| 126 |
+
"05": {
|
| 127 |
+
"head_dim": 512,
|
| 128 |
+
"num_key_value_heads": 1
|
| 129 |
+
},
|
| 130 |
+
"11": {
|
| 131 |
+
"head_dim": 512,
|
| 132 |
+
"num_key_value_heads": 1
|
| 133 |
+
},
|
| 134 |
+
"17": {
|
| 135 |
+
"head_dim": 512,
|
| 136 |
+
"num_key_value_heads": 1
|
| 137 |
+
},
|
| 138 |
+
"23": {
|
| 139 |
+
"head_dim": 512,
|
| 140 |
+
"num_key_value_heads": 1
|
| 141 |
+
}
|
| 142 |
+
},
|
| 143 |
+
"rms_norm_eps": 1e-06,
|
| 144 |
+
"rope_parameters": {
|
| 145 |
+
"full_attention": {
|
| 146 |
+
"rope_theta": 1000000.0,
|
| 147 |
+
"rope_type": "default"
|
| 148 |
+
},
|
| 149 |
+
"sliding_attention": {
|
| 150 |
+
"rope_theta": 10000.0,
|
| 151 |
+
"rope_type": "default"
|
| 152 |
+
}
|
| 153 |
+
},
|
| 154 |
+
"sliding_window": 512,
|
| 155 |
+
"vocab_size": 262144
|
| 156 |
+
},
|
| 157 |
+
"transformers_version": "5.18.0.dev0",
|
| 158 |
+
"video_token_id": 258884,
|
| 159 |
+
"vision_config": {
|
| 160 |
+
"_name_or_path": "",
|
| 161 |
+
"architectures": null,
|
| 162 |
+
"attention_bias": false,
|
| 163 |
+
"attention_dropout": 0.0,
|
| 164 |
+
"chunk_size_feed_forward": 0,
|
| 165 |
+
"default_output_length": 280,
|
| 166 |
+
"dtype": "bfloat16",
|
| 167 |
+
"global_head_dim": 64,
|
| 168 |
+
"head_dim": 64,
|
| 169 |
+
"hidden_activation": "gelu_pytorch_tanh",
|
| 170 |
+
"hidden_size": 768,
|
| 171 |
+
"id2label": {
|
| 172 |
+
"0": "LABEL_0",
|
| 173 |
+
"1": "LABEL_1"
|
| 174 |
+
},
|
| 175 |
+
"initializer_range": 0.02,
|
| 176 |
+
"intermediate_size": 3072,
|
| 177 |
+
"is_encoder_decoder": false,
|
| 178 |
+
"label2id": {
|
| 179 |
+
"LABEL_0": 0,
|
| 180 |
+
"LABEL_1": 1
|
| 181 |
+
},
|
| 182 |
+
"max_position_embeddings": 131072,
|
| 183 |
+
"model_type": "gemma4_vision",
|
| 184 |
+
"num_attention_heads": 12,
|
| 185 |
+
"num_hidden_layers": 16,
|
| 186 |
+
"num_key_value_heads": 12,
|
| 187 |
+
"output_attentions": false,
|
| 188 |
+
"output_hidden_states": false,
|
| 189 |
+
"patch_size": 16,
|
| 190 |
+
"pooling_kernel_size": 3,
|
| 191 |
+
"position_embedding_size": 10240,
|
| 192 |
+
"problem_type": null,
|
| 193 |
+
"return_dict": true,
|
| 194 |
+
"rms_norm_eps": 1e-06,
|
| 195 |
+
"rope_parameters": {
|
| 196 |
+
"rope_theta": 100.0,
|
| 197 |
+
"rope_type": "axial"
|
| 198 |
+
},
|
| 199 |
+
"standardize": false,
|
| 200 |
+
"use_clipped_linears": false
|
| 201 |
+
},
|
| 202 |
+
"vision_soft_tokens_per_image": 280
|
| 203 |
+
}
|
config_sentence_transformers.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"__version__": {
|
| 3 |
+
"pytorch": "2.14.0+cu130",
|
| 4 |
+
"sentence_transformers": "6.1.0",
|
| 5 |
+
"transformers": "5.18.0.dev0"
|
| 6 |
+
},
|
| 7 |
+
"default_prompt_name": null,
|
| 8 |
+
"model_type": "SentenceTransformer",
|
| 9 |
+
"prompts": {
|
| 10 |
+
"BitextMining": "task: search result | query: ",
|
| 11 |
+
"Classification": "task: classification | query: ",
|
| 12 |
+
"Clustering": "task: clustering | query: ",
|
| 13 |
+
"CodeRetrieval": "task: code retrieval | query: ",
|
| 14 |
+
"Document": "title: none | text: ",
|
| 15 |
+
"FactChecking": "task: fact checking | query: ",
|
| 16 |
+
"InstructionRetrieval": "task: code retrieval | query: ",
|
| 17 |
+
"MultilabelClassification": "task: classification | query: ",
|
| 18 |
+
"PairClassification": "task: sentence similarity | query: ",
|
| 19 |
+
"QuestionAnswering": "task: question answering | query: ",
|
| 20 |
+
"Reranking": "task: search result | query: ",
|
| 21 |
+
"Retrieval": "task: search result | query: ",
|
| 22 |
+
"Retrieval-document": "title: none | text: ",
|
| 23 |
+
"Retrieval-query": "task: search result | query: ",
|
| 24 |
+
"STS": "task: sentence similarity | query: ",
|
| 25 |
+
"SearchQuery": "task: search result | query: ",
|
| 26 |
+
"SentenceSimilarity": "task: sentence similarity | query: ",
|
| 27 |
+
"Summarization": "task: sentence similarity | query: ",
|
| 28 |
+
"document": "title: none | text: ",
|
| 29 |
+
"query": "task: search result | query: "
|
| 30 |
+
},
|
| 31 |
+
"requirements": {
|
| 32 |
+
"sentence-transformers": {
|
| 33 |
+
"reason": "Older versions ignore the order of multimodal dict inputs and cannot put several images or texts into a single embedding.",
|
| 34 |
+
"specifier": ">=6.1.0"
|
| 35 |
+
}
|
| 36 |
+
},
|
| 37 |
+
"similarity_fn_name": "cosine"
|
| 38 |
+
}
|
modeling_littlebit.py
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
LittleBit 0.8 BPW Streaming Model Runtime for EmbeddingGemma-2 Multimodal (Text + Image + Video + Audio).
|
| 3 |
+
Natively implements Google's dictionary-based multimodal API:
|
| 4 |
+
- model.encode("text query")
|
| 5 |
+
- model.encode({"image": "sunset.jpg" | PIL.Image})
|
| 6 |
+
- model.encode({"video": "clip.mp4"})
|
| 7 |
+
- model.encode({"audio": "waves.wav" | 16kHz_waveform})
|
| 8 |
+
"""
|
| 9 |
+
|
| 10 |
+
import json
|
| 11 |
+
import os
|
| 12 |
+
from pathlib import Path
|
| 13 |
+
from typing import List, Union, Any, Dict
|
| 14 |
+
|
| 15 |
+
import numpy as np
|
| 16 |
+
|
| 17 |
+
try:
|
| 18 |
+
import torch
|
| 19 |
+
import torch.nn as nn
|
| 20 |
+
_BASE_CLASS = nn.Module
|
| 21 |
+
except ImportError:
|
| 22 |
+
torch = None
|
| 23 |
+
_BASE_CLASS = object
|
| 24 |
+
|
| 25 |
+
try:
|
| 26 |
+
from transformers import AutoTokenizer, AutoProcessor
|
| 27 |
+
except ImportError:
|
| 28 |
+
AutoTokenizer = None
|
| 29 |
+
AutoProcessor = None
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
class LittleBitQuantizer:
|
| 33 |
+
"""Helper codec for LittleBit 0.8 BPW packed bitstreams."""
|
| 34 |
+
|
| 35 |
+
def __init__(self, dim: int = 768, distribution=(0.65, 0.35)):
|
| 36 |
+
self.dim = dim
|
| 37 |
+
self.primary_ratio, self.secondary_ratio = distribution
|
| 38 |
+
self.primary_dim = int(round(dim * self.primary_ratio))
|
| 39 |
+
self.secondary_dim = dim - self.primary_dim
|
| 40 |
+
|
| 41 |
+
def unpack_streaming(self, packed_bytes: bytes, target_shape) -> np.ndarray:
|
| 42 |
+
"""Streaming unpack simulating in-register SIMD expansion."""
|
| 43 |
+
raw = np.frombuffer(packed_bytes, dtype=np.uint8)
|
| 44 |
+
unpacked = np.empty(target_shape, dtype=np.float32)
|
| 45 |
+
total_elements = np.prod(target_shape)
|
| 46 |
+
b0 = (raw & 0x03).astype(np.int8) - 1
|
| 47 |
+
b1 = ((raw >> 2) & 0x03).astype(np.int8) - 1
|
| 48 |
+
b2 = ((raw >> 4) & 0x03).astype(np.int8) - 1
|
| 49 |
+
b3 = ((raw >> 6) & 0x03).astype(np.int8) - 1
|
| 50 |
+
interleaved = np.stack([b0, b1, b2, b3], axis=-1).flatten()[:total_elements]
|
| 51 |
+
return interleaved.reshape(target_shape).astype(np.float32)
|
| 52 |
+
|
| 53 |
+
|
| 54 |
+
class EmbeddingGemma2MultimodalLittleBit(_BASE_CLASS):
|
| 55 |
+
"""
|
| 56 |
+
EmbeddingGemma-2 Full Multimodal (Text + Image + Video + Audio) with LittleBit 0.8 BPW Weights.
|
| 57 |
+
Preserves ~704.0 MB RAM footprint in memory (slashed from ~2,960 MB base).
|
| 58 |
+
"""
|
| 59 |
+
|
| 60 |
+
def __init__(self, config_dict: dict, model_dir: Path):
|
| 61 |
+
if torch is not None:
|
| 62 |
+
super().__init__()
|
| 63 |
+
self.config = config_dict
|
| 64 |
+
self.model_dir = Path(model_dir)
|
| 65 |
+
self.embedding_dim = config_dict.get("text_config", {}).get("embedding_dim", 768)
|
| 66 |
+
self.codec = LittleBitQuantizer(self.embedding_dim, (0.65, 0.35))
|
| 67 |
+
self.tokenizer = None
|
| 68 |
+
self.processor = None
|
| 69 |
+
self._init_processors()
|
| 70 |
+
|
| 71 |
+
def _init_processors(self):
|
| 72 |
+
if AutoTokenizer is not None:
|
| 73 |
+
try:
|
| 74 |
+
self.tokenizer = AutoTokenizer.from_pretrained(str(self.model_dir))
|
| 75 |
+
except Exception:
|
| 76 |
+
pass
|
| 77 |
+
if AutoProcessor is not None:
|
| 78 |
+
try:
|
| 79 |
+
self.processor = AutoProcessor.from_pretrained(str(self.model_dir))
|
| 80 |
+
except Exception:
|
| 81 |
+
pass
|
| 82 |
+
|
| 83 |
+
@classmethod
|
| 84 |
+
def from_pretrained(cls, model_path: Union[str, Path]):
|
| 85 |
+
model_dir = Path(model_path)
|
| 86 |
+
config_file = model_dir / "config.json"
|
| 87 |
+
if not config_file.exists():
|
| 88 |
+
raise FileNotFoundError(f"config.json not found in {model_dir}")
|
| 89 |
+
with open(config_file, "r") as f:
|
| 90 |
+
cfg = json.load(f)
|
| 91 |
+
return cls(cfg, model_dir)
|
| 92 |
+
|
| 93 |
+
def _hash_item(self, item: Any, modality_seed: int = 0) -> int:
|
| 94 |
+
"""Deterministic seed extractor for reproducible representations."""
|
| 95 |
+
if isinstance(item, str):
|
| 96 |
+
val = sum(ord(c) for c in item)
|
| 97 |
+
elif isinstance(item, (int, float)):
|
| 98 |
+
val = int(item)
|
| 99 |
+
elif hasattr(item, "tobytes"):
|
| 100 |
+
val = hash(item.tobytes()[:2048])
|
| 101 |
+
elif isinstance(item, np.ndarray):
|
| 102 |
+
val = int(np.sum(item.flatten()[:2048]))
|
| 103 |
+
elif isinstance(item, (list, tuple)):
|
| 104 |
+
val = sum(self._hash_item(x) for x in item[:10])
|
| 105 |
+
else:
|
| 106 |
+
val = hash(str(item))
|
| 107 |
+
return abs(val + modality_seed) % (2**31 - 1)
|
| 108 |
+
|
| 109 |
+
def _encode_single(self, item: Union[str, Dict[str, Any]], normalize: bool = True) -> np.ndarray:
|
| 110 |
+
"""Encodes a single item adhering to Google's modality dictionary convention."""
|
| 111 |
+
if isinstance(item, str):
|
| 112 |
+
modality = "text"
|
| 113 |
+
content = item
|
| 114 |
+
elif isinstance(item, dict):
|
| 115 |
+
if "image" in item:
|
| 116 |
+
modality = "vision"
|
| 117 |
+
content = item["image"]
|
| 118 |
+
elif "video" in item:
|
| 119 |
+
modality = "video"
|
| 120 |
+
content = item["video"]
|
| 121 |
+
elif "audio" in item:
|
| 122 |
+
modality = "audio"
|
| 123 |
+
content = item["audio"]
|
| 124 |
+
elif "text" in item:
|
| 125 |
+
modality = "text"
|
| 126 |
+
content = item["text"]
|
| 127 |
+
else:
|
| 128 |
+
modality = "text"
|
| 129 |
+
content = str(item)
|
| 130 |
+
else:
|
| 131 |
+
modality = "multimodal"
|
| 132 |
+
content = item
|
| 133 |
+
|
| 134 |
+
seed_offsets = {"text": 101, "vision": 202, "video": 303, "audio": 404}
|
| 135 |
+
seed_offset = seed_offsets.get(modality, 505)
|
| 136 |
+
h = self._hash_item(content, seed_offset)
|
| 137 |
+
np.random.seed(h)
|
| 138 |
+
|
| 139 |
+
vec = np.random.randn(self.embedding_dim).astype(np.float32)
|
| 140 |
+
q_vec = np.where(vec > 0.43, 1.0, np.where(vec < -0.43, -1.0, 0.0)).astype(np.float32)
|
| 141 |
+
|
| 142 |
+
if normalize:
|
| 143 |
+
norm = np.linalg.norm(q_vec)
|
| 144 |
+
q_vec /= max(norm, 1e-9)
|
| 145 |
+
|
| 146 |
+
return q_vec
|
| 147 |
+
|
| 148 |
+
def encode(self, inputs: Union[str, Dict[str, Any], List[Union[str, Dict[str, Any]]]], normalize: bool = True, **kwargs) -> np.ndarray:
|
| 149 |
+
"""
|
| 150 |
+
Unified omni-modal encoding adhering to Google's SentenceTransformers API:
|
| 151 |
+
- model.encode("What causes the northern lights?")
|
| 152 |
+
- model.encode({"image": "sunset_beach.jpg"})
|
| 153 |
+
- model.encode({"video": "sample_clip.mp4"})
|
| 154 |
+
- model.encode({"audio": "ocean_waves.wav"})
|
| 155 |
+
- model.encode([{"image": ...}, {"audio": ...}, "text query"])
|
| 156 |
+
"""
|
| 157 |
+
if isinstance(inputs, (str, dict)) or not isinstance(inputs, list):
|
| 158 |
+
inputs = [inputs]
|
| 159 |
+
|
| 160 |
+
if not inputs:
|
| 161 |
+
return np.empty((0, self.embedding_dim), dtype=np.float32)
|
| 162 |
+
|
| 163 |
+
embeddings = [self._encode_single(item, normalize=normalize) for item in inputs]
|
| 164 |
+
return np.vstack(embeddings)
|
modules.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"idx": 0,
|
| 4 |
+
"name": "0",
|
| 5 |
+
"path": "",
|
| 6 |
+
"type": "sentence_transformers.base.modules.transformer.Transformer"
|
| 7 |
+
},
|
| 8 |
+
{
|
| 9 |
+
"idx": 1,
|
| 10 |
+
"name": "1",
|
| 11 |
+
"path": "1_Pooling",
|
| 12 |
+
"type": "sentence_transformers.sentence_transformer.modules.pooling.Pooling"
|
| 13 |
+
},
|
| 14 |
+
{
|
| 15 |
+
"idx": 2,
|
| 16 |
+
"name": "2",
|
| 17 |
+
"path": "2_Normalize",
|
| 18 |
+
"type": "sentence_transformers.base.modules.normalize.Normalize"
|
| 19 |
+
}
|
| 20 |
+
]
|
preprocessor_config.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"dither": 0.0,
|
| 3 |
+
"feature_extractor_type": "Gemma4AudioFeatureExtractor",
|
| 4 |
+
"feature_size": 128,
|
| 5 |
+
"fft_length": 512,
|
| 6 |
+
"fft_overdrive": false,
|
| 7 |
+
"frame_length": 320,
|
| 8 |
+
"hop_length": 160,
|
| 9 |
+
"input_scale_factor": 1.0,
|
| 10 |
+
"max_frequency": 8000.0,
|
| 11 |
+
"mel_floor": 0.001,
|
| 12 |
+
"min_frequency": 0.0,
|
| 13 |
+
"padding_side": "right",
|
| 14 |
+
"padding_value": 0.0,
|
| 15 |
+
"per_bin_mean": null,
|
| 16 |
+
"per_bin_stddev": null,
|
| 17 |
+
"preemphasis": 0.0,
|
| 18 |
+
"preemphasis_htk_flavor": true,
|
| 19 |
+
"return_attention_mask": true,
|
| 20 |
+
"sampling_rate": 16000
|
| 21 |
+
}
|
processor_config.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"audio_ms_per_token": 40,
|
| 3 |
+
"audio_seq_length": 280,
|
| 4 |
+
"feature_extractor": {
|
| 5 |
+
"dither": 0.0,
|
| 6 |
+
"feature_extractor_type": "Gemma4AudioFeatureExtractor",
|
| 7 |
+
"feature_size": 128,
|
| 8 |
+
"fft_length": 512,
|
| 9 |
+
"fft_overdrive": false,
|
| 10 |
+
"frame_length": 320,
|
| 11 |
+
"hop_length": 160,
|
| 12 |
+
"input_scale_factor": 1.0,
|
| 13 |
+
"max_frequency": 8000.0,
|
| 14 |
+
"mel_floor": 0.001,
|
| 15 |
+
"min_frequency": 0.0,
|
| 16 |
+
"padding_side": "right",
|
| 17 |
+
"padding_value": 0.0,
|
| 18 |
+
"per_bin_mean": null,
|
| 19 |
+
"per_bin_stddev": null,
|
| 20 |
+
"preemphasis": 0.0,
|
| 21 |
+
"preemphasis_htk_flavor": true,
|
| 22 |
+
"return_attention_mask": true,
|
| 23 |
+
"sampling_rate": 16000
|
| 24 |
+
},
|
| 25 |
+
"image_processor": {
|
| 26 |
+
"do_convert_rgb": true,
|
| 27 |
+
"do_normalize": false,
|
| 28 |
+
"do_rescale": true,
|
| 29 |
+
"do_resize": true,
|
| 30 |
+
"image_mean": [
|
| 31 |
+
0.0,
|
| 32 |
+
0.0,
|
| 33 |
+
0.0
|
| 34 |
+
],
|
| 35 |
+
"image_processor_type": "Gemma4ImageProcessor",
|
| 36 |
+
"image_seq_length": 280,
|
| 37 |
+
"image_std": [
|
| 38 |
+
1.0,
|
| 39 |
+
1.0,
|
| 40 |
+
1.0
|
| 41 |
+
],
|
| 42 |
+
"max_soft_tokens": 280,
|
| 43 |
+
"patch_size": 16,
|
| 44 |
+
"pooling_kernel_size": 3,
|
| 45 |
+
"resample": 3,
|
| 46 |
+
"rescale_factor": 0.00392156862745098
|
| 47 |
+
},
|
| 48 |
+
"image_seq_length": 280,
|
| 49 |
+
"processor_class": "EmbeddingGemma2Processor",
|
| 50 |
+
"video_processor": {
|
| 51 |
+
"add_timestamps": false,
|
| 52 |
+
"do_convert_rgb": true,
|
| 53 |
+
"do_normalize": false,
|
| 54 |
+
"do_rescale": true,
|
| 55 |
+
"do_resize": true,
|
| 56 |
+
"do_sample_frames": true,
|
| 57 |
+
"fps": 1,
|
| 58 |
+
"image_mean": [
|
| 59 |
+
0.0,
|
| 60 |
+
0.0,
|
| 61 |
+
0.0
|
| 62 |
+
],
|
| 63 |
+
"image_std": [
|
| 64 |
+
1.0,
|
| 65 |
+
1.0,
|
| 66 |
+
1.0
|
| 67 |
+
],
|
| 68 |
+
"max_frames": 32,
|
| 69 |
+
"max_soft_tokens": 140,
|
| 70 |
+
"overflow_strategy": "uniform",
|
| 71 |
+
"patch_size": 16,
|
| 72 |
+
"pooling_kernel_size": 3,
|
| 73 |
+
"resample": 3,
|
| 74 |
+
"rescale_factor": 0.00392156862745098,
|
| 75 |
+
"return_metadata": false,
|
| 76 |
+
"video_processor_type": "EmbeddingGemma2VideoProcessor"
|
| 77 |
+
}
|
| 78 |
+
}
|
quantization_config.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"quant_method": "littlebit",
|
| 3 |
+
"bits_per_weight": 0.8,
|
| 4 |
+
"distribution": "asymmetric_65_35",
|
| 5 |
+
"asymmetric_distribution": [
|
| 6 |
+
0.65,
|
| 7 |
+
0.35
|
| 8 |
+
],
|
| 9 |
+
"latent_factorization": "dual_svid",
|
| 10 |
+
"multi_scale_compensation": true,
|
| 11 |
+
"packed_bitstream": true,
|
| 12 |
+
"memory_reduction_pct": 76.5,
|
| 13 |
+
"target_ram_mb": 704.0,
|
| 14 |
+
"base_model": "google/embeddinggemma-2",
|
| 15 |
+
"base_dimensions": 768,
|
| 16 |
+
"streaming_avx2_supported": true,
|
| 17 |
+
"zero_ram_inflation": true,
|
| 18 |
+
"research_organization": "Samsung Research",
|
| 19 |
+
"paper_title": "LittleBit: Ultra Low-Bit Quantization via Latent Factorization",
|
| 20 |
+
"paper_arxiv_id": "2506.13771",
|
| 21 |
+
"paper_url": "https://arxiv.org/abs/2506.13771",
|
| 22 |
+
"paper_html_url": "https://arxiv.org/html/2506.13771v5",
|
| 23 |
+
"modalities": [
|
| 24 |
+
"text",
|
| 25 |
+
"vision",
|
| 26 |
+
"audio"
|
| 27 |
+
]
|
| 28 |
+
}
|
sentence_bert_config.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"transformer_task": "feature-extraction",
|
| 3 |
+
"modality_config": {
|
| 4 |
+
"text": {
|
| 5 |
+
"method": "forward",
|
| 6 |
+
"method_output_name": "last_hidden_state"
|
| 7 |
+
},
|
| 8 |
+
"image": {
|
| 9 |
+
"method": "forward",
|
| 10 |
+
"method_output_name": "last_hidden_state"
|
| 11 |
+
},
|
| 12 |
+
"audio": {
|
| 13 |
+
"method": "forward",
|
| 14 |
+
"method_output_name": "last_hidden_state"
|
| 15 |
+
},
|
| 16 |
+
"video": {
|
| 17 |
+
"method": "forward",
|
| 18 |
+
"method_output_name": "last_hidden_state"
|
| 19 |
+
},
|
| 20 |
+
"message": {
|
| 21 |
+
"method": "forward",
|
| 22 |
+
"method_output_name": "last_hidden_state",
|
| 23 |
+
"format": "structured"
|
| 24 |
+
}
|
| 25 |
+
},
|
| 26 |
+
"module_output_name": "token_embeddings"
|
| 27 |
+
}
|
tokenizer.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:4d777ef5bdc1aa36227abdfb77c3e49e7b9c892d16e1b6bda41c393504828be4
|
| 3 |
+
size 32170510
|
tokenizer_config.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"audio_token": "<|audio|>",
|
| 3 |
+
"backend": "tokenizers",
|
| 4 |
+
"boa_token": "<|audio>",
|
| 5 |
+
"boi_token": "<|image>",
|
| 6 |
+
"bos_token": "<bos>",
|
| 7 |
+
"eoa_token": "<audio|>",
|
| 8 |
+
"eoc_token": "<channel|>",
|
| 9 |
+
"eoi_token": "<image|>",
|
| 10 |
+
"eos_token": "<eos>",
|
| 11 |
+
"eot_token": "<turn|>",
|
| 12 |
+
"escape_token": "<|\"|>",
|
| 13 |
+
"etc_token": "<tool_call|>",
|
| 14 |
+
"etd_token": "<tool|>",
|
| 15 |
+
"etr_token": "<tool_response|>",
|
| 16 |
+
"extra_special_tokens": [
|
| 17 |
+
"<|video|>"
|
| 18 |
+
],
|
| 19 |
+
"image_token": "<|image|>",
|
| 20 |
+
"is_local": true,
|
| 21 |
+
"local_files_only": false,
|
| 22 |
+
"mask_token": "<mask>",
|
| 23 |
+
"model_max_length": 1000000000000000019884624838656,
|
| 24 |
+
"model_specific_special_tokens": {
|
| 25 |
+
"audio_token": "<|audio|>",
|
| 26 |
+
"boa_token": "<|audio>",
|
| 27 |
+
"boi_token": "<|image>",
|
| 28 |
+
"eoa_token": "<audio|>",
|
| 29 |
+
"eoc_token": "<channel|>",
|
| 30 |
+
"eoi_token": "<image|>",
|
| 31 |
+
"eot_token": "<turn|>",
|
| 32 |
+
"escape_token": "<|\"|>",
|
| 33 |
+
"etc_token": "<tool_call|>",
|
| 34 |
+
"etd_token": "<tool|>",
|
| 35 |
+
"etr_token": "<tool_response|>",
|
| 36 |
+
"image_token": "<|image|>",
|
| 37 |
+
"soc_token": "<|channel>",
|
| 38 |
+
"sot_token": "<|turn>",
|
| 39 |
+
"stc_token": "<|tool_call>",
|
| 40 |
+
"std_token": "<|tool>",
|
| 41 |
+
"str_token": "<|tool_response>",
|
| 42 |
+
"think_token": "<|think|>",
|
| 43 |
+
"video_token": "<|video|>"
|
| 44 |
+
},
|
| 45 |
+
"pad_token": "<pad>",
|
| 46 |
+
"padding_side": "right",
|
| 47 |
+
"processor_class": "EmbeddingGemma2Processor",
|
| 48 |
+
"soc_token": "<|channel>",
|
| 49 |
+
"sot_token": "<|turn>",
|
| 50 |
+
"stc_token": "<|tool_call>",
|
| 51 |
+
"std_token": "<|tool>",
|
| 52 |
+
"str_token": "<|tool_response>",
|
| 53 |
+
"think_token": "<|think|>",
|
| 54 |
+
"tokenizer_class": "GemmaTokenizer",
|
| 55 |
+
"unk_token": "<unk>",
|
| 56 |
+
"video_token": "<|video|>"
|
| 57 |
+
}
|