alt.freeweights.embed / LCO-Embedding-Omni-7B
From: LCO-Embedding <huggingface.co/LCO-Embedding>Newsgroups: alt.freeweights.embedSubject:

LCO-Embedding-Omni-7B

Date: 2026-11-15Commit: 108f6f1Signed: 2DC28CC7B26A283B ✓

Feature extraction model with 8.9B parameters. Safetensors weights, 17.9 GB in all. Published by LCO-Embedding under Apache-2.0.

8.9B params17.9GBLCO-Embedding-Omni-7Bsafetensorspermissive
FactsParams8.9BSize17.9 GBFormatssafetensorsTaskfeature extractionLicenseApache-2.0From sourcepermissive
$ fw get LCO-Embedding/LCO-Embedding-Omni-7B
# manifest sha256 6b7cd2e08a02… · 17.9 GB · 22 files
$ fw verify ./LCO-Embedding-Omni-7B LCO-Embedding/LCO-Embedding-Omni-7B
From sourceHosted (signed)LCO-Embedding/LCO-Embedding-Omni-7BLast check: 2026-11-15 03:39 UTC

Get help: custom fine-tune or private deploy. We review your setup before we quote.

Works with

Evaluate with

Overview

Size
17.9 GB
Weights
17.9 GB (safetensors)
Parameters
8.9B
Formats
safetensors
Task
feature extraction
License
Apache-2.0 (permissive)
Files
22, each with a sha256
Publisher
LCO-Embedding
Added
2026-11-15
Section
alt.freeweights.embed
Lineage

Original release from the publisher.

Where these bytes come from
Publisher at the pinned commit→You

Sources are tried in order. A file counts only when its size and sha256 match the manifest. Sources are checked when you ask for them, not on a timer.

Sources
BadgeHostLast checkResult
From sourcehuggingface.co2026-11-15 03:39 UTCpassed

Model card

From the publisher at commit 108f6f1. Shown as plain text with links; images open at the publisher.

LCO-Embedding: Scaling Language-Centric Omnimodal Representation Learning#

We are thrilled to release LCO-Embedding - a language-centric omnimodal representation learning framework and the LCO-Embedding model families!

This model implements the framework presented in the paper Scaling Language-Centric Omnimodal Representation Learning, accepted by NeurIPS 2025.

Project Page: https://huggingface.co/LCO-Embedding

Github Repository: https://github.com/LCO-Embedding/LCO-Embedding

Quick Start#

Note: We are only using the thinker component of Qwen2.5 Omni and drops the talker component.

Using Sentence Transformers#

Install Sentence Transformers with the multimodal extras (for image, audio, and video support):

pip install "sentence_transformers[image,audio,video]" "transformers>=5.6.0"
import torch
from sentence_transformers import SentenceTransformer

model = SentenceTransformer(
    "LCO-Embedding/LCO-Embedding-Omni-7B",
    model_kwargs={
        "torch_dtype": torch.bfloat16,
        "attn_implementation": "flash_attention_2",  # pip install kernels; recommended but not mandatory
    },
)

The same "Summarize the above in one word:" instruction used in the paper is baked into the chat template, so encode() takes plain text, file paths, URLs, or multimodal dicts directly.

Text Retrieval#
query = "What is the tallest mountain in the world?"
documents = [
    "Mount Everest is Earth's highest mountain above sea level, located in the Mahalangur Himal sub-range of the Himalayas. Its elevation of 8,848.86 metres was established by a joint Chinese-Nepali survey in 2020.",
    "K2, at 8,611 metres above sea level, is the second-highest mountain on Earth, after Mount Everest. It lies in the Karakoram range on the China-Pakistan border.",
    "Mount Kilimanjaro is a dormant volcano in Tanzania. It is the highest mountain in Africa, with its summit about 5,895 metres above sea level.",
]

query_embedding = model.encode(query)
document_embeddings = model.encode(documents)
print(model.similarity(query_embedding, document_embeddings))
# tensor([[0.6456, 0.4331, 0.4788]])
Image Retrieval#
query = "How many input modalities does Qwen2.5-Omni support?"
documents = [
    "https://huggingface.co/Tevatron/OmniEmbed-v0.1/resolve/main/assets/qwen2.5omni_hgf.png",
    "https://huggingface.co/Tevatron/OmniEmbed-v0.1/resolve/main/assets/llama4_hgf.png",
]

query_embedding = model.encode(query)
document_embeddings = model.encode(documents, batch_size=1)
print(model.similarity(query_embedding, document_embeddings))
# tensor([[0.5745, 0.4818]])
Audio Retrieval#
query = "A light piano piece"
documents = [
    "https://huggingface.co/Tevatron/OmniEmbed-v0.1/resolve/main/assets/joe_hisaishi_summer.mp3",
    "https://huggingface.co/Tevatron/OmniEmbed-v0.1/resolve/main/assets/jay_chou_superman_cant_fly.mp3",
]

query_embedding = model.encode(query)
document_embeddings = model.encode(documents, batch_size=1)
print(model.similarity(query_embedding, document_embeddings))
# tensor([[0.4958, 0.0964]])
Video Retrieval#
# For video on smaller GPUs, cap the processor up front:
model[0].processing_kwargs.update({
    "video": {"max_pixels": 64 * 28 * 28, "do_sample_frames": True, "fps": 1},
})

query = "How to cook Mapo Tofu?"
documents = [
    "https://huggingface.co/Tevatron/OmniEmbed-v0.1/resolve/main/assets/mapo_tofu.mp4",
    "https://huggingface.co/Tevatron/OmniEmbed-v0.1/resolve/main/assets/zhajiang_noodle.mp4",
]

query_embedding = model.encode(query)
document_embeddings = model.encode(documents, batch_size=1)
print(model.similarity(query_embedding, document_embeddings))
# tensor([[0.6638, 0.4841]])
Multimodal Inputs#

To embed a document that combines multiple modalities, pass a dict with any combination of "text", "image", "audio", and "video" keys instead of a single path or string:

documents = [
    {
        "text": "A cooking tutorial for Mapo Tofu",
        "video": "https://huggingface.co/Tevatron/OmniEmbed-v0.1/resolve/main/assets/mapo_tofu.mp4",
    },
    {
        "image": "https://huggingface.co/Tevatron/OmniEmbed-v0.1/resolve/main/assets/qwen2.5omni_hgf.png",
        "audio": "https://huggingface.co/Tevatron/OmniEmbed-v0.1/resolve/main/assets/joe_hisaishi_summer.mp3",
    },
]
document_embeddings = model.encode(documents, batch_size=1)
Using Transformers#
from transformers import Qwen2_5OmniThinkerForConditionalGeneration, Qwen2_5OmniProcessor
from qwen_omni_utils import process_mm_info

processor = Qwen2_5OmniProcessor.from_pretrained("LCO-Embedding/LCO-Embedding-Omni-7B") # or add a `max_pixels = 1280*28*28' for efficient encoding
model = Qwen2_5OmniThinkerForConditionalGeneration.from_pretrained("LCO-Embedding/LCO-Embedding-Omni-7B",
                                                                    torch_dtype=torch.bfloat16,
                                                                    device_map="auto")
Text Batch Encodings:#
texts = ["some random text", "a second random text", "a third random text"] * 30
batch_size = 8
text_prompt =  "{}\nSummarize the above text in one word:" 

all_text_embeddings = []

with torch.no_grad():
    for i in tqdm(range(0, len(texts), batch_size)):
        batch_texts = texts[i : i + batch_size]
        batch_texts = [text_prompt.format(text) for text in batch_texts]
        messages = [[
            {
                "role": "user",
                "content": [
                    {"type": "text", "text":text},
                ],

            }
        ] for text in batch_texts]
        text_inputs = processor.apply_chat_template(messages, tokenize = False, add_generation_prompt = True)
        text_inputs = processor(
        text = text_inputs,
        padding = True,
        return_tensors = "pt",
        )
        text_inputs = text_inputs.to("cuda")
        text_outputs = model(
            **text_inputs, output_hidden_states=True, return_dict=True
        ).hidden_states[-1][:, -1, :]
        all_text_embeddings.append(text_outputs.to(torch.float16).cpu())

all_text_embeddings = torch.cat(all_text_embeddings, dim=0)
Image Batch Encodings:#
images = [some random PIL.Image] * 100 # will be good to load them using dataloader; see MIEB evaluation pipeline
image_prompt = "\nSummarize the above image in one word:"
batch_size = 8

all_image_embeddings = []

with torch.no_grad():
    for i in tqdm(range(0, len(images), batch_size)):
        batch_images = images[i : i + batch_size]
        messages = [[
            {
                "role": "user",
                "content": [
                    {"type": "image", "image":image},
                    {"type": "text", "text": image_prompt},
                ],

            }
        ] for image in batch_images]
        text = processor.apply_chat_template(
            messages, tokenize=False, add_generation_prompt=True
        )
        audio_inputs, image_inputs, video_inputs = process_mm_info(messages, use_audio_in_video=True)
        inputs = processor(
            text=text, 
            audio=audio_inputs, 
            images=image_inputs, 
            videos=video_inputs, 
            return_tensors="pt", 
            padding=True
        )
        inputs = inputs.to("cuda")
        image_outputs = model(
            **inputs, output_hidden_states=True, return_dict=True
        ).hidden_states[-1][:, -1, :]
        all_image_embeddings.append(image_outputs.to(torch.float16).cpu())

all_image_embeddings = torch.cat(all_image_embeddings, dim=0)
Audio Batch Encoding:#
import logging
logging.getLogger("root").setLevel(logging.ERROR)
# set this to prevent getting the Qwen Omni system prompt mismatch warning.

batch_size = 4
audio_prompt = "\nSummarize the above audio in one word:"
audis = [some audios]  * 1000

all_audio_embeddings = []

with torch.no_grad():
  for i in tqdm(range(0, len(audios), batch_size)):
      torch.cuda.empty_cache()
      
      batch_audios = audios[i : i + batch_size]
      messages = [[
          {
              "role": "user",
              "content": [
                   {"type": "audio", "audio": audio},
                  {"type": "text", "text": audio_prompt},
              ],
              
          }
      ] for audio in batch_audios]
      
      text = processor.apply_chat_template(
          messages, tokenize=False, add_generation_prompt=True
      )
      audio_inputs, image_inputs, video_inputs = process_mm_info(
          messages, use_audio_in_video=False
      )
      inputs = processor(
          text=text, 
          audio=audio_inputs, 
          images=image_inputs, 
          videos=video_inputs, 
          return_tensors="pt", 
          padding=True
      )
      inputs = inputs.to("cuda")
      audio_outputs = model(
          **inputs, output_hidden_states=True, return_dict=True
      ).hidden_states[-1][:, -1, :]   
      all_audio_embeddings.append(audio_outputs.to(torch.float16).cpu())
      del inputs, audio_outputs
      torch.cuda.empty_cache()
                
all_audio_embeddings = torch.cat(all_audio_embeddings, dim=0)
Video Batch Encoding:#
videos = [some videos]  * 1000
video_prompt = "\nSummarize the above video in one word:"
batch_size = 4

long_video = False
# followed by some example hyperparameters to save RAM
# for long videos. Not optimal. Tune case by case.

all_video_embeddings = []
with torch.no_grad():
  for i in tqdm(range(0, len(videos), batch_size)):
      torch.cuda.empty_cache()
      
      batch_videos = videos[i : i + batch_size]
      if long_video:
          messages = [[
              {
                  "role": "user",
                  "content": [
                      {
                          "type": "video", 
                          "video": video, 
                          "max_pixels": 224 * 224,
                          "fps": 1,
                          "max_frames": 10
                      },
                      {"type": "text", "text": video_prompt},
                  ],

              }
          ] for video in batch_videos]
      else:
          messages = [[
              {
                  "role": "user",
                  "content": [
                      {
                          "type": "video", 
                          "video": video, 
                      },
                      {"type": "text", "text": video_prompt},
                  ],

              }
          ] for video in batch_videos]
      
      text = processor.apply_chat_template(
          messages, tokenize=False, add_generation_prompt=True
      )
      audio_inputs, image_inputs, video_inputs = process_mm_info(
          messages, use_audio_in_video=False
      )
      inputs = processor(
          text=text, 
          audio=audio_inputs, 
          images=image_inputs, 
          videos=video_inputs, 
          return_tensors="pt", 
          padding=True
      )
      inputs = inputs.to("cuda")
      video_outputs = model(
          **inputs, output_hidden_states=True, return_dict=True
      ).hidden_states[-1][:, -1, :]   
      all_video_embeddings.append(video_outputs.to(torch.float16).cpu())
      
      del inputs, video_outputs
      torch.cuda.empty_cache()
                
all_video_embeddings = torch.cat(all_video_embeddings, dim=0)

Overview#

We introduce LCO-Embedding, a language-centric omnimodal representation learning method and the LCO-Embedding model families, setting a new state-of-the-art on MIEB (Massive Image Embedding Benchmark), while supporting audio and videos.

This work also introduces the Generation-Representation Scaling Law, connecting models' generative capabilities and their representation upper bound. Furthermore, we introduce SeaDoc, a challenging visual document retrieval task in Southeast Asian languages, and show that continual generative pretraining before contrastive learning raises the representation upper bound.

Image: overview

Evaluation Results#

We evaluate LCO-Embedding with state-of-the-art embedding models, including E5-V, Voyage Multimodal 3, mmE5, and GME, on a MIEB-Lite benchmark (51 tasks) broken down by task categories.

Image: mieb_lite

LCO-Embedding is also SOTA on MAEB (massive audio embedding benchmark) without even training on audio. Screenshot from the MAEB paper.

Image: image

Performance and efficiency comparisons of different training strategies using 3B and 7B variants of Qwen2.5-VL backbones.

Image: lora_ablation

Scaling relationship between generation benchmark performance (X-axis) and representation benchmark performance after language-centric contrastive learning (Y-axis).

Image: scaling_law

Citation#

If you find LCO-Embedding useful for your research and applications, please cite using this BibTeX:

@article{xiao2025scaling,
  title={Scaling Language-Centric Omnimodal Representation Learning},
  author={Xiao, Chenghao and Chan, Hou Pong and Zhang, Hao and Xu, Weiwen and Aljunied, Mahani and Rong, Yu},
  journal={arXiv preprint arXiv:2510.11693},
  year={2025}
}

Files

22 files · 17.9 GBWeights 17.9 GB (safetensors). Sizes and sha256 from the signed manifest.
Show all 22 files with their sha256
FileSizesha256
.gitattributes1.57 KB34448b82c17d60fec9b65b1f093c115ddbaadc04beb1b0140b6bfed2e012a930
1_Pooling/config.json97 B766997fb7ca8613c3952afeb8ca82ee36e1c4e480b6e6b72056e38cc6f4b1102
README.md14.2 KB9b6c9d5ce34a037cf473e40bd2ddb0e5580325ed921c43606681bd6cba9aae48
added_tokens.json579 Be81a2cc3bd867a1217019eed202d1d8a07e1063ece716f22060dda14f6cc07d8
additional_chat_templates/sentence_transformers.jinja2.36 KB3c1d5ac14fd922a04795e7484dc7038275a2fd545f94caf6123eb2b34708ae92
chat_template.jinja1.28 KBd027e14db2e64eb2c23597240d42ea747b4fd5efd6e6a7604a990949c610f79c
config.json3.44 KBfa9c367db750538e4e998d9d45702d3b8d370dc1cb7514ff72b90ad071086e48
config_sentence_transformers.json432 Bc227ed92ea945570e588119566d722678ee526b2868f247934c36b9715b957d4
generation_config.json152 B1ea43963cd4777fa8e70a21f872e064c212b3a19e7d977e747a2480c6e6a1055
merges.txt1.67 MB8831e4f1a044471340f7c0a83d7bd71306a5b867e95fd870f74d0c5308a904d5
model-00001-of-00004.safetensors4.99 GB3081f51bea7183109e3a3d9d8d85c2f0de8ee74c4760d7881f84fe5e8b6f19fa
model-00002-of-00004.safetensors4.99 GB80f511cc48f3435b11d245d7828dc455a55350dbf9da897136097617d40e930b
model-00003-of-00004.safetensors4.99 GBb4c4c9cfb39cbc06a1a1fd499c962ff32bd50cbb5a17aa139c59d280a8de1047
model-00004-of-00004.safetensors2.90 GB8c30926072397c39ed68e3ac30616388e2f3d44555e15263b36392c1bb3f1655
model.safetensors.index.json108 KB71c6410232013220e797d7e431d47ca13322b897ada13ccee652e64e08bf1c30
modules.json429 Bfa7d796a215e1b2416773062891923b191fc5a4849bc44e322997433c90f459c
preprocessor_config.json667 Bb47055ce61463ce143e9aab741d55c0aa520801a0a5d63be73c5b17cecb6bc69
sentence_bert_config.json1.15 KB3c55f52fdbe73e88be9255e085da01bc9261e18bbee28f8a501d4e2a3b643072
special_tokens_map.json832 Bdc241604d085780a33f760f69c47e6622451104c20eee3cd3a12b6e884b43f44
tokenizer.json11.4 MB8441917e39ae0244e06d704b95b3124795cec478e297f9afac39ba670d7e9d99
tokenizer_config.json6.47 KB569aa7a9171e36dfff80f0a7550ab0c9c09e46ac840fea5030641417394fb0d2
vocab.json2.78 MBca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910
VersionsEach time the pinned upstream commit or file list changed in this repo. Newest first.
Upstream commitDateContents
108f6f1a5d pinned now2026-11-15 03:39 UTC22 files · 17.9 GB

Use it

$ fw get LCO-Embedding/LCO-Embedding-Omni-7B
# manifest sha256 6b7cd2e08a02… · 17.9 GB · 22 files
$ fw verify ./LCO-Embedding-Omni-7B LCO-Embedding/LCO-Embedding-Omni-7B
fw.pyChecks the signature and every sha256, tries each source in order, resumes.
$ python3 fw.py get https://freeweights.allternit.com/manifests/LCO-Embedding/LCO-Embedding-Omni-7B.json --dir ./LCO-Embedding-Omni-7B $ python3 fw.py verify ./LCO-Embedding-Omni-7B ./LCO-Embedding__LCO-Embedding-Omni-7B.json
hfThe Hugging Face CLI with one setting. Same repo id.
$ HF_ENDPOINT=https://freeweights.allternit.com hf download LCO-Embedding/LCO-Embedding-Omni-7B --revision 108f6f1a5de3b2eedd1d1c7b7005aaca6ed3802c --local-dir ./LCO-Embedding-Omni-7B
transformersLoad the weights in Python.
import os os.environ["HF_ENDPOINT"] = "https://freeweights.allternit.com" from transformers import AutoModel, AutoTokenizer tok = AutoTokenizer.from_pretrained("LCO-Embedding/LCO-Embedding-Omni-7B", revision="108f6f1a5de3b2eedd1d1c7b7005aaca6ed3802c") model = AutoModel.from_pretrained("LCO-Embedding/LCO-Embedding-Omni-7B", revision="108f6f1a5de3b2eedd1d1c7b7005aaca6ed3802c", device_map="auto")
sentence-transformersEmbed text with sentence-transformers.
import os os.environ["HF_ENDPOINT"] = "https://freeweights.allternit.com" from sentence_transformers import SentenceTransformer model = SentenceTransformer("LCO-Embedding/LCO-Embedding-Omni-7B", revision="108f6f1a5de3b2eedd1d1c7b7005aaca6ed3802c") vectors = model.encode(["Hello"])

License

Name
Apache License 2.0
Id
Apache-2.0
Class
Permissive
Redistribution
yes
Listing
Hosted (signed)
Decided
License as declared by the publisher. No person read it. 2026-11-15
Text in
README.md
Text sha256
9b6c9d5ce34a037cf473e40bd2ddb0e5580325ed921c43606681bd6cba9aae48
Terms gate
No extra terms beyond the license.

Read the license text

Licenses are checked against the license table. A custom license passes only after a person reads it.

Provenance

From: LCO-Embedding <huggingface.co/LCO-Embedding>Newsgroups: alt.freeweights.embedSubject: LCO-Embedding-Omni-7BDate: 2026-11-15Commit: 108f6f1Signed: 2DC28CC7B26A283B ✓
Upstream
LCO-Embedding/LCO-Embedding-Omni-7B
Pinned commit
108f6f1a5de3b2eedd1d1c7b7005aaca6ed3802c
Manifest
LCO-Embedding-Omni-7B.json · .minisig
Manifest sha256
6b7cd2e08a02364f62eb2dd7464a6a06450c6497fd299cdedb9de3f7de246253
Signature
minisign, Ed25519, key 2DC28CC7B26A283B
Created
2026-11-15 03:39 UTC
Generator
freeweights-manifest/0.1.0
Takedowns
None.

How to verify

$ curl -O https://freeweights.allternit.com/manifests/LCO-Embedding/LCO-Embedding-Omni-7B.json $ curl -O https://freeweights.allternit.com/manifests/LCO-Embedding/LCO-Embedding-Omni-7B.json.minisig $ minisign -Vm LCO-Embedding-Omni-7B.json -P RWQ7KGqyx4zCLXtUFOqvfv8L3g+8fpKJ1FsuxPyOYMF+4KufbUxKq1Oq $ shasum -a 256 <file> # compare with the Files tab

A manifest whose signature fails must be rejected. A file whose size or sha256 does not match must be discarded. Verify a download

Model tree

2 models in the catalog name this one as their parent.

Fine-tunes
1
Adapters
1
Fine-tunes 1
Adapters 1
Get it
Download
$ HF_ENDPOINT=https://freeweights.allternit.com hf download LCO-Embedding/LCO-Embedding-Omni-7B
Open in Freeweights Studio

Pull, verify and run it in the Allternit app on Desktop, web or phone.

Signed manifest
minisign, key 2DC28CC7B26A283B. LCO-Embedding-Omni-7B.json. Provenance. Takedown history: none.

Variants

1 quantized or adapter build of LCO-Embedding-Omni-7B. Each has its own license check and page.

From: sentence-transformers <huggingface.co/sentence-transformers>Subject: all-MiniLM-L6-v1
From: unsloth <huggingface.co/unsloth>Subject: all-MiniLM-L6-v2
From: mlx-community <huggingface.co/mlx-community>Subject: all-MiniLM-L6-v2-4bit
From: sentence-transformers <huggingface.co/sentence-transformers>Subject: all-mpnet-base-v1
From: sentence-transformers <huggingface.co/sentence-transformers>Subject: allenai-specter
From: sentence-transformers <huggingface.co/sentence-transformers>Subject: bert-base-nli-max-tokens