Nandi-Mini-600M-Early-Checkpoint 是即将推出的 Nandi-Mini-600M 模型系列的早期 checkpoint(在训练了 2500 亿 tokens 之后)。这并非最终模型,而是一款紧凑型多语言语言模型,专注于高效能、部署灵活性以及对印度语言的支持。
该模型完全从头开始训练,旨在以较低的计算和内存成本提供强大性能。分享此 checkpoint 是为了让大家提前了解模型的缩放行为和训练进展。
本次发布的是早期 checkpoint,并非最终收敛模型。随着训练的持续进行和规模的扩大,其性能有望进一步提升。
📢 我们即将发布技术博客!敬请关注!
Nandi-Mini-600M 引入了多项以效率为中心的架构优化,专为紧凑且功能强大的语言模型而设计。
共享 KV 是 Nandi-Mini 中探索的核心架构理念之一。不再分别计算键(Key)和值(Value)的投影,而是两者复用一个共享的潜在表示,同时专门为注意力计算应用一个轻量级的键归一化步骤。
这种设计在推理过程中将 KV 缓存的内存使用量减少了约 50%,而计算开销仅略有增加,因为旋转位置编码(RoPE)和键归一化是在注意力计算过程中动态应用的。
Nandi 支持两种 KV 缓存模式:
"kv_cache_mode": "shared"采用共享KV,将KV缓存内存减少约50%,计算开销略有增加。
"kv_cache_mode": "vanilla"采用标准的独立键值缓存(Key-Value caching),以实现最大的推理兼容性并降低计算开销。
共享键值缓存(Shared KV)是我们对可部署基础模型更广泛关注的一部分,这些模型针对以下场景进行了优化:
这仍是Nandi模型系列中一个活跃的研究领域,我们计划在即将发布的技术博客中分享更深入的技术细节。
这并非最终模型,而是一个早期检查点。因此,结果并非最终版本。目前仅完成了20%的训练。
| 模型 | 训练 tokens(百亿) | HellaSwag | WinoGrande | OBQA | PIQA | GPQA | ARC-e | ARC-c | MMLU | 平均值 |
|---|---|---|---|---|---|---|---|---|---|---|
| MobiLlama-0.5B-Base | 1.3 | 39.65 | 53.67 | 30.60 | 70.35 | 24.33 | 52.82 | 23.63 | 24.18 | 39.90 |
| Qwen-2-0.5B-Base | 12 | 49.01 | 57.69 | 33.20 | 68.98 | 27.23 | 54.79 | 25.42 | 44.06 | 45.05 |
| Qwen2.5-0.5B-Base | 18 | 52.16 | 56.82 | 35.40 | 70.29 | 24.10 | 64.64 | 29.86 | 47.41 | 47.59 |
| Qwen3-0.6B-Base | 36 | 53.77 | 59.19 | 34.40 | 70.29 | 30.80 | 65.44 | 33.78 | 50.34 | 49.75 |
| Qwen3.5-0.8B-Base | 36 | 54.87 | 60.54 | 35.80 | 70.02 | 31.25 | 70.50 | 38.23 | 52.73 | 51.74 |
| SmolLM-360M-Base | 0.6 | 53.33 | 57.22 | 37.60 | 70.56 | 21.20 | 70.24 | 33.27 | 24.92 | 46.04 |
| SmolLM2-360M-Base | 4 | 56.30 | 59.19 | 37.60 | 71.81 | 25.22 | 67.88 | 36.68 | 25.55 | 47.53 |
| Nandi-Mini-600M-Early-Checkpoint-Base | 0.2 | 44.86 | 54.77 | 34.80 | 68.60 | 26.33 | 64.73 | 29.70 | 29.01 | 44.10 |
| 语言 | SmolLM3-3B | Qwen3-0.6B-Base | Sarvam-1 | Nandi-Mini-600M |
|---|---|---|---|---|
| English | 1.17 | 1.16 | 1.32 | 1.18 |
| Bengali | 8.66 | 7.51 | 1.55 | 1.44 |
| Gujarati | 10.47 | 9.37 | 1.55 | 1.53 |
| Hindi | 2.71 | 5.14 | 1.25 | 1.32 |
| Kannada | 16.43 | 12.96 | 2.10 | 1.90 |
| Malayalam | 17.77 | 14.56 | 2.49 | 2.05 |
| Marathi | 3.73 | 6.70 | 1.55 | 1.55 |
| Oriya | 19.07 | 15.75 | 2.18 | 2.68 |
| Punjabi | 9.23 | 8.66 | 1.47 | 1.42 |
| Tamil | 13.56 | 10.93 | 2.06 | 2.05 |
| Telugu | 15.40 | 13.38 | 2.09 | 1.77 |
| Assamese | 9.26 | 8.13 | 4.31 | 1.51 |
该模型在英语和多种印度语言上进行了训练,包括:
Hindi, Bengali, Tamil, Telugu, Marathi, Gujarati, Kannada, Malayalam, Punjabi, Odia
!pip install transformers=='5.4.0'
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_name = "FrontiersMind/Nandi-Mini-600M-Early-Checkpoint"
tokenizer = AutoTokenizer.from_pretrained(
model_name,
trust_remote_code=True
)
device = "cuda" if torch.cuda.is_available() else "cpu"
model = AutoModelForCausalLM.from_pretrained(
model_name,
trust_remote_code=True,
dtype=torch.bfloat16
).to(device).eval()
#model.config.kv_cache_mode = "shared" # Use this one if wants to save 50% KV cache, but this will slight more compute
model.config.kv_cache_mode = "vanilla"
prompt = """The night was quiet and the streets were empty"""
model_inputs = tokenizer(
[prompt],
return_tensors="pt"
).to(model.device)
outputs = model.generate(
**model_inputs,
max_new_tokens=50,
do_sample=True,
temperature=0.3,
top_k=20,
top_p=0.95,
repetition_penalty=1.1,
pad_token_id=tokenizer.eos_token_id,
use_cache=True,
)
response = tokenizer.decode(
outputs[0],
skip_special_tokens=True
)
print(response)