CoolFace
Modelpublic

matrixdose/sarvam-30b

sourceHugging Faceapache-2.0updated 6mo agoView on Hugging Face
0likes27downloads
Model Card

image

Want a bigger model? Download Sarvam-105B!

Index

  1. 1.Introduction
  2. 2.Architecture
  3. 3.Benchmarks
  4. 4.Knowledge & Coding
  5. 5.Reasoning & Math
  6. 6.Agentic
  7. 7.Inference
  8. 8.Hugging Face
  9. 9.vLLM
  10. 10.SGLang
  11. 11.Footnote
  12. 12.Citation

Introduction

Sarvam-30B is an advanced Mixture-of-Experts (MoE) model with 2.4B non-embedding active parameters, designed primarily for practical deployment. It combines strong reasoning, reliable coding ability, and best-in-class conversational quality across Indian languages. Sarvam-30B is built to run reliably in resource-constrained environments and can handle multilingual voice calls while performing tool calls.

A major focus during training was the Indian context and languages, resulting in state-of-the-art performance across 22 Indian languages for its model size.

Sarvam-30B is open-sourced under the Apache License. For more details, see our blog.

Architecture

The 30B MoE model is designed for throughput and memory efficiency. It uses 19 layers, a dense FFN intermediate_size of 8192, moe_intermediate_size of 1024, top-6 routing, grouped KV heads (num_key_value_heads=4), and an extremely high rope_theta (8e6) for long-context stability without RoPE scaling. It has 128 experts with a shared expert, a routed scaling factor of 2.5, and auxiliary-loss-free router balancing. The 30B model focuses on throughput and memory efficiency through fewer layers, grouped KV attention, and smaller experts.

Benchmarks

<details> <summary>Knowledge & Coding</summary>

BenchmarkSarvam-30BGemma 27B ItMistral-3.2-24BOLMo 3.1 32B ThinkNemotron-3-Nano-30B-A3BQwen3-30B-Thinking-2507GLM 4.7 FlashGPT-OSS-20B
Math50097.087.469.496.298.097.697.094.2
HumanEval92.188.492.995.197.695.796.395.7
MBPP92.781.878.358.791.994.391.895.3
Live Code Bench v670.028.026.073.068.366.064.061.0
MMLU85.181.280.586.484.088.486.985.3
MMLU Pro80.068.169.172.078.380.973.675.0
MILU76.869.267.969.964.882.675.673.7
Arena Hard v249.050.143.142.067.772.158.162.9
Writing Bench78.771.470.375.783.785.079.279.1

</details>

<details> <summary>Reasoning & Math</summary>

BenchmarkSarvam-30BOLMo 3.1 32BNemotron-3-Nano-30BQwen3-30B-Thinking-2507GLM 4.7 FlashGPT-OSS-20B
GPQA Diamond66.557.573.073.475.271.5
AIME 25 (w/ Tools)88.3 (96.7)78.1 (81.7)89.1 (99.2)85.0 (-)91.6 (-)91.7 (98.7)
HMMT (Feb 25)73.351.785.071.485.076.7
HMMT (Nov 25)74.258.375.073.381.768.3
Beyond AIME58.348.564.061.060.046.0

</details>

<details> <summary>Agentic</summary>

BenchmarkSarvam-30BNemotron-3-Nano-30BQwen3-30B-Thinking-2507GLM 4.7 FlashGPT-OSS-20B
BrowseComp35.523.82.942.828.3
SWE Bench Verified34.038.822.059.234.0
τ² Bench (avg.)45.749.047.779.548.7
See footnote for evaluation details.

</details>

Inference

<details> <summary>Huggingface</summary>

python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

model_name = "sarvamai/sarvam-30b"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, trust_remote_code=True, device_map="auto")

def generate_text(
    prompt: str,
    max_new_tokens: int = 2048,
    temperature: float = 0.8,
    top_p: float = 0.95,
    repetition_penalty: float = 1.0,
) -> None:
    inputs = tokenizer(prompt, return_tensors="pt").to("cuda:0")

    generation_config = GenerationConfig(
        max_new_tokens=max_new_tokens,
        repetition_penalty=repetition_penalty,
        temperature=temperature,
        top_p=top_p,
        do_sample=True,
    )

    with torch.no_grad():
        output_ids = model.generate(
            input_ids=inputs["input_ids"],
            attention_mask=inputs["attention_mask"],
            generation_config=generation_config,
        )
    return tokenizer.decode(output_ids[0], skip_special_tokens=True)

prompts = [
    "What is the capital city of New Zealand?",
]

for prompt in prompts:
    templated_prompt = tokenizer.apply_chat_template(
      [{"role": "user", "content": prompt}],
      tokenize=False,
      add_generation_prompt=True,
      enable_thinking=True
    )
    output = generate_text(templated_prompt, max_new_tokens=512)
    print("Prompt: ", prompt)
    print("Generated text: ", output)
    print("=" * 100)

</details>

<details> <summary>SGLang</summary>

Install latest SGLang from source

bash
git clone https://github.com/sgl-project/sglang.git
cd sglang
pip install -e "python[all]"

Instantiate model and Run

python
import sglang as sgl
from transformers import AutoTokenizer

model_path = "sarvamai/sarvam-30b"
engine = sgl.Engine(
    model_path=model_path,
    tp_size=2,
    mem_fraction_static=0.8,
    trust_remote_code=True,
    dtype="bfloat16",
    prefill_attention_backend="fa3",
    decode_attention_backend="fa3",
)

sampling_params = {
    "temperature": 0.8,
    "max_new_tokens": 2048,
    "repetition_penalty": 1.0,
}

prompts = [
    "Which treaty formally ended World War I and imposed heavy reparations on Germany?",
]

outputs = engine.generate([
    tokenizer.apply_chat_template([
        {"role": "user", "content": prompt}],
        tokenize=False,
        add_generation_prompt=True,
        enable_thinking=True)
        for prompt in prompts], 
    sampling_params)
for p, o in zip(prompts, outputs):
    print("Prompt: ", p)
    print("Generated text: ", o['text'])
    print("=" * 100)

</details>

<details> <summary>vLLM</summary>

Note: currently a PR is open for native support for the Sarvam models in vLLM (link). Therefore, we have 2 options here.

Option 1: install from source (hard)
  • —Use the custom fork here: link
  • —Follow the instructions here to install from source: link
Option 2: hot-patch (easy)
  • —Run hotpatch_vllm.py
  • —This will do the following:
  • —install vllm=0.15.0
  • —add 2 model entries to registry.py
  • —download the model executors for sarvam-105b and sarvam-30b

Once this is done, you can run vLLM as usual

python
from vllm import LLM, SamplingParams
from transformers import AutoTokenizer

model_path = "sarvamai/sarvam-30b"
tokenizer = AutoTokenizer.from_pretrained(model_path)
llm = LLM(model=model_path, 
            trust_remote_code=True, 
            max_model_len=2048, 
            tensor_parallel_size=8, 
            max_num_seqs=16,
        )
sampling_params = SamplingParams(
                    temperature=0.8, 
                    max_tokens=2048, 
                    repetition_penalty=1.0,
                    spaces_between_special_tokens=True
                )

prompts = [
    "Who wrote The Picture of Dorian Gray?",
]

outputs = llm.generate([
    tokenizer.apply_chat_template([
        {"role": "user", "content": prompt}],
        tokenize=False,
        add_generation_prompt=True,
        enable_thinking=True)
        for prompt in prompts], 
    sampling_params)
for p, o in zip(prompts, outputs):
    print("Prompt: ", p)
    print("Generated text: ", o.outputs[0].text)
    print("=" * 100)

</details>

Footnote

  • —General settings: All benchmarks are evaluated with a maximum context length of 65,536 tokens.
  • —Reasoning & Math benchmarks (Math500, MMLU, MMLU Pro, GPQA Diamond, AIME 25, Beyond AIME, HMMT, HumanEval, MBPP): Evaluated with temperature=1.0, top_p=1.0, max_new_tokens=65536.
  • —Coding & Knowledge benchmarks (Live Code Bench v6, Arena Hard v2, IF Eval): Evaluated with temperature=1.0, top_p=1.0, max_new_tokens=65536.
  • —Writing Bench: Responses generated using official Writing-Bench parameters: temperature=0.7, top_p=0.8, top_k=20, max_length=16000. Scoring performed using the official Writing-Bench critic model with: temperature=1.0, top_p=0.95, max_length=2048.
  • —Agentic benchmarks (BrowseComp, SWE Bench Verified, τ² Bench): Evaluated with temperature=0.5, top_p=1.0, max_new_tokens=32768.

Citation

@misc{sarvam_sovereign_models,
  title        = {Introducing Sarvam's Sovereign Models},
  author       = {{Sarvam Foundation Models Team}},
  year         = {2026},
  howpublished = {\url{https://www.sarvam.ai/blogs/sarvam-30b-105b}},
  note         = {Accessed: 2026-03-03}
}