Model reference · open weights
ctxl-rerank-multilingual is an open-weight reranker from ContextualAI. ctxl-rerank-v2-instruct-multilingual-1b-fp8 (FP8) weighs 2.0 GB; the smallest configuration that runs it is RTX 3060 12 GB.
For self-hosting, compare this build's requirements below with the GPU you plan to rent.
Summary of the ContextualAI/ctxl-rerank-v2-instruct-multilingual-1b-fp8 model card, 2026-10-01
What it is
| Released by | ContextualAI |
|---|---|
| Released | 2026-04-23 |
| Parameters | 1.3B |
| VRAM | 2.0 GB for the weights |
What it runs on
| Card | Runs | Memory |
|---|---|---|
| RTX 3060 12 GB | fits | 11.6 GB |
| RTX 4060 Ti 16 GB | fits | 15.4 GB |
| RTX 3090 24 GB | fits | 23.4 GB |
| RTX 4090 24 GB | fits | 23.4 GB |
| RTX 5090 32 GB | fits | 31.0 GB |
| L40S 48 GB | fits | 44.0 GB |
| A100 80 GB | fits | 78.2 GB |
| H100 80 GB | fits | 78.1 GB |
| RTX PRO 6000 Blackwell 96 GB | fits | 93.8 GB |
| DGX Spark (GB10) 128 GB unified | fits | 107 GB |
| H200 141 GB | fits | 138 GB |
| B200 180 GB | fits | 176 GB |
Builds
| Build | Params | Precision | Weights | Smallest setup |
|---|---|---|---|---|
| ctxl-rerank-v2-instruct-multilingual-1b-fp8 (above) ↗ | 1.3B | FP8 | 2.0 GB | RTX 3060 12 GB |
| ctxl-rerank-v2-instruct-multilingual-2b ↗ | 2.6B | BF16 | 6.0 GB | RTX 3060 12 GB |
From the model card
Contextual AI's reranker is the first instruction-following reranker capable of handling retrieval conflicts and ranking with custom instructions (e.g., prioritizing recent information). It achieves state-of-the-art performance on BEIR and sits on the cost/performance Pareto frontier across:
For detailed benchmarks, see our blog post.
Use this reranker when you need to:
# Choose vLLM (recommended for production) or Transformers (simpler setup)
# See full implementation in sections below
model_path = "ContextualAI/ctxl-rerank-v2-instruct-multilingual-1b"
query = "What are the health benefits of exercise?"
instruction = "Prioritize recent medical research"
documents = [
"Regular exercise reduces risk of heart disease and improves mental health.",
"A 2024 study shows exercise enhances cognitive function in older adults.",
"Ancient Greeks valued physical fitness for military training."
]
# Using vLLM (see full code below):
infer_w_vllm(model_path, query, instruction, documents)
# OR using Transformers (see full code below):
infer_w_hf(model_path, query, instruction, documents)
Expected Output:
Query: What are the health benefits of exercise?
Instruction: Prioritize recent medical research
Score: 0.5039 | Doc: A 2024 study shows exercise enhances cognitive function in older adults.
Score: -0.8398 | Doc: Regular exercise reduces risk of heart disease and improves mental health.
Score: -9.3125 | Doc: Ancient Greeks valued physical fitness for military training.
Requires vllm==0.10.0 for NVFP4 or vllm>=0.8.5 for BF16.
import os
os.environ['VLLM_USE_V1'] = '0' # v1 engine doesn't support logits processor yet
import torch
from vllm import LLM, SamplingParams
def logits_processor(_, scores):
"""Custom logits processor for vLLM reranking."""
index = scores[0].view(torch.uint16)
scores = torch.full_like(scores, float("-inf"))
scores[index] = 1
return scores
def format_prompts(query: str, instruction: str, documents: list[str]) -> list[str]:
"""Format query and documents into prompts for reranking."""
if instruction:
instruction = f" {instruction}"
prompts = []
for doc in documents:
prompt = f"Check whether a given document contains information helpful to answer the query.\n {doc}\n {query}{instruction} ??"
prompts.append(prompt)
return prompts
def infer_w_vllm(model_path: str, query: str, instruction: str, documents: list[str]):
model = LLM(
model=model_path,
gpu_memory_utilization=0.85,
max_model_len=8192,
dtype="bfloat16",
max_logprobs=2,
max_num_batched_tokens=262144,
)
sampling_params = SamplingParams(
temperature=0,
max_tokens=1,
logits_processors=[logits_processor]
)
prompts = format_prompts(query, instruction, documents)
outputs = model.generate(prompts, sampling_params, use_tqdm=False)
# Extract scores and create results
results = []
for i, output in enumerate(outputs):
score = (
torch.tensor([output.outputs[0].token_ids[0]], dtype=torch.uint16)
.view(torch.bfloat16)
.item()
)
results.append((score, i, documents[i]))
# Sort by score (descending)
results = sorted(results, key=lambda x: x[0], reverse=True)
print(f"Query: {query}")
print(f"Instruction: {instruction}")
for score, doc_id, doc in results:
print(f"Score: {score:.4f} | Doc: {doc}")
# Example usage
if __name__ == "__main__":
model_path = "ContextualAI/ctxl-rerank-v2-instruct-multilingual-1b"
query = "What are the health benefits of exercise?"
instruction = "Prioritize recent medical research"
documents = [
"Regular exercise reduces risk of heart disease and improves mental health.",
"A 2024 study shows exercise enhances cognitive function in older adults.",
"Ancient Greeks valued physical fitness for military training."
]
infer_w_vllm(model_path, query, instruction, documents)
Requires transformers>=4.51.0 for BF16. Not supported for NVFP4.
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
def format_prompts(query: str, instruction: str, documents: list[str]) -> list[str]:
"""Format query and documents into prompts for reranking."""
if instruction:
instruction = f" {instruction}"
prompts = []
for doc in documents:
prompt = f"Check whether a given document contains information helpful to answer the query.\n {doc}\n {query}{instruction} ??"
prompts.append(prompt)
return prompts
def infer_w_hf(model_path: str, query: str, instruction: str, documents: list[str]):
device = "cuda" if torch.cuda.is_available() else "cpu"
dtype = torch.bfloat16 if torch.cuda.is_available() else torch.float32
tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=True)
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "left" # so -1 is the real last token for all prompts
model = AutQuoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.