alt.freeweights.granite / granite-4.0-3b-vision
From: ibm-granite <huggingface.co/ibm-granite>Newsgroups: alt.freeweights.graniteSubject:

granite-4.0-3b-vision

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

Image text to text model with 4B parameters. Safetensors weights, 9.46 GB in all. Published by ibm-granite under Apache-2.0.

4B params9.46GBgranite-4.0-3b-visionsafetensorspermissive
FactsParams4BSize9.46 GBFormatssafetensorsTaskimage text to textLicenseApache-2.0From sourcepermissive
$ fw get ibm-granite/granite-4.0-3b-vision
# manifest sha256 3f3b721b296a… · 9.46 GB · 31 files
$ fw verify ./granite-4.0-3b-vision ibm-granite/granite-4.0-3b-vision
From sourceHosted (signed)ibm-granite/granite-4.0-3b-visionLast check: 2026-11-15 03:24 UTC

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

Works with

Overview

Size
9.46 GB
Weights
9.45 GB (safetensors)
Parameters
4B
Formats
safetensors
Task
image text to text
License
Apache-2.0 (permissive)
Files
31, each with a sha256
Publisher
ibm-granite
Added
2026-11-15
Section
alt.freeweights.granite
Lineage

Original release from the publisher.

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:24 UTCpassed

Model card

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

Granite 4.0 3B Vision#

Model Summary: Granite-4.0-3B-Vision is a vision-language model (VLM) designed for enterprise-grade document data extraction. It focuses on specialized, complex extraction tasks that ultracompact models often struggle with:

  • Chart extraction: Converting charts into structured, machine-readable formats (Chart2CSV, Chart2Summary, and Chart2Code)
  • Table extraction: Accurately extracting tables with complex layouts from document images to JSON, HTML, or OTSL
  • Semantic Key-Value Pair (KVP) extraction: Extracting values based on key names and descriptions across diverse document layouts

The model is delivered as a LoRA adapter on top of Granite 4.0 Micro, with a 3.5B base LLM and 0.5B LoRA adapters. This enables a single deployment to support both multimodal document understanding and text-only workloads — the base model handles text-only requests without loading the adapter. See Model Architecture for details.

The methodology and data (ChartNet) used for this model are described in the paper ChartNet: A Million-Scale, High-Quality Multimodal Dataset for Robust Chart Understanding.

While our focus is on specialized document extraction tasks, the current model preserves and extends the capabilities of Granite-Vision-3.3 2B, ensuring that existing users can adopt it seamlessly with no changes to their workflow. It continues to support vision‑language tasks such as producing detailed natural‑language descriptions from images (image‑to‑text). The model can be used standalone and integrates seamlessly with Docling to enhance document processing pipelines with deep visual understanding capabilities.

Supported Tasks#

The model supports specialized extraction tasks, each activated by a simple task tag in the user message. The chat template automatically expands tags into the full prompt — no need to write verbose instructions.

TagTaskOutput
<chart2csv>Chart to CSVCSV table with headers and numeric values
<chart2code>Chart to Python codePython code that recreates the chart
<chart2summary>Chart to summaryNatural-language description of the chart
<tables_json>Table extraction (JSON)Structured JSON with dimensions and cells
<tables_html>Table extraction (HTML)HTML <table> markup
<tables_otsl>Table extraction (OTSL)OTSL markup with cell/merge tags
KVP (see prompt instructions below)Schema based Key-Value pairs extractionJSON with nested dictionaries and arrays

Model Performance#

Benchmark Results#

We compare Granite-4.0-3B-Vision against leading small VLMs across multiple extraction benchmarks.

Chart Extraction#

We evalute chart extraction using the human-verified test-set from ChartNet. The models are evaluated using LLM-as-a-judge (GPT4o) comparing the model prediction against the ground-truth. We report the average scores 0-100 on chart2csv and chart2summary extraction tasks.

Image: image

Table Extraction#

To benchmark table extraction, we construct a unified evaluation suite spanning multiple datasets and settings to assess end-to-end table extraction capabilities of vision-language models:

  1. TableVQA-Extract — Converts the original visual table QA benchmark into a cropped table extraction task.
  2. OmniDocBench-tables — A document parsing benchmark over diverse PDF types with detailed annotations for layout, text, formulas, and tables. We use the subset of pages that contain one or more tables to evaluate table extraction in full-page settings.
  3. PubTablesV2 — A large-scale table extraction benchmark evaluated in both cropped-table and full-page document settings.

To unify evaluation, we replace each dataset’s original annotations (e.g., Q&A pairs) with a single instruction: extract the table(s) from the image in HTML format, using the corresponding HTML as ground truth. For full-page inputs, only tabular elements are considered; when multiple tables appear, they are aggregated into a Python list.

We report results using TEDS (Tree-Edit Distance-based Similarity), which measures structural and content similarity between predicted and ground-truth HTML tables.

Results are presented separately for cropped-table and full-page settings to highlight performance across controlled and realistic document scenarios.

Image: image

Image: image

Key-Value Pair (KVP) Extraction#

We evaluate on VAREX, a benchmark for multimodal structured extraction from documents. Granite-4.0-3B-Vision achieves 85.5% exact-match accuracy (zero-shot), ranking 3rd among 2–4B parameter models as of March 2026 (view results here).

Setup#

Tested with python=3.11

pip install torch==2.10.0 --index-url https://download.pytorch.org/whl/cu128
pip install transformers==4.57.6 peft==0.18.1 tokenizers==0.22.2 pillow==12.1.1

Usage with Transformers#

import re
from io import StringIO

import pandas as pd
import torch
from transformers import AutoProcessor, AutoModelForImageTextToText
from PIL import Image
from huggingface_hub import hf_hub_download

model_id = "ibm-granite/granite-4.0-3b-vision"
device = "cuda" if torch.cuda.is_available() else "cpu"

processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForImageTextToText.from_pretrained(
    model_id,
    trust_remote_code=True,
    dtype=torch.bfloat16,
    device_map=device
).eval()

# Optional: merge LoRA adapters into base weights for faster inference.
# Prefer to skip when using text-only tasks, as the LoRA adapters are vision-specific.
model.merge_lora_adapters()

def run_inference(model, processor, images, prompts):
    """Run batched inference on image+prompt pairs (one image per prompt)."""
    conversations = [
        [{"role": "user", "content": [
            {"type": "image"},
            {"type": "text", "text": prompt},
        ]}]
        for prompt in prompts
    ]
    texts = [
        processor.apply_chat_template(conv, tokenize=False, add_generation_prompt=True)
        for conv in conversations
    ]
    inputs = processor(
        text=texts, images=images, return_tensors="pt", padding=True, do_pad=True
    ).to(model.device)
    outputs = model.generate(
        **inputs,
        max_new_tokens=4096, 
        use_cache=True
    )
    results = []
    for i in range(len(prompts)):
        gen = outputs[i, inputs["input_ids"].shape[1]:]
        results.append(processor.decode(gen, skip_special_tokens=True))
    return results


def display_table(text):
    """Pretty-print CSV (possibly wrapped in ```csv```) or HTML table content via pandas."""
    m = re.search(r"```csv\s*
(.*?)```", text, re.DOTALL)
    if m:
        df = pd.read_csv(StringIO(m.group(1)))
        print(df.to_string(index=False))
    elif "<table" in text.lower():
        df = pd.read_html(StringIO(text))[0]
        print(df.to_string(index=False))
    else:
        print(text)
Chart and Table Tasks#

Your can pass tags and the chat template handles the rest:

chart_path = hf_hub_download(repo_id=model_id, filename="chart.jpg")
table_path = hf_hub_download(repo_id=model_id, filename="table.png")
chart_img = Image.open(chart_path).convert("RGB")
table_img = Image.open(table_path).convert("RGB")

# Batched chart tasks
chart_prompts = ["<chart2csv>", "<chart2summary>", "<chart2code>"]
chart_results = run_inference(model, processor, [chart_img] * len(chart_prompts), chart_prompts)
for prompt, result in zip(chart_prompts, chart_results):
    print(f"{prompt}:")
    display_table(result)
    print()

# Batched table tasks
table_prompts = ["<tables_html>", "<tables_otsl>"]
table_results = run_inference(model, processor, [table_img] * len(table_prompts), table_prompts)
for prompt, result in zip(table_prompts, table_results):
    print(f"{prompt}:")
    display_table(result)
    print()
Key-Value Pair Extraction (KVP)#

For KVP extraction use the VAREX prompt format. Provide a JSON Schema describing the fields to extract and the model will return a JSON object with the extracted values.

import json

invoice_path = hf_hub_download(repo_id=model_id, filename="invoice.png")
invoice_img = Image.open(invoice_path).convert("RGB")
schema = {
    "type": "object",
    "properties": {
        "invoice_date": {"type": "string", "description": "The date the invoice was issued"},
        "order_number": {"type": "string", "description": "The unique identifier for the order"},
        "seller_tax_id": {"type": "string", "description": "The tax identification number of the seller"},
    }
}

prompt = f"""Extract structured data from this document.
Return a JSON object matching this schema:

{json.dumps(schema, indent=2)}

Return null for fields you cannot find.
Return ONLY valid JSON.
Return an instance of the JSON with extracted values, not the schema itself."""

result = run_inference(model, processor, [invoice_img], [prompt])[0]
print(result)

Usage with vLLM#

This model includes a custom vLLM implementation (granite4_vision.py) and a server launcher (start_granite4_vision_server.py) that register the model using vLLM's out-of-tree model integration—no need to build vLLM from source.

pip install vllm
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH

Download granite4_vision.py and start_granite4_vision_server.py from this repo.

hf download ibm-granite/granite-4.0-3b-vision granite4_vision.py . 
hf download ibm-granite/granite-4.0-3b-vision start_granite4_vision_server.py .

Then, from the directory containing the downloaded files, you can start the server.

Serving Modes with vLLM#

Full merge (adapter merged at load time)#

All LoRA deltas are merged into the base weights at load time. This gives the fastest inference, as every request uses the merged model.

python start_granite4_vision_server.py \
    --model ibm-granite/granite-4.0-3b-vision \
    --trust_remote_code --host 0.0.0.0 --port 8000 \
    --hf-overrides '{"adapter_path": "ibm-granite/granite-4.0-3b-vision"}'
Native LoRA runtime#

vLLM applies the LM LoRA dynamically per request. Text-only prompts use the pure base model, while image prompts apply the LoRA adapter at inference time.

python start_granite4_vision_server.py \
    --model ibm-granite/granite-4.0-3b-vision \
    --trust_remote_code --host 0.0.0.0 --port 8000 \
    --enable-lora --max-lora-rank 256 \
    --default-mm-loras '{"image": "ibm-granite/granite-4.0-3b-vision"}'
Client example#

Query the running server using the OpenAI-compatible API:

import base64
from openai import OpenAI
from huggingface_hub import hf_hub_download
from PIL import Image

model_id = "ibm-granite/granite-4.0-3b-vision"
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")

def run_inference(client, model_id, image_path, tag):
    with open(image_path, "rb") as f:
        image_b64 = base64.b64encode(f.read()).decode("utf-8")
    messages = [
        {"role": "user", "content": [
            {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{image_b64}"}},
            {"type": "text", "text": tag},
        ]}
    ]
    response = client.chat.completions.create(
        model=model_id, messages=messages, max_tokens=4096, temperature=0,
    )
    return response.choices[0].message.content

chart_path = hf_hub_download(repo_id=model_id, filename="chart.jpg")
table_path = hf_hub_download(repo_id=model_id, filename="table.png")

# Chart tasks
for tag in ["<chart2csv>", "<chart2summary>", "<chart2code>"]:
    result = run_inference(client, model_id, chart_path, tag)
    print(f"{tag}:
{result}
")

# Table tasks
for tag in ["<tables_json>", "<tables_html>", "<tables_otsl>"]:
    result = run_inference(client, model_id, table_path, tag)
    print(f"{tag}:
{result}
")

Training Data#

The model was fine-tuned on a curated mixture of extraction-focused datasets spanning chart understanding, complex table parsing, and document KVP extraction, supplemented by the general-purpose Granite Vision instruction-following dataset for broad visual understanding.

Chart understanding data was created through a novel code‑guided augmentation methodology that produces diverse, semantically aligned chart samples containing rendering code, chart images, underlying data CSVs, and natural‑language summaries. Using this pipeline, we are also releasing ChartNet, a comprehensive million‑scale multimodal dataset enriched with real‑world, human‑annotated, safety, and grounding subsets. The dataset and its methodology are detailed in the paper ChartNet: A Million-Scale, High-Quality Multimodal Dataset for Robust Chart Understanding.

Model Architecture#

  1. SigLIP2 Vision encoder: google/siglip2-so400m-patch16-384. Input images are tiled into 384×384 patches (with a base downscaled view always included), and each tile is encoded independently.
  2. Window Q-Former projectors: Visual features are compressed 4× using windowed Q-Former projectors: each 4×4 patch window is reduced to 2×2 tokens via cross-attention, where the queries are initialized from a downsampled version of the window features. This reduces the visual token count fed to the LLM.
  3. Feature injection: A variant of Deepstack where visual features are additively injected into the LLM hidden states at multiple layers through two complementary mechanisms:
    • LayerDeepstack: Features from 4 vision encoder depths are each projected and injected into a different LLM layer. The Q-Former queries are initialized from downsampled features. The mapping is reversed — the deepest (most semantic) vision features feed the earliest LLM layers, providing strong semantic grounding from the start.
    • SpatialDeepstack: The deepest vision features at full resolution are split into 4 complementary spatial groups. Each group's Q-Former queries are initialized from the corresponding spatial subset, and injected at a separate later LLM layer, providing fine-grained spatial detail. In total, 8 vision-to-LLM injection points distribute visual information across the network for stronger visual grounding.
  4. Language model: Granite 4.0 Micro (3B) with LoRA (rank 256) across all self-attention projections and MLP layers.

Supported input: English instructions and images (PNG, JPEG).

Infrastructure#

Granite 4.0 Vision was trained on IBM's Blue Vela supercomputing cluster, outfitted with NVIDIA H100 GPUs. The training was done on 32 GPUs for approximately 200 hours.

Ethical Considerations and Limitations#

The use of vision-language models involves certain risks that should be considered before deployment:

  • Task scope: The model is specifically designed for structured extraction tasks and may not generalize well to open-ended vision-language tasks.
  • Hallucination: As with all generative models, outputs should be validated before use in automated pipelines, particularly for high-stakes document processing.
  • Language: The model is trained on English instructions only and may produce degraded results for documents in other languages.

To enhance safety in enterprise deployments, we recommend using Granite 4.0 Vision alongside Granite Guardian, a model designed to detect and flag risks in inputs and outputs across key dimensions outlined in the IBM AI Risk Atlas.

Resources#

Citation#

@misc{granite-4.0-3b-vision,
  title={Granite 4.0 Vision},
  author={IBM Granite Vision Team},
  year={2026},
  url={https://huggingface.co/ibm-granite/granite-4.0-3b-vision}
}

@article{kondic2026chartnet,
  title={ChartNet: A Million-Scale, High-Quality Multimodal Dataset for Robust Chart Understanding},
  author={Kondic, Jovana and Li, Pengyuan and Joshi, Dhiraj and Sanchez, Isaac and Wiesel, Ben and Abedin, Shafiq and Alfassy, Amit and Schwartz, Eli and Caraballo, Daniel and Cinar, Yagmur Gizem and Scheidegger, Florian and Ross, Steven I. and Weidele, Daniel Karl I. and Hua, Hang and Arutyunova, Ekaterina and Herzig, Roei and He, Zexue and Wang, Zihan and Yu, Xinyue and Zhao, Yunfei and Jiang, Sicong and Liu, Minghao and Lin, Qunshu and Staar, Peter and Lastras, Luis and Oliva, Aude and Feris, Rogerio},
  journal={arXiv preprint arXiv:2603.27064},
  year={2026}
}

Files

31 files · 9.46 GBWeights 9.45 GB (safetensors). Sizes and sha256 from the signed manifest.
Show all 31 files with their sha256
FileSizesha256
.gitattributes2.07 KB16de389ce11789c90db6a17fd0917be2d83a2a7619be483f4aa1e29157a621a8
README.md18.1 KB90b590ed6660c2ce97002e8fa79ee6db70e01f67f1bfc131b31fec1239fa4d49
adapter_config.json5.98 KBe670780a520be46db1d1e9eccd9f2903cf67cd0e0edc2c41723fcbef3fa4e55a
adapter_model.safetensors944 MBd0b6ab5a7f207b0bc95cf644e60dae9cdb471ab1f40f527b29ff3cf4bbf6f880
added_tokens.json24 B6f7a34b9226191b2848560487570d026242767098f9c341dc37ec093914ef0c5
chart.jpg60.3 KB6836305cfa8bb8322e926328e81f1a8fd39a34a7aa578bf69a42cd4b0943f54a
charts.jpg267 KB74c1f2bad1743a2efebb8df40b0c53a4876b427c85275994f57f8b4fd9b38a75
chat_template.jinja12.1 KB29825b7fcc5ce44c7fd3f9977d8f2cc1b9ccef713ea2fe4046ab0d57b72c84a1
config.json4.61 KBdd93a18be8b1a31363e7a3c1aa416d290484ab08262c08a7378e285003bae7c4
configuration.py1.85 KBef3e97557d38b92c47f976588a84af854bd4b8318676a0983802398ac72f8bfc
downsampling.py6.05 KB556c955476d5b84d557c1cf6ede7bed322e0420f3df86c8baf8e0083a9d8d058
generation_config.json147 B4251329c35bf98284052856a4fd3cc8eaa232bd602889e5894a5b5d783e52427
granite4_vision.py38.0 KB1e7a8ea84f06cf994da505f5938aae8b83291d3ec1dda8d2d79668ddfe77e544
invoice.png613 KB778371cee9bc0d3c4c061756ed2304c3620f209f0cb7b56e63ea8e37f7f6e48b
merges.txt917 KBb6fe424e334903f7fb84d3a106d9730455f4744b9fe3c21ee136d97a00e72502
model-00001-of-00002.safetensors4.99 GB492424bf4ec51f448295bc0c1404d7bf4846aa511d8cfc992c98c829442e0c08
model-00002-of-00002.safetensors3.52 GBf876b16184cbe2eba40a7a5f4953a183c30c5c9473acfa26687a89dfe195a09d
model.safetensors.index.json112 KB295e24ef20d324a9a280d2bc212a4573b3186f1904fc1bee06ee73ee480aab8d
modeling.py27.2 KBda74401563673715243ce7499423b28fdf287b34b3ef703bc85e5a9f22be1298
preprocessor_config.json1.56 KB91736aff355de02740a81aa43a80a32f121f25a717b86f674eec9b10426b1630
processing.py2.35 KB4512b42a868c469aea9869457b55432e13223f5eb22f293a0ca61f598356aa9d
processor_config.json286 Bca047fab63e2b51c6322af69c4a840f63432867cfcfc7360e4846e4b1783e6b0
special_tokens_map.json631 B889bb925893df551f69dbcc0a82902689d0c06ad43473289819b4949e8c3a535
start_granite4_vision_server.py422 B97d8e01ecd6b798f569c0396d336319a4d6fd1fbbe02a80190dc2ab2cfe01427
table.png290 KBd4498e5af26dee68c6d75bd9c8e3d6d437a7e1c44a1b5cf00b986cc3688df004
tables-cropped.jpg172 KB63172b0e28508a307d06de5f4c58dd93ebe2b9f1e572ca7a6e5af962d9520800
tables-full-page.jpg159 KB6ce88a892c16a5843ac435775c041011f74d7e60df0b7212614f6c7dacdd201d
tables.jpg230 KB9597cc0e43edf5ec1065ef660c59abdfa16c559ef4a6482ffbb5ab8df297f1ca
tokenizer.json7.15 MBab67c81a103c0ade199853ccffee38f88374190663662a81cc31393633c42f38
tokenizer_config.json18.0 KB1b28981cbbe69c040fe48cd7f1a0a770b937a710a9610f4da359ca2f43a78556
vocab.json2.01 MB3efa1cc7301ba3f2c0cb36f4c9ec1ece4e10eaadc60d29462013269769c161fb
VersionsEach time the pinned upstream commit or file list changed in this repo. Newest first.
Upstream commitDateContents
bf108f3696 pinned now2026-11-15 03:24 UTC31 files · 9.46 GB

Use it

$ fw get ibm-granite/granite-4.0-3b-vision
# manifest sha256 3f3b721b296a… · 9.46 GB · 31 files
$ fw verify ./granite-4.0-3b-vision ibm-granite/granite-4.0-3b-vision
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-4.0-3b-vision.json --dir ./granite-4.0-3b-vision $ python3 fw.py verify ./granite-4.0-3b-vision ./ibm-granite__granite-4.0-3b-vision.json
hfThe Hugging Face CLI with one setting. Same repo id.
$ HF_ENDPOINT=https://freeweights.allternit.com hf download ibm-granite/granite-4.0-3b-vision --revision bf108f36960fb4df79bf035e506c592f4ee3c2d3 --local-dir ./granite-4.0-3b-vision
transformersLoad the weights in Python.
import os os.environ["HF_ENDPOINT"] = "https://freeweights.allternit.com" from transformers import AutoModelForImageTextToText, AutoProcessor processor = AutoProcessor.from_pretrained("ibm-granite/granite-4.0-3b-vision", revision="bf108f36960fb4df79bf035e506c592f4ee3c2d3") model = AutoModelForImageTextToText.from_pretrained("ibm-granite/granite-4.0-3b-vision", revision="bf108f36960fb4df79bf035e506c592f4ee3c2d3", device_map="auto")
vLLMServe an OpenAI-compatible API.
$ HF_ENDPOINT=https://freeweights.allternit.com vllm serve ibm-granite/granite-4.0-3b-vision --revision bf108f36960fb4df79bf035e506c592f4ee3c2d3

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
90b590ed6660c2ce97002e8fa79ee6db70e01f67f1bfc131b31fec1239fa4d49
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-4.0-3b-visionDate: 2026-11-15Commit: bf108f3Signed: 2DC28CC7B26A283B ✓
Upstream
ibm-granite/granite-4.0-3b-vision
Pinned commit
bf108f36960fb4df79bf035e506c592f4ee3c2d3
Manifest
granite-4.0-3b-vision.json · .minisig
Manifest sha256
3f3b721b296a0a8db1ec6c34c61d5948e759a6496f4085ed77de17be6bc69c83
Signature
minisign, Ed25519, key 2DC28CC7B26A283B
Created
2026-11-15 03:24 UTC
Generator
freeweights-manifest/0.1.0
Takedowns
None.

How to verify

$ curl -O https://freeweights.allternit.com/manifests/ibm-granite/granite-4.0-3b-vision.json $ curl -O https://freeweights.allternit.com/manifests/ibm-granite/granite-4.0-3b-vision.json.minisig $ minisign -Vm granite-4.0-3b-vision.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

No related models in this catalog.Nothing here lists this model as its parent, and it names no parent.
Get it
Download
$ HF_ENDPOINT=https://freeweights.allternit.com hf download ibm-granite/granite-4.0-3b-vision
Open in Freeweights Studio

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

Signed manifest
minisign, key 2DC28CC7B26A283B. granite-4.0-3b-vision.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