EmbeddingGemma 2 โ€” Text + Image โ€” FP32 โ€” MLX

A modular deployment export of Google DeepMind's EmbeddingGemma 2. Only the text backbone, vision encoder and vision projection are retained; the audio encoder and audio projection are absent. No training, distillation, or quantization was applied.

FP32 weights are a lossless expansion of the upstream BF16 values. This does not recover precision absent from the original trained checkpoint.

Property Value
Runtime MLX
Stored floating-point tensors FP32 (all tensors checked)
Effective model parameters 438,760,448
Weight files 1755.12 MB, decimal
Inputs Text, code, images, text + images
Output 768 dimensions; MRL at 512, 256, 128
Context budget 8,192 tokens
License Apache 2.0

Weight size is not total runtime memory. 270M/440M in repository names are rounded deployment sizes.

Install

pip install "mlx>=0.32.3" "transformers>=5.19.0"
pip install "git+https://github.com/Blaizzy/mlx-vlm.git@3d87e88402f307efbf68e568971aa887ee7d9ed0"

EmbeddingGemma 2 currently requires the pinned MLX-VLM implementation revision above. The MLX package was tested with MLX 0.32.3 and Transformers 5.19.0.

Text and code

import mlx.core as mx
from transformers import AutoTokenizer
from mlx_vlm.embedding_loader import load_embedding_model
from mlx_vlm.utils import get_model_path

path = get_model_path("jayyun98/embeddinggemma-2-text-image-440m-mlx-fp32")
model = load_embedding_model(path)
tokenizer = AutoTokenizer.from_pretrained(path)
inputs = tokenizer([
    "task: search result | query: What causes the northern lights?",
    "title: none | text: Charged particles from the sun cause the northern lights.",
], padding=True, return_tensors="np")
vectors = model(**{key: mx.array(value) for key, value in inputs.items()}).text_embeds
mx.eval(vectors)
print(vectors[:1] @ vectors[1:].T)

# Optional MRL truncation. Normalize after slicing.
vectors = vectors[:, :256]
vectors /= mx.linalg.norm(vectors, axis=-1, keepdims=True)

Use SearchQuery for search queries, CodeRetrieval for code-search queries, and Document for corpus items. For the MLX API, prepend the corresponding literal prefix from config_sentence_transformers.json, as shown above. For titled documents, use title: {title} | text: {content} without another prefix. Use matching dimensions for queries and documents, and normalize after truncation. This FP32 package stores FP32 weights; loading it as BF16 changes runtime precision.

Images and mixed text/image inputs

from PIL import Image
from transformers import AutoProcessor

processor = AutoProcessor.from_pretrained(path)
image = Image.open("photo.jpg").convert("RGB")
inputs = processor(images=[image], return_tensors="np")
image_vector = model(**{key: mx.array(value) for key, value in inputs.items()}).text_embeds
mx.eval(image_vector)

inputs = processor(
    text="A description of this photo. <|image|>",
    images=[image],
    return_tensors="np",
)
mixed_vector = model(**{key: mx.array(value) for key, value in inputs.items()}).text_embeds
mx.eval(mixed_vector)

Verification

Strict native MLX loading and Apple Silicon GPU inference were tested. Cross-runtime arithmetic and BF16 rounding can produce small differences from PyTorch FP32. Checks cover English/Korean search and document text, code queries, and 128/256/512-dimensional normalized vectors. Image-only, mixed text/image, and interleaved two-image inputs were also checked.

Fixture Minimum cosine vs source FP32 Maximum absolute difference
search_english_korean 1.000000000 1.2293458e-07
documents 1.000000000 1.49011612e-07
code 1.000000000 1.53668225e-07
image 1.000000000 1.28522515e-07
mixed_text_image 1.000000000 1.16415322e-07
interleaved_two_images 1.000000000 1.63912773e-07

Measurements compare with the pinned full Google checkpoint. They are small numerical and loading checks, not MTEB results, a retrieval-quality evaluation, or a speed benchmark. The original prompts, pooling behavior, tokenizer and processor assets are retained. Processor metadata does not restore the removed encoder weights. This package targets text/image; audio is unavailable and video workflows were not evaluated.

Attribution and license

Original weights and tokenizer/processor assets: Google DeepMind. MLX implementation: MLX-VLM contributors. This is an independent derivative deployment export, not an official Google release. The Apache 2.0 LICENSE and NOTICE are included. See the original model card for training, intended use and limitations.

Downloads last month
294
Safetensors
Model size
0.4B params
Tensor type
F32
ยท
MLX
Hardware compatibility
Log In to add your hardware

Quantized

Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for jayyun98/embeddinggemma-2-text-image-440m-mlx-fp32

Finetuned
(154)
this model

Collection including jayyun98/embeddinggemma-2-text-image-440m-mlx-fp32