Source code for cursus.processing.dataloaders.pipeline_dataloader
from collections.abc import Callable, Mapping
import torch
from torch.utils.data._utils.collate import default_collate
from torch.nn.utils.rnn import pad_sequence
[docs]
def build_collate_batch(
input_ids_key: str = "input_ids",
attention_mask_key: str = "attention_mask",
):
"""
Build a collate function for models with text modalities.
Handles:
- Single or multiple text modalities (e.g., chat, shiptrack) with tokenization keys
- Tabular features
- Labels
All text modalities use the same tokenizer output keys since they
share the same tokenizer.
Args:
input_ids_key: Key name for text input_ids (applies to all text modalities)
attention_mask_key: Key name for text attention_mask (applies to all text modalities)
Returns:
Collate function for DataLoader
"""
def collate_batch(batch):
if not isinstance(batch[0], dict):
raise TypeError("Batch must contain dictionaries.")
output = {}
def pad_nested(tensors):
"""Pad nested tensors to uniform dimensions."""
max_chunks = max(t.size(0) for t in tensors)
max_len = max(t.size(1) for t in tensors)
padded = []
for t in tensors:
pad_chunk = max_chunks - t.size(0)
pad_len = max_len - t.size(1)
padded.append(torch.nn.functional.pad(t, (0, pad_len, 0, pad_chunk)))
return torch.stack(padded)
def process_text_modality(batch, key, input_ids_key, attention_mask_key):
"""Process text modality by tokenizing and padding sequences."""
all_input_ids = []
all_attention_masks = []
for item in batch:
input_chunks = [
torch.tensor(chunk[input_ids_key], dtype=torch.long)
for chunk in item[key]
]
mask_chunks = [
torch.tensor(chunk[attention_mask_key], dtype=torch.long)
for chunk in item[key]
]
all_input_ids.append(pad_sequence(input_chunks, batch_first=True))
all_attention_masks.append(pad_sequence(mask_chunks, batch_first=True))
return pad_nested(all_input_ids), pad_nested(all_attention_masks)
for key in batch[0]:
# Check if this is a text field
if all(
isinstance(item[key], list)
and isinstance(item[key][0], dict)
and input_ids_key in item[key][0]
for item in batch
):
input_ids, attention_masks = process_text_modality(
batch, key, input_ids_key, attention_mask_key
)
output[key + "_" + input_ids_key] = input_ids
output[key + "_" + attention_mask_key] = attention_masks
# Handle tabular features and labels
else:
output[key] = [item[key] for item in batch]
return output
return collate_batch
# Alias for backward compatibility - trimodal naming
build_trimodal_collate_batch = build_collate_batch