Views
No views yet
huggingface-cli download mimir-lcm/Mimir-1.6B-Instruct --local-dir mimir-lcm/Mimir-1.6B-Instruct
git clone https://github.com/facebookresearch/large_concept_model.git
mv large_concept_model/lcm .
pip install torch==2.5.1 --extra-index-url https://download.pytorch.org/whl/cu121 --upgrade
pip install fairseq2==v0.3.0rc1 --pre --extra-index-url https://fair.pkg.atmeta.com/fairseq2/whl/rc/pt2.5.1/cu121 --upgrade
pip install omegaconf==2.3.0
pip install sonar-space==0.3.2
pip install wtpsplit==2.1.21import lcm
2import torch
3from pathlib import Path
4
5from lcm.models.two_tower_diffusion_lcm.builder import (
6 create_two_tower_diffusion_lcm_model,
7)
8from lcm.models.two_tower_diffusion_lcm.archs import two_tower_diffusion_lcm_1_6B
9from lcm.inference.two_tower_diffusion_lcm.generator import (
10 TwoTowerDiffusionLCMGenerator,
11 DiffusionLCMGeneratorOptions,
12)
13from lcm.datasets.batch import EmbeddingsBatch
14from sonar.inference_pipelines.text import TextToEmbeddingModelPipeline, EmbeddingToTextModelPipeline
15
16from wtpsplit import SaT
17
18lcm.setup_fairseq2()
19
20DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
21
22from lcm.models.two_tower_diffusion_lcm.builder import TwoTowerDiffusionLCModel
23
24_original_sample_fn = TwoTowerDiffusionLCModel.sample_initial_noise_vectors
25
26def _patched_sample_fn(self, batch_size: int):
27 latents = _original_sample_fn(self, batch_size)
28 return latents.to(dtype=self.dtype)
29
30TwoTowerDiffusionLCModel.sample_initial_noise_vectors = _patched_sample_fn
31
32CHECKPOINT_PATH = "mimir-lcm/Mimir-1.6B-Instruct/model.pt"
33INFERENCE_DTYPE = torch.float16
34
35TEXT_DECODER = EmbeddingToTextModelPipeline(decoder="text_sonar_basic_decoder", tokenizer="text_sonar_basic_decoder", device=torch.device(DEVICE))
36TEXT_EMBEDDER = TextToEmbeddingModelPipeline(encoder="text_sonar_basic_encoder", tokenizer="text_sonar_basic_encoder", device=torch.device(DEVICE))
37
38def decode_embeddings(embeddings):
39
40 embeddings = embeddings.to(device=DEVICE, dtype=torch.float32)
41
42 print("Decoding...")
43 results = TEXT_DECODER.predict(
44 embeddings,
45 target_lang="eng_Latn"
46 )
47
48 return results
49
50def get_eos_vector():
51 return TEXT_EMBEDDER.predict(["End of text."], source_lang="eng_Latn").squeeze().to(device=DEVICE, dtype=INFERENCE_DTYPE)
52
53def load_two_tower_model(checkpoint_path, device="cuda"):
54
55 config = two_tower_diffusion_lcm_1_6B()
56
57 print("Building model structure...")
58 model = create_two_tower_diffusion_lcm_model(
59 config,
60 device=torch.device(device),
61 dtype=INFERENCE_DTYPE
62 )
63
64 print(f"Loading weights from {checkpoint_path}...")
65 state_dict = torch.load(checkpoint_path, map_location=device)
66
67 if "model" in state_dict:
68 state_dict = state_dict["model"]
69
70 model.load_state_dict(state_dict, strict=True)
71
72 model.eval()
73 model.to(device=DEVICE, dtype=INFERENCE_DTYPE)
74 print("Model loaded successfully.")
75 return model
76
77def run_inference(model, prompt_embeddings, device="cuda"):
78
79 options = DiffusionLCMGeneratorOptions(
80 eos_threshold=0.9,
81 inference_timesteps=40,
82 initial_noise_scale=0.6,
83 guidance_scale=1.5,
84 guidance_rescale=0.7,
85 epsilon_scaling=1.00045,
86 stop_on_repetition_cosine_threshold=0.9,
87 seed=42,
88 )
89
90 generator = TwoTowerDiffusionLCMGenerator(model, options, eos_vec=get_eos_vector())
91
92 seqs = prompt_embeddings.to(device)
93 batch_input = EmbeddingsBatch(seqs=seqs, padding_mask=None)
94
95 print("Running generation...")
96 output = generator(batch_input)
97
98 return output
99
100if __name__ == "__main__":
101
102 raw_prompt_text = "User turn.\n\nJohn lives in his house and loves to play soccer.\n\nGive a brief definition of the word \"house\" in the sentence given as input. Generate only the definition.\n\nAssistant turn."
103
104 model = load_two_tower_model(CHECKPOINT_PATH, DEVICE)
105
106 with torch.no_grad():
107
108 sat_model = SaT("segment-any-text/sat-3l")
109 if torch.cuda.is_available():
110 sat_model.half().to(DEVICE)
111
112 split_outputs = list(sat_model.split([raw_prompt_text], threshold=0.02))
113 sentences = [s.strip() for s in split_outputs[0] if s.strip()]
114
115 print(sentences)
116
117 prompt = TEXT_EMBEDDER.predict(sentences, source_lang="eng_Latn", batch_size=1024)
118 prompt = prompt.to(device=DEVICE, dtype=INFERENCE_DTYPE)
119 prompt = prompt.unsqueeze(0)
120
121 results = run_inference(model, prompt, DEVICE)
122
123 for j, hyp in enumerate(results.hypotheses[0]):
124 print(decode_embeddings(hyp.seq)[prompt.shape[1]:])1USER_TRANSLATION = {
2 "arb_Arab": "دور المستخدم.",
3 "bel_Cyrl": "Ход карыстальніка.",
4 "ben_Beng": "ব্যবহারকারীর পালা।",
5 "bos_Latn": "Red korisnika.",
6 "bul_Cyrl": "Ред е на потребителя.",
7 "cat_Latn": "Torn de l'usuari.",
8 "ces_Latn": "Je řada na uživateli.",
9 "cym_Latn": "Tro'r defnyddiwr.",
10 "dan_Latn": "Brugerens tur.",
11 "deu_Latn": "Der Benutzer ist am Zug.",
12 "eng_Latn": "User turn.",
13 "fra_Latn": "C'est au tour de l'utilisateur.",
14 "heb_Hebr": "תור המשתמש.",
15 "hin_Deva": "उपयोगकर्ता की बारी।",
16 "hrv_Latn": "Poteg korisnika.",
17 "ind_Latn": "Giliran pengguna.",
18 "jpn_Jpan": "ユーザーの番です。",
19 "ita_Latn": "È il turno dell'utente.",
20 "kan_Knda": "ಬಳಕೆದಾರರ ತಿರುವು.",
21 "kor_Hang": "사용자 차례입니다.",
22 "lvs_Latn": "Lietotāja kārta.",
23 "mal_Mlym": "ഉപയോക്താവിന്റെ ഊഴം",
24 "mar_Deva": "वापरकर्त्याची पाळी.",
25 "mkd_Cyrl": "Потребен е корисник.",
26 "npi_Deva": "प्रयोगकर्ताको पालो।",
27 "nld_Latn": "De gebruiker is aan de beurt.",
28 "ory_Orya": "ୟୁଜର୍ ଟର୍ନ୍ |",
29 "pol_Latn": "Ruch użytkownika.",
30 "por_Latn": "É a vez do utilizador.",
31 "ron_Latn": "E rândul utilizatorului.",
32 "rus_Cyrl": "Ход пользователя.",
33 "slk_Latn": "Je na ťa.",
34 "slv_Latn": "Na vrsti je uporabnik.",
35 "srp_Cyrl": "Кориснички потез.",
36 "spa_Latn": "Turno del usuario.",
37 "swe_Latn": "Användarens tur.",
38 "swh_Latn": "Mzunguko wa mtumiaji.",
39 "tam_Taml": "பயனர் முறை.",
40 "tel_Telu": "వినియోగదారుని వంతు",
41 "tha_Thai": "ผู้ใช้เทิร์น",
42 "tur_Latn": "Kullanıcı sırası.",
43 "ukr_Cyrl": "Хід користувача.",
44 "urd_Arab": "صارف کی باری۔",
45 "vie_Latn": "Đến lượt người dùng.",
46 "zho_Hans": "轮到用户了。"
47}1ASSISTANT_TRANSLATION = {
2 "arb_Arab": "دور المساعد.",
3 "bel_Cyrl": "Памочнік, свой ход.",
4 "ben_Beng": "সহকারী পালা।",
5 "bos_Latn": "Pomoćni potez.",
6 "bul_Cyrl": "Ред е на помощника.",
7 "cat_Latn": "Torn de l'ajudant.",
8 "ces_Latn": "Na řadě je asistent.",
9 "cym_Latn": "Tro'r cynorthwyydd.",
10 "dan_Latn": "Assistenten er på tur.",
11 "deu_Latn": "Der Assistent ist an der Reihe.",
12 "eng_Latn": "Assistant turn.",
13 "fra_Latn": "C'est au tour de l'assistant.",
14 "heb_Hebr": "תורו של העוזר.",
15 "hin_Deva": "सहायक की बारी।",
16 "hrv_Latn": "Pomoćni potez.",
17 "ind_Latn": "Giliran asisten.",
18 "jpn_Jpan": "アシスタントの番。",
19 "ita_Latn": "È il turno dell'assistente.",
20 "kan_Knda": "ಸಹಾಯಕ ತಿರುವು.",
21 "kor_Hang": "조수 차례.",
22 "lvs_Latn": "Palīga kārta.",
23 "mal_Mlym": "സഹായിയുടെ ഊഴം",
24 "mar_Deva": "सहाय्यक पालवी.",
25 "mkd_Cyrl": "Помошник-ред.",
26 "npi_Deva": "सहायक पालो।",
27 "nld_Latn": "De assistent is aan de beurt.",
28 "ory_Orya": "ଆସିଷ୍ଟାଣ୍ଟ ଟର୍ନ୍ |",
29 "pol_Latn": "Rzuty pomocników.",
30 "por_Latn": "É a vez do assistente.",
31 "ron_Latn": "E rândul asistentului.",
32 "rus_Cyrl": "Очередь помощника.",
33 "slk_Latn": "Na rade je asistent.",
34 "slv_Latn": "Na vrsti je pomočnik.",
35 "srp_Cyrl": "Помоћни круг.",
36 "spa_Latn": "Turno del asistente.",
37 "swe_Latn": "Assistenten är på tur.",
38 "swh_Latn": "Mzunguko wa msaidizi.",
39 "tam_Taml": "துணைவரின் முறை.",
40 "tel_Telu": "సహాయకుడి వంతు",
41 "tha_Thai": "ผู้ช่วยเลี้ยว",
42 "tur_Latn": "Sıra asistanında.",
43 "ukr_Cyrl": "Черга помічника.",
44 "urd_Arab": "معاون کی باری۔",
45 "vie_Latn": "Đến lượt trợ lý.",
46 "zho_Hans": "助手的回合。"
47}1@misc{musacchio2026mimirlargescalemultilingualconcept,
2 title={Mimir: Large-scale Multilingual Concept Modeling},
3 author={Elio Musacchio and Lucia Siciliani and Pierpaolo Basile},
4 year={2026},
5 eprint={2605.25263},
6 archivePrefix={arXiv},
7 primaryClass={cs.CL},
8 url={https://arxiv.org/abs/2605.25263},
9}