alt.freeweights.granite / granite-3.3-8b-math-prm-v2
From: ibm-granite <huggingface.co/ibm-granite>Newsgroups: alt.freeweights.graniteSubject:

granite-3.3-8b-math-prm-v2

Date: 2026-11-15Commit: 301abddSigned: 2DC28CC7B26A283B ✓

Text generation model with 8.2B parameters. Safetensors weights, 16.3 GB in all. Published by ibm-granite under Apache-2.0.

8.2B params16.3GBgranite-3.3-8b-math-prm-v2safetensorspermissive
FactsParams8.2BSize16.3 GBFormatssafetensorsTasktext generationLicenseApache-2.0From sourcepermissive
$ fw get ibm-granite/granite-3.3-8b-math-prm-v2
# manifest sha256 39f9c4293a87… · 16.3 GB · 19 files
$ fw verify ./granite-3.3-8b-math-prm-v2 ibm-granite/granite-3.3-8b-math-prm-v2
From sourceHosted (signed)ibm-granite/granite-3.3-8b-math-prm-v2Last check: 2026-11-15 03:29 UTC

Get help: custom fine-tune or private deploy. We review your setup before we quote.

Fine-tune of granite-3.3-8b-instruct.

Works with

Overview

Size
16.3 GB
Weights
16.3 GB (safetensors)
Parameters
8.2B
Formats
safetensors
Task
text generation
License
Apache-2.0 (permissive)
Files
19, each with a sha256
Publisher
ibm-granite
Added
2026-11-15
Section
alt.freeweights.granite
Lineage

Original release from the publisher.

Base model: ibm-granite/granite-3.3-8b-instruct

Where these bytes come from
Publisher at the pinned commit→You

Sources are tried in order. A file counts only when its size and sha256 match the manifest. Sources are checked when you ask for them, not on a timer.

Sources
BadgeHostLast checkResult
From sourcehuggingface.co2026-11-15 03:29 UTCpassed

Model card

From the publisher at commit 301abdd. Shown as plain text with links; images open at the publisher.

Granite-3.3-8B-Math-PRM-v2#

Model Summary

Granite 3.3 8B Math PRM v2 is a finetuned version of the 8-billion parameter language model, Granite-3.3-8B-Instruct, built for use a generative process reward model (PRM) for process supervision in mathematical reasoning. Crucially, this model has only been trained on curated data from sources with permissive licenses, and we release this model under a Apache 2.0 license. This model displays state-of-the-art performance in a best-of-N set up for math tasks.

This model can be used to asses the correctness of each step of a mathematical reasoning process, and shows strong performance on Best-of-N evaluations for a variety of generators on Math-500, as well as strong error identification performance in both ProcessBench and PRMBench, with state-of-the-art performance in its size class. Although this model was trained for mathematical reasoning tasks, it also shows strong inference scaling performance on Code benchmarks, such as HunmanEval and LCBv5.

  • Developers: Granite Alignment Team, IBM Research
  • Release Date: Jan 1st, 2026
  • License: Apache 2.0

Supported Languages

This model has specifically been finetuned for English, however the base model supports English, German, Spanish, French, Japanese, Portuguese, Arabic, Czech, Italian, Korean, Dutch, and Chinese.

Intended Use

Granite 3.3 8B Math PRM v2 is finetuned version of Granite-3.3-8B-Instruct, which gives the language model the ability of process supervision on mathematical reasoning steps by assessing the correctness of each step of a reasoning chain. At inference, the model takes a question and a response which can be broken down into generated steps, and for each step it determines whether the reasoning chain so far is correct (indicated by generating a single token, Y) or incorrect (indicated by generating N). The probability of generating Y can be treated as a numeric reward score in applications such as Best-of-N evaluation.

Before obtaining a response, the model expects the user generated prompt "Is this response correct so far (Y/N)?", which should be added at the end of every step of the reasoning chain.

This model is an update to granite-3.3-8b-lora-math-prm.

Evaluation Results

a. Best-of-N Evaluation on Math-500

We show the performance of MATH-500 with inference scaling on generations from granite-4.0-h-small and granite-4.0-h-tiny, and show strong gains over Majority Voting with both Best-of-N and Weighted Majority Voting using Granite-3.3-8B-Math-PRM-v2.

Image: PRM Performance on Math-500

We also compare the Best-of-N performance on Math-500 available PRMs on Qwen-2.5-Math-7B-Instruct generations, and show the superior performance of Granite-3.3-8B-Math-PRM-v2 over majority voting and best-of-N using similarly sized PRMs:

| | 2| 4| 8| 16| 32| 64| 128| 256|

|- | - |- |- |- |- |- |- |- |

| Majority Voting |75.8 | 81.6 | 84.6 | 85.2 | 85.4| 85.6 | 86.0 | 85.6 |

| Granite-3.3-8B-Math-PRM-v2 | 81.6 | 84.6 | 86.6| 88.0 |88.2 |89.2 |89.0| 89.6 |

| Granite-3.3-8B-LoRA-Math-PRM| 81.6 | 84.2 | 84.8 | 86.2 | 86.8 | 87.2 | 88.0 | 87.2 |

| Qwen2.5-Math-PRM-7B| 82.0 | 84.8 | 86.6 | 87.0 | 88.2 | 89.0 | 88.8 | 89.0|

| MathShepherd-Mistral-7B PRM 7B| 80.8 | 83.0 | 83.8 | 84.8 | 86.2 | 85.2 | 86.0 | 85.2 |

| RLHFLow Llama3.1-8B-PRM-Deepseek-Data| 80.6 | 82.4 | 83.6 | 85.2 | 85.8 | 85.8 | 85.0 | 84.6 |

b. Best-of-N Evaluation on HumanEval and LCBv5

We show the performance on two code tasks, HumanEval (Python) and LCBv5 with inference scaling on generations from granite-4.0-h-small. While this model is finetuned on Math data, Granite-3.3-8B-Math-PRM-v2 demonstrates strong gains over Majority Voting with both Best-of-N and Weighted Majority Voting.

Image: PRM Performance on Math-500

c. ProcessBench

Image: PRM Performance on ProcessBench and PRMBench

As shown above, Granite-3.3-8B-Math-PRM-v2 shows strong performance (top-2) on both ProcessBench and PRMBench compared to other models of the same parameter class, indicating a strong ability at error detection for reasoning tasks.

d. PRMBench: Detailed Results

ModelOverallNR.NCL.Avg (simplicity)ES.SC.DC.CI.Avg (soundness)PS.DR.MS.Avg (sensitivity)
Granite-3.3-8B-Math-PRM-v265.152.263.457.869.765.864.470.867.761.067.198.275.4
Granite-3.3-8B-LoRA-Math-PRM64.550.961.556.269.166.764.770.567.859.965.998.174.7
Qwen2.5-Math-PRM-7B65.549.055.152.171.867.366.378.571.057.669.199.775.5
Skywork-PRM-7B65.156.462.859.669.467.167.769.968.560.965.893.273.7
Skywork-PRM-1.5B61.152.056.454.264.864.963.366.564.957.563.391.170.7
ReasonEval-34B60.554.848.151.566.460.357.867.563.057.764.397.273.1
ReasonEval-7B60.161.050.155.662.165.961.566.063.955.758.099.571.1
RLHFlow-PRM-Mistral-8B54.446.147.346.756.655.154.463.857.551.556.297.968.5
RLHFlow-PRM-Deepseek-8B54.246.448.947.655.755.053.266.257.549.055.499.868.1
MathShepherd-Mistral-7B47.044.050.347.149.444.541.347.745.747.248.686.160.7

Training Data The model is first finetuned on math and code data, such as OpenMathReasoning, OpenThoughts3, Codeforces, Code Contests, OpenCodeReasoning, PrimeIntellect, and TACO on the standard language modeling objective. Then, we conduct RLVR on NuminaMath, PrimeIntellect, TACO, OpenCodeInstruct and Skywork-OR1-RL Data. Finally, we train the model to predict the correctness of math problems, curating ttraining data from a diverse set of model responses to prompts from Math-specific datasets, specifically, MetaMathQA, MathInstruct and NuminaMath. We leverage a diverse set of LLMs from the Granite Language Model Family, Phi-4, and Mixtral 8x22B to generate outputs, and use the Automatic Process Supervision method as described in Luo et. al, 2024 for detecting steps with errors.

Usage

Sample use for obtaining PRM scores for a given response using Huggingface Transformers:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from typing import List

def prepare_input(query: str, steps: List[str], tokenizer: AutoTokenizer, correct_token: str, generation_prompt: str):
    messages = []
    
    for s_idx, step in enumerate(steps):
        if s_idx == 0:
            # append query and first step
            message = {'role': 'user', 'content':  query + " " + step + " " + generation_prompt}
        else:
            message = {'role': 'user', 'content':  step + " " + generation_prompt}
        
        messages.append(message)
        messages.append({'role': 'assistant', 'content': correct_token})
    
    input_message = tokenizer.apply_chat_template(messages, add_generation_prompt = False, tokenize = False)

    return input_message

def get_step_ids(input_ids, tokenizer, correct_token, correct_token_id):
    # get assistant turn indices
    asst_text = "<|start_of_role|>assistant<|end_of_role|>" + correct_token + "<|end_of_text|>"
    asst_toks = tokenizer(asst_text, add_special_tokens = False, return_tensors = "pt")['input_ids'][0]
    asst_toks_before_correct_token = asst_toks[:torch.where(asst_toks == correct_token_id)[0].item()].tolist()

    input_ids = input_ids[0]
    # find batch index for assistant turn "Y", not just the correct_token_id
    correct_token_indices = torch.where(input_ids == correct_token_id)[0].tolist()
    prm_indices = []
    for t_idx in correct_token_indices:
        if input_ids[t_idx - len(asst_toks_before_correct_token) :t_idx].tolist() == asst_toks_before_correct_token:
            prm_indices.append(t_idx-1) # the logits for token i predict the token i+1: so, we need to look at the PREVIOUS token logits
    
    assert len(prm_indices)>0
    return prm_indices

model_name_or_path = "ibm-granite/granite-3.3-8b-math-prm-v2"
model = AutoModelForCausalLM.from_pretrained(model_name_or_path, device_map = "auto")
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)

correct_token = "Y"
correct_token_id = tokenizer.encode(correct_token, add_special_tokens=False)[0]
generation_prompt = "Is this response correct so far (Y/N)?"


data = {
   "query": "For breakfast, Anna bought a bagel for $x and a glass of orange juice for $0.85. At lunch, Anna spent $4.65 on a sandwich and $1.15 on a carton of milk. How much more money did Anna spend on lunch than on breakfast? If we know the answer to the above question is 4, what is the value of unknown variable x?",
   "response":[
        "At breakfast, Anna spent x dollars on a bagel and $0.85 on a glass of orange juice. The total cost of breakfast is x + $0.85.",
        "At lunch, Anna spent $4.65 on a sandwich and $1.15 on a carton of milk. The total cost of lunch is $4.65 + $1.15 = $5.80.",
        "To find out how much more money Anna spent on lunch than on breakfast, we subtract the cost of breakfast from the cost of lunch: $5.80 - (x + $0.85).",
        "We are given that the difference is $4, so we can write: $5.80 - (x + $0.85) = $4.",
        "Simplifying the left side, we get: $5.80 - x - $0.85 = $4.",
        "Adding -$0.85 to both sides, we get: $5.80 -x = $3.15.",
        "Subtracting $5.80 from both sides, we get: -x = -$2.65.",
        "Dividing both sides by -1, we get: x = $2.65."
   ]
}


formatted_data = prepare_input(query=data['query'], steps=data['response'], tokenizer=tokenizer, correct_token=correct_token, generation_prompt=generation_prompt)
input_ids = tokenizer.encode(formatted_data, return_tensors="pt").to(model.device)

with torch.no_grad():
    logits = model(input_ids=input_ids).logits

# get step positions
prm_indices = get_step_ids(input_ids, tokenizer, correct_token, correct_token_id)

#  get corresponding rewards: convert logits to probabilities and get the probability of the correct token id as reward
softmax = torch.nn.Softmax(dim=-1)
step_rewards = []
for prm_idx in prm_indices:
    step_rewards.append(softmax(logits[0, prm_idx, :])[correct_token_id].item())

print(step_rewards)
# # [1.0, 1.0, 1.0, 0.99609375,0.9921875, 0.0849609375, 0.408203125, 0.8515625]

For use of the PRM as a verbalizer of correctness for a specific step:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer


model_name_or_path = "ibm-granite/granite-3.3-8b-math-prm-v2"
model = AutoModelForCausalLM.from_pretrained(model_name_or_path, device_map = "auto")
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
generation_prompt = "Is this response correct so far (Y/N)?"


data = {
   "query": "For breakfast, Anna bought a bagel for $x and a glass of orange juice for $0.85. At lunch, Anna spent $4.65 on a sandwich and $1.15 on a carton of milk. How much more money did Anna spend on lunch than on breakfast? If we know the answer to the above question is 4, what is the value of unknown variable x?",
   "partial_response":
        "At breakfast, Anna spent x dollars on a bagel and $0.85 on a glass of orange juice. The total cost of breakfast is x + $0.85. At lunch, Anna spent $4.65 on a sandwich and $1.15 on a carton of milk. The total cost of lunch is $4.65 + $1.15 = $5.80. To find out how much more money Anna spent on lunch than on breakfast, we subtract the cost of breakfast from the cost of lunch: $5.80 - (x + $0.85).",
}

# format the prompts
formatted_prompt = tokenizer.apply_chat_template([{'role':'user', 'content': data['query'] + " " + data['partial_response'] + " " + generation_prompt}], add_generation_prompt=True, tokenize=False)
inputs = tokenizer(formatted_prompt, return_tensors="pt")

# generate output
with torch.no_grad():
    response = model.generate(inputs["input_ids"].to(model.device), attention_mask=inputs["attention_mask"].to(model.device), max_new_tokens=2)

output_text = tokenizer.decode(response[0])
print(output_text)
# # <|start_of_role|>assistant<|end_of_role|>Y<|end_of_text|>

Infrastructure

We train Granite-3.3-8B-Math-PRM-v2 using IBM's super computing cluster, Blue Vela, which is outfitted with NVIDIA H100 GPUs. This cluster provides a scalable and efficient infrastructure for training our models over multiple GPUs.

Ethical Considerations and Limitations

Granite-3.3-8B-Math-PRM-v2 is finetuned from Granite-3.3-8B-Instruct. Since it inherits its foundation from the instruct model, all ethical considerations and limitations applicable to Granite-3.3-8B-Instruct remain relevant.

Files

19 files · 16.3 GBWeights 16.3 GB (safetensors). Sizes and sha256 from the signed manifest.
Hide all 19 files with their sha256
FileSizesha256
.gitattributes1.70 KB06c7d298fa2e8b61ed7894cde18f2a5ccb56419ba162f1cefbaa737ee03b3cc9
README.md15.1 KB4e388e6c424db0c6dbe68b0cf8b4ae604ea89a27a63346bb1c6403b430e25170
added_tokens.json207 Bbb33d55934aa82d29cc62f3d19cdbc60f315763f6ccee21bdfd8b3bde2f33d3b
chat_template.jinja3.70 KBc82c247886905cd10096a6b18581c23bb6503b81b6e18e16648fc98b05dd5a2a
config.json784 B70632f3d733c9b120bd741644f41cbc2b0c1210b25fef7877e4ebb5f01629061
generation_config.json154 B212b94ec015ada9c2c7975bb9f1997118d2a606198009ec096cef7db1c1ccd2e
images/PRMv2_Benchmarks.jpg546 KB3df1964031a7dca30232660c361cc3201f9ab071943043739fee160f8df0e89d
images/PRMv2_BoN.jpg430 KBfcc850b7bea2c8252ea867f6d178ab469a09bb7b326196ea506dd05ce977c18d
images/PRMv2_BoN_code.jpg410 KB488e5077e7c1fef179b718d6d5238e757b2e728a54f53737407b33a1b5a536c6
merges.txt442 KB303127a244b0078878156c17229f36d11b7a3a3f8e47b7cfdbb304ff46be5030
model-00001-of-00004.safetensors4.97 GBdd589fba2e43761ab07ed923fe55184358aa660ced23477b800870e1cf80317a
model-00002-of-00004.safetensors4.99 GB64f5d554a0b7a5cad0343b1e0222710e1d79b428fbdadf50149b31b4138acdd0
model-00003-of-00004.safetensors4.97 GBa15a2ae2f71cfa2938e1b82950e876f49c6d27ffe5b15d2cec1953256c4d9683
model-00004-of-00004.safetensors1.41 GB933907dca41f6dc7d5ad02ec3f71bab5f277a3d9abb9d043914193940c31e847
model.safetensors.index.json29.9 KB060762e9569362998875b3f5ea963c1313054b7c606be2ab36826912167a4b13
special_tokens_map.json796 B3a3dd63a680f42d8396878bb7d4e5c0af8c6f170c4c2dac6986c68b090aa80d9
tokenizer.json3.48 MB91168e938f05796aa6dcca7e485e4b30ab52785320c7a6391ecef86e6c84681e
tokenizer_config.json5.26 KB368532da7edb8d2aae3b53ee1c4ddcb4f6232cd1a3c89b16b1a2bf193325e264
vocab.json777 KB80ab859339a2525fdfbda14bc39df02dffb824aefdaf86426217bbb146d17e01
VersionsEach time the pinned upstream commit or file list changed in this repo. Newest first.
Upstream commitDateContents
301abdda78 pinned now2026-11-15 03:29 UTC19 files · 16.3 GB

Use it

$ fw get ibm-granite/granite-3.3-8b-math-prm-v2
# manifest sha256 39f9c4293a87… · 16.3 GB · 19 files
$ fw verify ./granite-3.3-8b-math-prm-v2 ibm-granite/granite-3.3-8b-math-prm-v2
fw.pyChecks the signature and every sha256, tries each source in order, resumes.
$ python3 fw.py get https://freeweights.allternit.com/manifests/ibm-granite/granite-3.3-8b-math-prm-v2.json --dir ./granite-3.3-8b-math-prm-v2 $ python3 fw.py verify ./granite-3.3-8b-math-prm-v2 ./ibm-granite__granite-3.3-8b-math-prm-v2.json
hfThe Hugging Face CLI with one setting. Same repo id.
$ HF_ENDPOINT=https://freeweights.allternit.com hf download ibm-granite/granite-3.3-8b-math-prm-v2 --revision 301abdda78cbea2bac9a04653eedf7ab9b3a3959 --local-dir ./granite-3.3-8b-math-prm-v2
transformersLoad the weights in Python.
import os os.environ["HF_ENDPOINT"] = "https://freeweights.allternit.com" from transformers import AutoModelForCausalLM, AutoTokenizer tok = AutoTokenizer.from_pretrained("ibm-granite/granite-3.3-8b-math-prm-v2", revision="301abdda78cbea2bac9a04653eedf7ab9b3a3959") model = AutoModelForCausalLM.from_pretrained("ibm-granite/granite-3.3-8b-math-prm-v2", revision="301abdda78cbea2bac9a04653eedf7ab9b3a3959", device_map="auto")
vLLMServe an OpenAI-compatible API.
$ HF_ENDPOINT=https://freeweights.allternit.com vllm serve ibm-granite/granite-3.3-8b-math-prm-v2 --revision 301abdda78cbea2bac9a04653eedf7ab9b3a3959

License

Name
Apache License 2.0
Id
Apache-2.0
Class
Permissive
Redistribution
yes
Listing
Hosted (signed)
Decided
License as declared by the publisher. No person read it. 2026-11-15
Text in
README.md
Text sha256
4e388e6c424db0c6dbe68b0cf8b4ae604ea89a27a63346bb1c6403b430e25170
Terms gate
No extra terms beyond the license.

Read the license text

Licenses are checked against the license table. A custom license passes only after a person reads it.

Provenance

From: ibm-granite <huggingface.co/ibm-granite>Newsgroups: alt.freeweights.graniteSubject: granite-3.3-8b-math-prm-v2Date: 2026-11-15Commit: 301abddSigned: 2DC28CC7B26A283B ✓
Upstream
ibm-granite/granite-3.3-8b-math-prm-v2
Pinned commit
301abdda78cbea2bac9a04653eedf7ab9b3a3959
Manifest
granite-3.3-8b-math-prm-v2.json · .minisig
Manifest sha256
39f9c4293a873754b998e8ef3636a1a1944dc4b2fe9686a1e590c0a8858cdde4
Signature
minisign, Ed25519, key 2DC28CC7B26A283B
Created
2026-11-15 03:29 UTC
Generator
freeweights-manifest/0.1.0
Takedowns
None.

How to verify

$ curl -O https://freeweights.allternit.com/manifests/ibm-granite/granite-3.3-8b-math-prm-v2.json $ curl -O https://freeweights.allternit.com/manifests/ibm-granite/granite-3.3-8b-math-prm-v2.json.minisig $ minisign -Vm granite-3.3-8b-math-prm-v2.json -P RWQ7KGqyx4zCLXtUFOqvfv8L3g+8fpKJ1FsuxPyOYMF+4KufbUxKq1Oq $ shasum -a 256 <file> # compare with the Files tab

A manifest whose signature fails must be rejected. A file whose size or sha256 does not match must be discarded. Verify a download

Model tree

Parent

ibm-granite/granite-3.3-8b-instruct · this model is a finetune of it

No model in the catalog names this one as its parent.

Get it
Download
$ HF_ENDPOINT=https://freeweights.allternit.com hf download ibm-granite/granite-3.3-8b-math-prm-v2
Open in Freeweights Studio

Pull, verify and run it in the Allternit app on Desktop, web or phone.

Signed manifest
minisign, key 2DC28CC7B26A283B. granite-3.3-8b-math-prm-v2.json. Provenance. Takedown history: none.
From: ibm-granite <huggingface.co/ibm-granite>Subject: GneissWeb.7B_ablation_model_on_350B_FineWeb.Edu.seed1
From: ibm-granite <huggingface.co/ibm-granite>Subject: GneissWeb.7B_ablation_model_on_350B_FineWeb.Edu.seed2
From: ibm-granite <huggingface.co/ibm-granite>Subject: GneissWeb.7B_ablation_model_on_350B_FineWeb.Edu.seed3
From: ibm-granite <huggingface.co/ibm-granite>Subject: GneissWeb.7B_ablation_model_on_350B_FineWeb.seed1
From: ibm-granite <huggingface.co/ibm-granite>Subject: GneissWeb.7B_ablation_model_on_350B_FineWeb.seed2
From: ibm-granite <huggingface.co/ibm-granite>Subject: GneissWeb.7B_ablation_model_on_350B_FineWeb.seed3