kempnerforge.data.vlm_dataset¶
VLM dataset and collator (Joint-Decoder).
HuggingFaceVLMDataset wraps a HuggingFace image-text dataset and
produces the VLMSample contract:
pixel_values:(3, H, W)float tensor, resized toimage_sizeand normalized with the provided mean/std;(V, 3, H, W)whentile_gridcuts the image intoVviews (tile_image).input_ids:(T,)int64 tensor, right-padded tomax_text_len.labels:(T,)int64 next-token targets (labels[i]= input tokeni+1), right-padded tomax_text_len; pad, trailing, and prompt-predicting positions are-100.text_len: 0-d int64, how many leading positions ofinput_idsare real tokens (the rest is padding).
VLMCollator stacks a list of samples into a batch. All batches are
padded to the same fixed max_text_len regardless of batch content so
different ranks see identical tensor shapes (no NCCL desync under
FSDP2). The collator also emits image_positions: (B,) zeros; this
slot is reserved for a future multi-image extension and is unused by
the Joint-Decoder wrapper today.
PackedVLMCollator packs several documents into each row instead
(pack_vlm_samples): a document is its image’s placeholder slots followed
by its real text, rows are filled first-fit to seq_len, and the batch
carries doc_ids, per-document position_ids and the image placement the
Joint-Decoder wrapper uses to write each image’s tokens over its slots.
The HF datasets and transformers packages are imported lazily
so this module is safe to import without them (e.g. in unit tests that
don’t exercise the dataset path).
Functions
|
|
|
Reject a prompt that leaves no room in |
|
Pack frames into a fixed |
|
One |
|
Pack image-text samples into rows of |
|
Resize, convert to (3, H, W) float tensor, and normalize. |
|
Resolve a pad id, falling back to EOS then 0. |
|
Cut an image into views: the whole image, then an |
Classes
Map-style HF image-text dataset for Joint-Decoder training. |
|
Pack the documents of a batch into rows of |
|
Stack VLM samples into a fixed-length batch. |
- kempnerforge.data.vlm_dataset.pil_to_tensor(img, image_size, mean, std)[source]¶
Resize, convert to (3, H, W) float tensor, and normalize.
Accepts a PIL
Image. Converts to RGB if needed so grayscale / RGBA inputs do not drop into the encoder with the wrong channel count.Public so that out-of-tree callers (e.g. the VLM evaluation adapter) reuse the exact training-time preprocessing as the single source of truth, rather than re-implementing resize/normalize.
- kempnerforge.data.vlm_dataset.tile_image(img, image_size, mean, std, *, tile_grid, tile_global=True)[source]¶
Cut an image into views: the whole image, then an
n × nraster of crops.The whole image, resized to
image_sizesquare exactly aspil_to_tensordoes, comes first whentile_global. The crops are cut from the image resized totile_grid * image_sizesquare, so each isimage_sizepx and together they cover that canvas exactly; they follow in raster order (left to right, then top to bottom). Returns(views, 3, image_size, image_size), every view normalized likepil_to_tensor.Public for the same reason as
pil_to_tensor: an evaluation adapter must tile a request’s image exactly as training did.
- kempnerforge.data.vlm_dataset.image_to_views(img, image_size, mean, std, *, tile_grid=0, tile_global=True)[source]¶
One
(3, H, W)view, or the(V, 3, H, W)views oftile_imagewhen tiling.
- kempnerforge.data.vlm_dataset.frames_to_clip_tensor(frames, *, max_frames, frame_size, image_mean=(0.5, 0.5, 0.5), image_std=(0.5, 0.5, 0.5), dtype=torch.float32)[source]¶
Pack frames into a fixed
(max_frames, 3, H, W)zero-padded clip + mask.Fills the first
min(len(frames), max_frames)slots with per-framepil_to_tensoroutput (temporal order preserved) and leaves the remaining slots zero; also returns a(max_frames,)boolframe_mask(Truefor real frames). A single image is the length-1 case (a 1-frame clip).- Parameters:
frames (list[Any]) – Ordered list of PIL
Imageobjects (e.g. decoded clip frames).max_frames (int) – Fixed per-clip frame budget (the output’s frame dimension).
frame_size (int) – Square pixel size each frame is resized to.
image_std (tuple[float, float, float]) – Per-channel normalization (SigLIP defaults).
dtype (torch.dtype) – Output
pixel_valuesdtype.image_std
- Returns:
(pixel_values, frame_mask)of shapes(max_frames, 3, frame_size, frame_size)and(max_frames,).- Return type:
- kempnerforge.data.vlm_dataset.resolve_pad_id(tokenizer)[source]¶
Resolve a pad id, falling back to EOS then 0.
Mirrors what the dataset uses to right-pad
input_ids; tokenizers without a dedicated pad token fall back to the EOS id, and finally to0if neither is set.
- kempnerforge.data.vlm_dataset.check_prompt_fits(tokenizer, prompt, max_text_len)[source]¶
Reject a prompt that leaves no room in
max_text_lenfor a caption token.- Parameters:
- Raises:
ValueError –
max_text_lenis below the prompt’s token count plus one caption token, plus one more when the tokenizer defines an EOS.- Return type:
None
- class kempnerforge.data.vlm_dataset.HuggingFaceVLMDataset[source]¶
Bases:
DatasetMap-style HF image-text dataset for Joint-Decoder training.
- Parameters:
dataset_name – HF dataset name (e.g.
"sayakpaul/coco-30-val-2014") or a local directory written bydatasets.save_to_disk.split – Dataset split.
image_field – Column name for the PIL image.
text_field – Column name for the caption / target text.
tokenizer_path – HF tokenizer id or local path.
max_text_len – Fixed-length pad target; passed to the collator.
prompt_field – Optional column name for a prompt that should NOT be supervised (e.g. the instruction in an instruction-tuned dataset). Positions predicting prompt tokens are
-100; the last prompt token still predicts the first caption token. A row whose prompt leaves no room inmax_text_lenfor a caption token has every label masked, and building the dataset raisesValueErrorwhen no row leaves that room. ANonevalue means the row has no prompt. Building the dataset raisesTypeErrorunless the column holds strings (dtypestringorlarge_string, ornullwhen no row has a prompt).image_size – Target square image size. Default 224.
image_std (image_mean /) – Normalization stats. Defaults match SigLIP’s
(0.5, 0.5, 0.5).dataset_config – HF dataset config name, if required.
tile_grid –
0keeps one view per image;ncuts each image into ann × ngrid ofimage_sizecrops (tile_image), sopixel_valuesis(views, 3, H, W).tile_global – Whether a tiled image’s views start with the whole image.
- class kempnerforge.data.vlm_dataset.VLMCollator[source]¶
Bases:
objectStack VLM samples into a fixed-length batch.
- Output keys:
pixel_values:(B, 3, H, W), or(B, V, 3, H, W)when every sample carriesVviews of its image.input_ids:(B, max_text_len)int64.labels:(B, max_text_len)int64 with-100on pad.image_positions:(B,)long tensor. Reserved slot for multi-image extensions; currently all zeros (single image per example placed at sequence position 0).
Padding is always to
max_text_len, never batch-max, so ranks always see identical tensor shapes under FSDP2.
- kempnerforge.data.vlm_dataset.pack_vlm_samples(samples, *, seq_len, tokens_per_image, pad_id)[source]¶
Pack image-text samples into rows of
seq_len, each document’s image before its text.A sample is one document:
pixel_values(3, H, W)or(V, 3, H, W)(Vviews, each an encoder input),input_idsandlabels(T,)whose firsttext_lenpositions are real (0packs the image alone with nothing to supervise, as the unpacked path’s all-masked row does). Its footprint isV * tokens_per_imageplaceholder slots followed bytext_lentokens. The last packed label is forced to-100as a guard for samples built outsideHuggingFaceVLMDataset(which already leaves it so): the token after a trimmedtext_lenis not in the row. Documents go first-fit into rows in order: into the first open row with room, else a new row. A row’s tail is padding that forms its own document.- Returns:
pixel_values(N, 3, H, W), every image or view across the batch in document order;input_ids,labelsanddoc_ids(rows, seq_len), withpad_idand-100on the image slots and the padding tail, anddoc_idsnumbering a row’s documents from0with the tail one past the last;position_ids(rows, seq_len), each document’s positions (and the tail’s) restarting at0;image_rowsandimage_starts(N,), the row and first slot of each image;image_tokens, 0-d, thetokens_per_imagethe slots were laid out with;text_rowsandtext_positions(M,), the row and position of every real text token in document order, where the wrapper runs the LM head.- Raises:
ValueError –
samplesis empty, a sample lackstext_len, a document has no image or a footprint overseq_len, orseq_lenortokens_per_imageis not positive.- Parameters:
- Return type:
- class kempnerforge.data.vlm_dataset.PackedVLMCollator[source]¶
Bases:
objectPack the documents of a batch into rows of
seq_len(pack_vlm_samples).The number of rows follows the documents’ footprints, so it varies from batch to batch;
train.batch_sizeis the number of documents per micro-batch, not the number of rows.