Instructions to use SaifPunjwani/jrl-checkpoints with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use SaifPunjwani/jrl-checkpoints with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="SaifPunjwani/jrl-checkpoints")# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("SaifPunjwani/jrl-checkpoints", device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use SaifPunjwani/jrl-checkpoints with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "SaifPunjwani/jrl-checkpoints" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "SaifPunjwani/jrl-checkpoints", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker
docker model run hf.co/SaifPunjwani/jrl-checkpoints
- SGLang
How to use SaifPunjwani/jrl-checkpoints with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "SaifPunjwani/jrl-checkpoints" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "SaifPunjwani/jrl-checkpoints", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "SaifPunjwani/jrl-checkpoints" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "SaifPunjwani/jrl-checkpoints", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }' - Docker Model Runner
How to use SaifPunjwani/jrl-checkpoints with Docker Model Runner:
docker model run hf.co/SaifPunjwani/jrl-checkpoints
JRL and MR-ME checkpoint release
This release ships eight reasoning-model checkpoints together, covering Qwen3-1.7B, Qwen3-4B, and Ministral-3-3B, with GPU and TPU/JAX exports.
Each scorecard must refer to one immutable checkpoint revision and its own evaluation configuration. Results from different checkpoints or evaluation protocols must not be combined into a single scorecard.
Models
| Model | Release label | Checkpoint |
|---|---|---|
| Qwen3-1.7B | MR-ME | qwen3-1.7b-mrme-ckpt1 |
| Qwen3-1.7B | JRL | qwen3-1.7b-jrl-ckpt2 |
| Qwen3-1.7B | Long-DAPO | qwen3-1.7b-long-dapo-ckpt5 |
| Qwen3-1.7B | DAPO | qwen3-1.7b-dapo |
| Qwen3-4B | JRL | qwen3-4b-jrl-ckpt3 |
| Qwen3-4B | MR-ME | qwen3-4b-mrme |
| Ministral-3-3B | JRL | ministral-3-3b-jrl-ckpt4 |
| Ministral-3-3B | MR-ME | ministral-3-3b-mrme |
In the method terminology, DAPO is the correctness-only baseline; JRL separates a novelty-rewarded Explorer from the final Main model; MR-ME extends that design to multiple explorers and rounds. The table identifies the release entries. These names alone do not establish a particular export's training recipe, update budget, explorer schedule, or training hardware; those details require its associated run records.
Directory layout
Each entry has gpu/ and tpu/ subfolders. These are loading formats for the
corresponding checkpoint, not separate benchmark candidates. The current
repository contains inference exports rather than resumable training state.
It does not bundle optimizer state, training logs, evaluation outputs, or
generated trajectories.
Available exports
| Folder | Architecture | GPU export | TPU/JAX export |
|---|---|---|---|
qwen3-1.7b-mrme-ckpt1 |
Qwen3-1.7B | safetensors | framework-neutral safetensors |
qwen3-1.7b-jrl-ckpt2 |
Qwen3-1.7B | sharded safetensors | Flax MsgPack |
qwen3-4b-jrl-ckpt3 |
Qwen3-4B | sharded safetensors | Flax MsgPack |
qwen3-4b-mrme |
Qwen3-4B | safetensors | Flax MsgPack |
ministral-3-3b-jrl-ckpt4 |
Ministral-3-3B | safetensors | Flax MsgPack |
ministral-3-3b-mrme |
Ministral-3-3B | safetensors | Flax MsgPack |
qwen3-1.7b-long-dapo-ckpt5 |
Qwen3-1.7B | sharded safetensors | Flax MsgPack |
qwen3-1.7b-dapo |
Qwen3-1.7B | safetensors | framework-neutral safetensors |
The gpu/ subfolders are directly loadable with Transformers. The tpu/
subfolders provide JAX-oriented parameter exports. A TPU/JAX serialization
specifies how weights are loaded; it does not identify the hardware used to
train them.
Transformers inference
Install current inference dependencies:
pip install "transformers>=5.16.1" "mistral-common>=1.11.7" torch
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
repo_id = "SaifPunjwani/jrl-checkpoints"
subfolder = "qwen3-1.7b-mrme-ckpt1/gpu"
device = "cuda" if torch.cuda.is_available() else "cpu"
dtype = torch.bfloat16 if device == "cuda" else torch.float32
tokenizer = AutoTokenizer.from_pretrained(repo_id, subfolder=subfolder)
model = AutoModelForCausalLM.from_pretrained(
repo_id,
subfolder=subfolder,
dtype=dtype,
).to(device)
messages = [{"role": "user", "content": "Compute 2+2. Give only the number."}]
inputs = tokenizer.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
return_tensors="pt",
return_dict=True,
).to(device)
output = model.generate(**inputs, max_new_tokens=64, do_sample=False)
print(tokenizer.decode(
output[0, inputs["input_ids"].shape[1]:],
skip_special_tokens=True,
))
Change subfolder to any other gpu/ path in the table.
TPU/JAX loading
For any export containing tpu/flax_model.msgpack, restore the flat Hugging
Face-named parameter dictionary from that file:
from flax.serialization import msgpack_restore
from huggingface_hub import hf_hub_download
path = hf_hub_download(
"SaifPunjwani/jrl-checkpoints",
"qwen3-1.7b-jrl-ckpt2/tpu/flax_model.msgpack",
)
with open(path, "rb") as handle:
flat_hf_named_params = msgpack_restore(handle.read())
Checkpoint 1 and the DAPO reference use framework-neutral safetensors in their
tpu/ folders; each includes load_params.py for loading them as JAX arrays.
The MsgPack exports are flat parameter dictionaries rather than native
FlaxAutoModelForCausalLM directory layouts. For the standard Hugging Face
generation API, use the corresponding gpu/ subfolder.
End-to-end JAX/TPU inference
The repository now includes a self-contained, inference-only jax_runtime/
loader for all eight TPU exports. It restores either storage format, validates
and maps the Hugging Face-named tensors, shards parameters over all visible TPU
devices, and performs autoregressive decoding with a KV cache:
python -m pip install --upgrade "jax[tpu]"
python -m pip install -r jax_runtime/requirements.txt
python -m jax_runtime.smoke_generate \
--folder qwen3-1.7b-jrl-ckpt2 \
--max-new-tokens 16
Change --folder to any checkpoint listed above. The runtime downloads only
that checkpoint's tpu/ directory and applies its own tokenizer and chat
template. It is intended for loading verification and small evaluations rather
than high-throughput serving. See jax_runtime/README.md for local-path usage.
Evaluation protocol
The earlier release documentation specifies the following math-evaluation reference protocol. Exact reproduction must use the configuration attached to the evaluated checkpoint and generation pool; these defaults do not establish that every release entry was evaluated with identical settings.
- Use the checkpoint's own tokenizer and chat template; enable thinking mode for Qwen3 thinking evaluations.
- System prompt:
Please reason step by step, and put your final answer within \\boxed{}. - Sampling: temperature
0.6, top-p0.95, top-k20, min-p0. - Reference context cap:
40,960tokens. The earlier AIME24/AIME25 evaluations allowed up to38,912completion tokens; MATH500 and Minerva used up to32,768. A run using a different budget must be reported separately. - Retained samples per problem:
64for AIME24, AIME25, and Minerva;32for MATH500. - Seeds, stop conditions, engine version, and model-specific decoding settings must be taken from the individual evaluation record. In particular, do not assume that Ministral's model-card defaults equal the Qwen3 configuration.
Final answers are extracted from completions and checked against the reference answers with the evaluation's pinned math-answer extractor and verifier. Keep raw completions, correctness labels, finish reasons, sample IDs, checkpoint revision, and evaluation configuration together so the metrics can be recomputed. A short inference example above is a loading demonstration, not a benchmark or a long-form generation-quality audit.
avg@n and benchmark means
For P problems with exactly n retained samples each:
avg@n (%) = 100 * total_correct / (P * n)
With unequal sample counts, average each problem's accuracy rather than silently weighting problems by their number of completions.
The earlier release's four-benchmark mean is the arithmetic mean of AIME24, AIME25, MATH500, and Minerva avg@n. If AIME26 is included, label the result explicitly as a five-benchmark mean and use protocol-compatible evaluations of the same checkpoint. The two aggregate definitions are not interchangeable.
AIME24 pass@k and trajectory evidence
For a problem with c correct samples among n, estimate pass@k as:
1 - C(n - c, k) / C(n, k)
Use zero for C(n - c, k) when n - c < k, and require k <= n.
Average this quantity across problems and multiply by 100 for a percentage.
For n = 64, pass@64 is the fraction of problems with at least one correct
generation. Compute intermediate values at k = 1, 2, 4, 8, 16, 32, 64 from
that same sample pool.
The earlier release associated AIME24 pass@k evidence with checkpoints 1, 2,
and 5. The current repository tree does not include a
pass-at-k-trajectories/ directory; this README does not imply that those
archives are bundled here. DAPO-prompt trajectory libraries, when supplied
separately, are not substitutes for the AIME24 generations used to calculate
AIME24 pass@k.