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

granite-3.3-8b-lora-math-prm

Date: 2026-11-15Commit: 11bd6b8Signed: 2DC28CC7B26A283B ✓

Text generation model. Safetensors weights, 55.9 MB in all. Published by ibm-granite under Apache-2.0.

granite55.9MBgranite-3.3-8b-lora-math-prmsafetensorspermissive
FactsParamsnot statedSize55.9 MBFormatssafetensorsTasktext generationLicenseApache-2.0From sourcepermissive
$ fw get ibm-granite/granite-3.3-8b-lora-math-prm
# manifest sha256 69c356163b62… · 55.9 MB · 13 files
$ fw verify ./granite-3.3-8b-lora-math-prm ibm-granite/granite-3.3-8b-lora-math-prm
From sourceHosted (signed)ibm-granite/granite-3.3-8b-lora-math-prmLast check: 2026-11-15 04:31 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
55.9 MB
Weights
49.6 MB (safetensors)
Parameters
not stated
Formats
safetensors
Task
text generation
License
Apache-2.0 (permissive)
Files
13, 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 04:31 UTCpassed

Model card

From the publisher at commit 11bd6b8. Shown as plain text with links; images open at the publisher.

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

Model Summary

Granite 3.3 8B LoRA Math PRM is a LoRA adapter for 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 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.

  • Developers: Granite Alignment Team, IBM Research
  • Release Date: June 24th, 2025
  • License: Apache 2.0

Supported Languages

This adapter 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 LoRA Math PRM is a LoRA adapter for 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.

Evaluation Results

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

We show the performance of MATH-500 with inference scaling on a variety of LLM generators, including Granite-3.3-8B-Instruct, Phi-4, and Qwen-2.5-Math-7B-Instruct, and show strong gains over Majority Voting with both Best-of-N and Weighted Majority Voting using Granite-3.3-8B-LoRA-Math-PRM.

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 strong performance of Granite-3.3-8B-LoRA-Math-PRM over majority voting:

| | 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-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. ProcessBench

Image: PRM Performance on ProcessBench and PRMBench

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

c. PRMBench: Detailed Results

ModelOverallNR.NCL.Avg (simplicity)ES.SC.DC.CI.Avg (soundness)PS.DR.MS.Avg (sensitivity)
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.15256.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

For training the Math PRM adapter, we curate training 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 erros.

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-lora-math-prm"
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)
# # [0.9998785257339478, 0.9996663331985474, 0.9991942048072815, 0.9993413090705872, 0.9996351003646851, 0.519490122795105, 0.9416136145591736, 0.9942548871040344]

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-lora-math-prm"
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-LoRA-Math-PRM 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-LoRA-Math-PRM is an adapter for 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

13 files · 55.9 MBWeights 49.6 MB (safetensors). Sizes and sha256 from the signed manifest.
Hide all 13 files with their sha256
FileSizesha256
.gitattributes1.81 KB20de533eb8d71b1f8e31da1c346d34eab8f6ce78418bc305115f128be747ba13
README.md13.3 KB0edb184d6fa30a3e72008f947641b821ddd0dd547020eadef835b0c9b98dd00d
adapter_config.json865 Bd29b588e6e4ca282de33b17a86b2137be3b7d1e888c0daa37376432168eba5b1
adapter_model.safetensors49.6 MB01f931c4a8bc84c2a04ab3a0463337147f74086a2c71cd479914b4627d1e8800
added_tokens.json207 Bbb33d55934aa82d29cc62f3d19cdbc60f315763f6ccee21bdfd8b3bde2f33d3b
images/Benchmark_PRM_perf.png485 KBfe3a4dfb3f8a28b76b16ab110154b4af55facdcb7db9a226ae088692a372edfc
images/PRM_BON.png582 KB509931e746d99d24338cd9802be510b83d8edc2102e6ac9b13064fa503bc0ea9
images/PRM_BoN_rows.png557 KB05d407b6a171b8329cf1843684e6aa560541ac879e7040234c061a7bfa1f9d4e
merges.txt442 KB303127a244b0078878156c17229f36d11b7a3a3f8e47b7cfdbb304ff46be5030
special_tokens_map.json801 B21ce694081bb9ae1bd4bc64549e72e0799ebb74705e6b650e3585d85b71ebdc1
tokenizer.json3.48 MB91168e938f05796aa6dcca7e485e4b30ab52785320c7a6391ecef86e6c84681e
tokenizer_config.json9.93 KB779e67b59a86d0b8d2aeb98eaa6867b054b0270a0ea58db228162333c13610ea
vocab.json777 KB80ab859339a2525fdfbda14bc39df02dffb824aefdaf86426217bbb146d17e01
VersionsEach time the pinned upstream commit or file list changed in this repo. Newest first.
Upstream commitDateContents
11bd6b87de pinned now2026-11-15 04:31 UTC13 files · 55.9 MB

Use it

$ fw get ibm-granite/granite-3.3-8b-lora-math-prm
# manifest sha256 69c356163b62… · 55.9 MB · 13 files
$ fw verify ./granite-3.3-8b-lora-math-prm ibm-granite/granite-3.3-8b-lora-math-prm
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-lora-math-prm.json --dir ./granite-3.3-8b-lora-math-prm $ python3 fw.py verify ./granite-3.3-8b-lora-math-prm ./ibm-granite__granite-3.3-8b-lora-math-prm.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-lora-math-prm --revision 11bd6b87de1fa9b29af38f42b7f515a43477b93a --local-dir ./granite-3.3-8b-lora-math-prm

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
0edb184d6fa30a3e72008f947641b821ddd0dd547020eadef835b0c9b98dd00d
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-lora-math-prmDate: 2026-11-15Commit: 11bd6b8Signed: 2DC28CC7B26A283B ✓
Upstream
ibm-granite/granite-3.3-8b-lora-math-prm
Pinned commit
11bd6b87de1fa9b29af38f42b7f515a43477b93a
Manifest
granite-3.3-8b-lora-math-prm.json · .minisig
Manifest sha256
69c356163b6207c9b6cf112155a0b68fc947f5261864fe4ef9a155187a6c74db
Signature
minisign, Ed25519, key 2DC28CC7B26A283B
Created
2026-11-15 04:31 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-lora-math-prm.json $ curl -O https://freeweights.allternit.com/manifests/ibm-granite/granite-3.3-8b-lora-math-prm.json.minisig $ minisign -Vm granite-3.3-8b-lora-math-prm.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-lora-math-prm
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-lora-math-prm.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