This is a tiny version of ibm-granite/granite-vision-4.1-4b created for testing and development.

Intended Use

A small, fast stand-in for the granite4_vision architecture, useful for:

  • Inference / CI testing where a real 4B checkpoint is too large to download or run
  • Quantization & compression pipeline smoke tests (llm-compressor, compressed-tensors)
  • Offloaded / distributed loading tests (see below)
  • Exercising the vLLM Granite4VisionForConditionalGeneration model path, including the SigLIP vision tower + deepstack projectors

Weights are random (then briefly fine-tuned on a toy corpus), so generations are not meaningful — this model is for plumbing, not output quality.

Model Details

  • Base Model: ibm-granite/granite-vision-4.1-4b
  • Architecture: granite4_vision (Granite4VisionForConditionalGeneration)
  • Total Parameters: 0.162B
  • Activated Parameters: 0.162B

Configuration Changes

The following parameters were reduced from the original model:

Parameter Original Tiny
text_config.num_hidden_layers 40 4
text_config.hidden_size 2560 1024
text_config.intermediate_size 8192 2048
text_config.num_attention_heads 40 8
text_config.num_key_value_heads 8 2
vision_config.num_hidden_layers 27 4
vision_config.hidden_size 1152 384
vision_config.intermediate_size 4304 768
vision_config.num_attention_heads 16 4
spatial_target_layers [12, 15, 18, 21] [0, 1, 2, 3]
deepstack_layer_map [(-19,9),(-13,6),(-7,3),(-1,0)] [(-4,3),(-3,2),(-2,1),(-1,0)]

The full 100,352-token vocabulary is retained.

Checkpoint Structure

Single safetensors file (model.safetensors). Key naming matches the original checkpoint format (model.language_model.*, model.vision_tower.vision_model.* (SigLIP), model.layerwise_projectors.*, model.spatial_projectors.*, model.image_newline). Module-path structure was verified equal to the base checkpoint's safetensors header.

Usage

from transformers import AutoModelForImageTextToText, AutoProcessor

model = AutoModelForImageTextToText.from_pretrained(
    "soyrsoyr/granite-vision-4.1-0.2B-tiny", device_map="auto"
)
processor = AutoProcessor.from_pretrained("soyrsoyr/granite-vision-4.1-0.2B-tiny")

input_ids = processor.tokenizer("According to all known laws", return_tensors="pt").input_ids.to(model.device)
output = model.generate(input_ids, max_new_tokens=20)
print(processor.tokenizer.decode(output[0]))

Offloaded / distributed loading (compressed-tensors)

This is a multimodal ...ForConditionalGeneration model, so AutoModelForCausalLM does not resolve it. Pass AutoModelForImageTextToText to load_offloaded_model — the class you pass must match the class you call, since that is where device_map="auto_offload" support is injected:

from transformers import AutoModelForImageTextToText
from compressed_tensors.offload import load_offloaded_model
from compressed_tensors.distributed import init_dist

init_dist()
with load_offloaded_model(model_class=AutoModelForImageTextToText):
    model = AutoModelForImageTextToText.from_pretrained(
        "soyrsoyr/granite-vision-4.1-0.2B-tiny",
        device_map="auto_offload",                 # weights on CPU/disk, GPU for activations
    )

Creation Process

This model was created using the llm-compressor create-tiny-model claude skill.

  • Config inspected via inspect_config.py
  • Tiny model created via a modified save_tiny_model.py, adapted for the multimodal class (AutoModelForImageTextToText.from_config); the text tower and SigLIP vision tower were shrunk and any all-zero / non-finite / extreme param was fixed after init_weights()
  • Fine-tuned on the copypasta dataset; reached training perplexity 1.36 (target: ≤3.0) at lr=5e-4 (CPU, Adafactor)
  • Checkpoint structure validated against the original HuggingFace safetensors header (module-path match)
  • Inference validated via validate_tiny_model.py

Notes

  • Layer-index-sensitive fields remapped. spatial_target_layers and deepstack_layer_map reference specific vision/text layer indices; they were remapped to the reduced depths so they stay valid at 4 vision / 4 text layers.
  • Vision tower key nesting. Current transformers flattens SiglipVisionModel on save (model.vision_tower.*), but the published checkpoint and vLLM's loader expect the nested model.vision_tower.vision_model.* layout. A conversion step restores the nesting so the checkpoint loads cleanly in both transformers (via SiglipVisionModel.base_model_prefix) and vLLM.
  • tie_word_embeddings=True: lm_head shares embed_tokens and is not stored as a separate tensor.

Validation output: Success: 1.3236008882522583 <= 10.0

Downloads last month
16
Safetensors
Model size
0.2B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for soyrsoyr/granite-vision-4.1-0.2B-tiny

Finetuned
(2)
this model

Collection including soyrsoyr/granite-vision-4.1-0.2B-tiny