Subchapter 109.1
references/collators-and-pitfalls.mdMarkdown6 KBView on GitHub
Last verified: 2026-07-13
Full detail backing the summary in SKILL.md.
Base models are never named here as
recommendations — the collator table below names
architecture families only because the processor
contract (which tensors a collator must produce)
is a technical property of that family, not a
model choice. For which actual model to fine-tune
at a given size class, see
‘s
.
finetuning-method-selectionreferences/model-catalog.mdCollators are not interchangeable across VLM architecture families — each family’s processor expects a different tensor contract, and using the wrong collator produces either a hard error or (worse) silently wrong tensors that train without learning. Each row below describes an architecture family’s processor contract, not a model recommendation.
| Architecture family | Tensor contract | Notes |
|---|---|---|
| Qwen-VL family | pixel_values + image_grid_thw | The grid tensor encodes the patch layout per image; a collator that drops it or mismatches its shape against pixel_values silently corrupts the vision-token layout. |
| InternVL family | Variable-length pixel-value lists | Images can each contribute a different number of tiles/patches; the collator must pad or batch these variable-length lists per example rather than assuming a fixed tensor shape. |
| Gemma 3 family | token_type_ids for loss masking | Loss masking between image and text spans is driven by token_type_ids, not just the usual assistant-turn attention mask — a collator built for a different family’s masking convention silently masks the wrong spans. |
Two practical consequences:
VLM SFT datasets are typically a messages list per example, with an explicit image placeholder token in the content that the processor later expands to the architecture’s actual vision-token span:
example = {
"messages": [
{
"role": "user",
"content": [
{"type": "image"},
{"type": "text", "text": "What does this chart show?"},
],
},
{
"role": "assistant",
"content": [
{"type": "text", "text": "Quarterly revenue trending upward."},
],
},
],
"images": [<PIL.Image or path>],
}The count of {"type": "image"} placeholder
entries in messages must equal the count of
entries in images, in order, for every single
example — this 1:1 mapping is exactly the first
silent killer from SKILL.md. A dataset-level
assert on this count, run over every example
before training starts, catches the mismatch at
data-prep time instead of after a wasted training
run.
Run this checklist against one collated batch before launching a full training run. All three checks are cheap (seconds, one batch) relative to the cost of discovering a silent failure after hours of training:
input_ids with the tokenizer, and read it.
Confirm the image placeholder tokens appear
where expected and the surrounding text matches
the source example — this catches template or
collator bugs that reshuffle content.min_pixels/max_pixels budget (the second
silent killer from SKILL.md). A count that
doesn’t match the expected budget means the
resolution budget isn’t being applied the way
it’s configured.token_type_ids for Gemma-3-family collators)
and confirm masked (-100) positions cover the
system/user turns and image tokens, with only
assistant-turn text contributing to the loss. A
loss mask that leaks onto image tokens or user
turns trains the model to predict input it
should only be conditioning on.If any of the three checks fails, fix the collator or dataset before starting the full run — none of these are the kind of thing a training curve reveals on its own.
The consensus recipe in SKILL.md freezes the
projector. When adapting to a base model or
dataset far enough from the projector’s original
alignment that the frozen-projector recipe
underperforms, a two-stage LLaVA-style alignment
recipe is the advanced fallback:
SKILL.md
(LoRA on the LLM only, all-linear, r=8–16,
α=16–32) using the actual task dataset.This two-stage recipe is an escalation path, not a default — reach for it only when the single-stage frozen-projector recipe measurably underperforms, since it roughly doubles the number of training runs required. Most VLM SFT tasks in this plugin’s scope stay on the single-stage consensus recipe.