Skip to main content

bge-m3-lite

CPU inference for BAAI/bge-m3 with onnxruntime as the only dependency. All three BGE-M3 outputs are supported and match the official PyTorch implementation (FlagEmbedding) to fp32 precision:

output shape notes
dense_vecs (n, 1024) CLS pooling, L2-normalised
lexical_weights list[dict[str, float]] token-id → weight, max-pooled, specials removed
colbert_vecs list[(len-1, 1024)] per-token vectors without <s>, L2-normalised

Everything except the transformer forward pass is implemented in this package from scratch: the XLM-RoBERTa tokenizer (SentencePiece unigram model, the nmt_nfkc precompiled charsmap, Unicode grapheme segmentation), the torch-free loader for the sparse / ColBERT heads, the model downloader and the pooling.

Platforms: Apple Silicon, Linux ARM64, Linux x86_64, Windows x86_64 (Python 3.11+).

Install

uv add bge-m3-lite        # or: pip install bge-m3-lite

Use

from bge_m3_lite import BGEM3Embedder

embedder = BGEM3Embedder()  # first call downloads ~2.3 GB into ~/.cache/bge-m3-lite
out = embedder.encode(
    ["What is BGE M3?", "BGE M3 是一個多語言嵌入模型。"],
    return_dense=True,
    return_sparse=True,
    return_colbert_vecs=True,
)
out["dense_vecs"].shape  # (2, 1024)
out["lexical_weights"][0]  # {'4865': 0.08, '83': 0.08, ...}
out["colbert_vecs"][0].shape  # (7, 1024)

embedder.convert_id_to_token(out["lexical_weights"][0])
embedder.compute_lexical_matching_score(lw_query, lw_passage)
embedder.colbert_score(q_vecs, p_vecs)

# retrieval helpers: queries default to 512 tokens, passages to max_length (8192)
q = embedder.encode_queries(["What is BGE M3?"])
p = embedder.encode_corpus(["BGE M3 is a multilingual embedding model ..."])
embedder.compute_score([("What is BGE M3?", "BGE M3 is ...")])
# {'colbert': [...], 'sparse': [...], 'dense': [...], 'sparse+dense': [...], 'colbert+sparse+dense': [...]}
from bge_m3_lite import AsyncEmbedder  # asyncio / FastAPI: never blocks the event loop

async with AsyncEmbedder(
    precision="int8"
) as emb:  # bounded in-flight calls, optional micro-batching
    out = await emb.encode_queries(
        "What is BGE M3?"
    )  # same signatures and outputs as above

Passing a single string returns unwrapped values, like FlagEmbedding. Batches are bounded by batch_size texts and max_batch_tokens padded tokens (default 16384), so mixing short and 8192-token inputs stays within memory. BGEM3Embedder(precision="int8") loads a 4× smaller quantised backbone (see docs/quantization/ for the accuracy trade-off). BGEM3Embedder(low_memory=True) starts in 0.1–0.6 s with ~140 MiB of private memory (weights stay in the mapped file, shared between processes) at twice the latency of a single short query: for serverless and one-shot use (docs/resources.md). Serving: docs/serving/recipe.md (FastAPI recipe, workers × memory, measured throughput per concurrency).

CLI

bge-m3-lite download                     # pre-fetch the model files (2.3 GB + 288 MB fused)
bge-m3-lite info                         # cache state
echo "hello" | bge-m3-lite encode --sparse --colbert --tokens
bge-m3-lite encode --low-memory --int8 "one-shot"   # fast start, small footprint

Environment variables

variable effect
BGE_M3_LITE_CACHE cache directory (default ~/.cache/bge-m3-lite/BAAI--bge-m3)
HF_ENDPOINT Hugging Face mirror, e.g. https://hf-mirror.com
BGE_M3_LITE_OFFLINE=1 never download, fail if files are missing
BGE_M3_LITE_THREADS onnxruntime intra-op threads (default: performance cores on Apple Silicon, physical cores elsewhere)
BGE_M3_LITE_SPIN=1 let onnxruntime's threads spin between runs (default off: no idle CPU, see docs/resources.md)
BGE_M3_LITE_FUSED_URL, BGE_M3_LITE_INT8_URL base URL (mirror) for the fused / int8 release asset pairs

Model files are pinned to a specific Hugging Face revision and verified by SHA-256 after download.

Development

See AGENTS.md and docs/ (architecture, tokenizer, verification, development).

Status

v0.6.2: fp32 with exact parity with FlagEmbedding (fused graph; attention in query chunks and the layer tail in 256-row windows, so an 8192-token text needs 1.8 GB and any batch 0.07 MiB per padded token), opt-in int8 backbone (row-wise + SmoothQuant, dense cosine 0.999 on every platform, 0.3 s start-up), retrieval helpers, token-budget batching, low_memory mode, no idle CPU, and an asyncio AsyncEmbedder for FastAPI with a length-aware micro-batcher (its scheduling audited on Python 3.11 and 3.12+). Shipped versions and closed decisions with their numbers: docs/roadmap/.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bge_m3_lite-0.6.2.tar.gz (120.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bge_m3_lite-0.6.2-py3-none-any.whl (123.7 kB view details)

Uploaded Python 3

File details

Details for the file bge_m3_lite-0.6.2.tar.gz.

File metadata

  • Download URL: bge_m3_lite-0.6.2.tar.gz
  • Upload date:
  • Size: 120.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for bge_m3_lite-0.6.2.tar.gz
Algorithm Hash digest
SHA256 5bb4c800279c827e5e9971554a486a904b3d209a64e96ab181536e4876d2414c
MD5 9a3b2940d95e8b9b0951fd0a25125e8d
BLAKE2b-256 dbd177324f537118b9b462f443de3c21613ab56b2da5f2ac00457c170be67ec1

See more details on using hashes here.

File details

Details for the file bge_m3_lite-0.6.2-py3-none-any.whl.

File metadata

  • Download URL: bge_m3_lite-0.6.2-py3-none-any.whl
  • Upload date:
  • Size: 123.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for bge_m3_lite-0.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 d77f7ff95e21ed94e968cfb2007f239f6e81c2f718674d46dd68056fa958904d
MD5 1016eedac415fdaaf33c19cc4ce5bda6
BLAKE2b-256 fe8c129575b6207df0bc3a7463bdf594245b55592d1af94695b24c5bf082bbbd

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.6.2 This release

2 files

0.6.1

2 files

0.6.0

2 files

0.5.2

2 files

0.5.1

2 files

0.5.0

2 files

0.4.0

2 files

0.3.1

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

0.0.2

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page