| --- |
| license: apache-2.0 |
| tags: |
| - executorch |
| - xnnpack |
| - pte |
| - on-device |
| - feature-extraction |
| - sentence-similarity |
| base_model: |
| - sentence-transformers/all-mpnet-base-v2 |
| --- |
| # all-mpnet-base-v2 β ExecuTorch |
|
|
| The most downloaded sentence-transformer there is. Text in, one |
| 768-dimensional vector out, for search and retrieval that never leaves the |
| device. |
|
|
| - **Source**: sentence-transformers/all-mpnet-base-v2 β 12 layers, 768 dimensions, 30,527 vocabulary |
| - **License**: apache-2.0 |
| - **Input**: `input_ids` and `attention_mask`, both `[1, 256]` int64 |
| - **Output**: `[1, 768]`, mean-pooled and L2-normalised inside the graph |
|
|
| ## The recipe is in the graph, and it was read off this repo |
|
|
| sentence-transformers stores it per model, and the shelf's seven embedding models do |
| not agree. This one pools **mean** and |
| **normalises**, read from |
| `1_Pooling/config.json` and `modules.json` rather than inferred from the family name. |
| Getting it wrong does not throw; it returns vectors that look fine and rank wrong. |
|
|
| ## Verification |
|
|
| | build | file | size (MB) | Mac ms* | backend takes | worst cosine vs eager | retrieval budget | |
| |---|---|---|---|---|---|---| |
| | fp32 | `embed_all_mpnet_xnnpack_fp32.pte` | 435.8 | 35.2 | 75.5% | 1.000000 | 0% | |
| | fp16 | `embed_all_mpnet_xnnpack_fp16.pte` | 218.1 | 56.2 | 65.7% | 1.000000 | 11% | |
| | Core ML (fp16, iOS) | `embed_all_mpnet_coreml_all.pte` | 220.2 | 6.2 | 100.0% | 0.999993 | 32% | |
|
|
| \*Mac arm64, one 256-token sequence, **fastest of five medians of ten** β a reference |
| point for relative cost, not a device number. The host shares its cores with other work, |
| and a single median does not survive that: the same eager model here measured 19.6 ms and |
| 182.8 ms twenty minutes apart. Contention only ever adds time, so the fastest repetition is |
| the one that means something. Torch eager fp32, measured the same way, is |
| 37.0 ms. |
| |
| Cosine is measured against the model run in eager through its own pooling, over eight |
| sentences. The last column is the one that decides: rank those eight against each |
| other, and ask whether this build's score error is smaller than the gap between the |
| document a query retrieves and the runner-up. Every shipped build keeps all eight |
| top-1 results. |
| |
| ## Not shipped: int8 |
| |
| `embed_all_mpnet_xnnpack_int8.pte` is **181.3 MB** β smaller than fp16's 218.1 MB, because the token embedding |
| table is only 94 MB of the 435.8 MB model (22%), leaving most of the |
| weight in linears for int8 to shrink. |
| |
| It is withheld on the number that decides. Ranking the eight test sentences against |
| each other, this build moves a pair score by at most **0.0081** while the |
| closest fp32 decision β the gap between the document a query retrieves and the |
| runner-up β is **0.0026**. That is **316%** of |
| the room available, against a bar of 50%. |
| |
| Correlation reads 0.998871 for this build, which no correlation gate |
| would stop. |
| |
| torch.export -> to_edge_transform_and_lower(partitioner) -> .pte |
| (conversion scripts: [executorch-models](https://github.com/john-rocky/executorch-models)) |
| |