| --- |
| license: gemma |
| license_link: https://ai.google.dev/gemma/terms |
| base_model: google/embeddinggemma-300m |
| base_model_relation: quantized |
| library_name: coreai |
| pipeline_tag: feature-extraction |
| tags: |
| - core-ai |
| - aimodel |
| - apple-silicon |
| - on-device |
| - coreai-kit |
| - embeddings |
| - sentence-embedding |
| - sentence-similarity |
| - quantized |
| - int8 |
| extra_gated_heading: Access EmbeddingGemma on Hugging Face |
| extra_gated_description: >- |
| This artifact is a derivative of google/embeddinggemma-300m and is governed by |
| the Gemma Terms of Use, the Gemma Prohibited Use Policy and the Gemma license. |
| --- |
| |
| # embeddinggemma-300m β Core AI (.aimodel) |
|
|
| `google/embeddinggemma-300m` exported as a single static Core AI graph for Apple silicon by |
| [visible-cx](https://huggingface.co/visible-cx). **The whole embedding pipeline is in the |
| graph** β transformer β mean pooling β dense stack β L2 normalise β so it is one call in, one |
| 768-d unit vector out, with no host-side pooling to implement. |
|
|
| Two variants ship here: an **fp32** bundle and an **int8** bundle produced by compressing that |
| graph in place. **Their status is not the same** β read [Status](#status) before choosing. |
|
|
| > β οΈ **Neither bundle has produced an embedding vector on Apple silicon.** Everything below the |
| > Provenance table is a build-and-bytes result, not a runtime result. |
|
|
| ## Contents |
|
|
| | Path | Bytes | Weights | Sequence length | |
| |---|---:|---|---| |
| | `model/` β `embeddinggemma-300m_float32_static.aimodel` + `reference.json` + `tokenizer/` | 1,277,545,730 | fp32 | 256 | |
| | `int8/` β `embeddinggemma-300m_int8_static.aimodel` + `reference.json` + `tokenizer/` | 356,639,960 | int8 (graph-compressed) | 256 | |
|
|
| | File | fp32 (`model/`) | int8 (`int8/`) | |
| |---|---:|---:| |
| | `main.mlirb` | 1,244,157,766 | **323,252,231** (0.26Γ) | |
| | `main.hash` | 32 | 32 | |
| | asset `metadata.json` | 340 | 105 | |
| | `reference.json` | 1,615 | 1,615 | |
| | `tokenizer/tokenizer.json` | 33,385,272 | 33,385,272 | |
| | `tokenizer/tokenizer_config.json` | 705 | 705 | |
|
|
| `reference.json` and `tokenizer/` in `int8/` are byte-identical copies of the fp32 bundle's, |
| carried so the folder is self-contained. `reference.json` is the exporter's torch oracle: four |
| reference texts and their pairwise cosines, for checking the *source* pipeline end to end. |
|
|
| ## Provenance |
|
|
| | | | |
| |---|---| |
| | Base checkpoint | `google/embeddinggemma-300m` | |
| | Recipe (fp32) | `coreai-model-zoo/conversion/export_embeddinggemma.py --dtype float32 --seq-len 256` | |
| | Recipe index | `models/qwen3-embedding/recipe.toml` β `["embeddinggemma-300m"]`, `status = "verified"` | |
| | Upstream reference bundle | [`mlboydaisuke/embeddinggemma-300m-CoreAI`](https://huggingface.co/mlboydaisuke/embeddinggemma-300m-CoreAI) @ `d9a60a18d384484a8dab809b3070b82fb41458ce` | |
| | Producer fingerprint | `coreai-core 1.0.0b2` on both inner asset `metadata.json` files | |
| | Asset creation dates | `20260817T201458Z` (fp32), `20260817T212021Z` (int8) | |
| | Toolchain | `coreai-torch 0.4.1`, `coreai-core 1.0.0b2`, `coreai-opt 0.2.1`, `torch 2.9.0` | |
| | Asset metadata | `author: "Google DeepMind"`, `license: "Gemma"` (fp32 bundle) | |
|
|
| These are an **independent export from the zoo's verified recipe**, at the same layout as the |
| zoo's own bundle β not a byte mirror of it. Rebuilt from the same recipe, `main.mlirb` differed |
| from the published upstream bundle by **+262 bytes**, and two runs on the same host with an |
| identical command differed from each other by **+32 bytes**. The tokenizer half is identical in |
| every comparison. |
|
|
| **The `int8/` bundle is not a second export.** It is the fp32 bundle put through |
| `coreai_opt.coreai_utils.quantize_weights(dtype=DType.INT8)` β the Core AI *graph* compression |
| path, which rewrites an existing program's weight constants in place. There was no PyTorch |
| round-trip and no re-trace: the graph, the input signature and the tokenizer are the fp32 |
| bundle's, unchanged. |
|
|
| ## Requirements |
|
|
| - **Apple silicon Mac**, Core AI runtime, macOS 27+. |
| - **Static input signature:** `input_ids [1, 256] int32`, `attention_mask [1, 256] int32` β |
| `embedding [1, 768]` fp32, L2-normalised. **Sequence length 256 is baked into the graph** β |
| pad or truncate to it; there is no dynamic-length variant. |
| - Weights β 1.24 GB resident (fp32) or β 0.32 GB (int8). **No KV cache** β this is an encoder, |
| so there is no per-token memory growth and no context ladder, and none of the residency |
| cautions that apply to the generative bundles in this org apply here. |
| - **Minimum practical machine memory: 8 GB.** |
|
|
| Note the sequence-length difference from the Core ML artifact in this org |
| ([`visible-cx/embeddinggemma-300m-CoreML`](https://huggingface.co/visible-cx/embeddinggemma-300m-CoreML)), |
| which is **seq 128**. The two are not drop-in substitutes for each other. |
|
|
| ## Measurements |
|
|
| **None, from either bundle.** No embedding vector has been computed from either artifact on |
| Apple silicon: no throughput, no latency, no ANE-residency figure, no cross-runtime vector |
| parity. `export_embeddinggemma.py` exposes only `--dtype`, `--seq-len`, `--output-dir`, |
| `--overwrite`; there is no compute-unit flag to report either. |
|
|
| What *is* verified is the source pipeline, not the exported graph's execution: |
|
|
| - **Torch oracle agrees to ~6e-8.** `reference.json`'s pairwise cosines from an independent |
| rebuild match the published values to roughly seven decimal places (largest deviation ~6e-8). |
| That is CPU float nondeterminism across machines, not a different model. It validates |
| **checkpoint β prompts β pooling β dense β L2**, and explicitly does **not** validate the |
| exported graph. |
| - **The exporter's pre-export gate passed** β the wrapper against |
| `sentence_transformers.encode`, cosine > 0.999. |
|
|
| **The int8 caveat is not boilerplate.** fp16 embeddinggemma is already a known failure at vector |
| precision, because a full `.to(float16)` overflows Gemma 3 activations and emits NaN embeddings. |
| A 4Γ compression passing parity is a hypothesis, not an expectation, and the gate it needs is |
| **cross-runtime vector parity against the fp32 bundle on Apple silicon β cosine similarity per |
| vector *and* retrieval-rank agreement on a fixed corpus**, not a spot-check of output shapes. |
|
|
| ## Usage |
|
|
| Swift Package Manager, via [CoreAIKit](https://github.com/john-rocky/coreai-kit) β a community |
| package, not affiliated with Apple, requiring macOS 27 beta: |
|
|
| ```swift |
| .package(url: "https://github.com/john-rocky/coreai-kit", branch: "main") |
| // target dependency: .product(name: "CoreAIKitEmbeddings", package: "coreai-kit") |
| ``` |
|
|
| `TextEmbedder` takes a bundle directory holding one `*.aimodel` plus a `tokenizer/` folder, and |
| applies EmbeddingGemma's own query/document prompt prefixes: |
|
|
| ```swift |
| import CoreAIKitEmbeddings |
| |
| let url = try await ModelStore.default.download( |
| ModelID("visible-cx/embeddinggemma-300m-CoreAI", path: "model")) |
| |
| let embedder = try await TextEmbedder(bundleAt: url, prompts: .embeddingGemma) |
| |
| let q = try await embedder.embed(query: "how do I cancel my order") |
| let d = try await embedder.embed(document: "Orders can be cancelled within 24 hoursβ¦") |
| // both are L2-normalised [Float] of embedder.dimension (768); cosine == dot product |
| ``` |
|
|
| Two things to hold onto: |
|
|
| - **Use the matching prompts.** `.embeddingGemma` supplies the query and document prefixes this |
| checkpoint was trained with. Embedding a query with the document prefix quietly degrades |
| retrieval; `embed(text:)` applies no prefix at all and is for when you want that. |
| - **Both sides of a comparison must come from the same artifact.** Vectors from this bundle and |
| vectors from the Core ML sibling are not interchangeable β different sequence length, |
| different runtime, and no measured parity between them. |
|
|
| `embedder.sequenceLength` reads 256 off the graph; text longer than that is truncated. |
|
|
| ## Integrity |
|
|
| Core AI `.aimodel` bundles are **not byte-reproducible** β the exporter is not deterministic |
| even against itself (see Provenance), so integrity here rests on **per-file SHA-256 of the exact |
| published bytes**, not on a rebuild. Every bundle carries `main.hash`, the raw 32 bytes of |
| `sha256(main.mlirb)`; on the Hub the same value is recoverable from the LFS oid without fetching |
| the file. |
|
|
| The sibling [`visible-cx/embeddinggemma-300m-CoreML`](https://huggingface.co/visible-cx/embeddinggemma-300m-CoreML) |
| repo **is** bit-reproducible for its weights β a different supply-chain argument for the same |
| model, and the exception in this org. |
|
|
| ## Status |
|
|
| | Artifact | Status | |
| |---|---| |
| | `model/` (fp32, seq 256) | **UNQUALIFIED β built and fingerprinted, runtime-unverified.** The recipe is the zoo's `status = "verified"` entry, the producer fingerprint passes, and the exporter's pre-export gate passed. No vector has been computed from the *exported graph* on Apple silicon. | |
| | `int8/` (graph-compressed) | **EXPERIMENTAL.** Gate: cross-runtime vector parity against the fp32 bundle on Apple silicon β cosine per vector *and* retrieval-rank agreement on a fixed corpus. Do not use for production embeddings until that passes. | |
|
|
| ## License |
|
|
| EmbeddingGemma is Gemma-family and the upstream checkpoint is **gated** on Hugging Face. These |
| bundles are a derivative of `google/embeddinggemma-300m`, and use is subject to the |
| [Gemma Terms of Use](https://ai.google.dev/gemma/terms) and the |
| [Gemma Prohibited Use Policy](https://ai.google.dev/gemma/prohibited_use_policy). The fp32 |
| bundle's own asset metadata carries `license: "Gemma"` and `author: "Google DeepMind"`. Those |
| terms travel with the artifact and with any redistribution of it; the contribution here is the |
| conversion, not the weights. |
|
|