| |
| |
| |
| |
| |
|
|
| import numpy as np |
| import torch |
|
|
| IGNORE_INDEX = -100 |
|
|
|
|
| def pad_data_collator(features, pad_id=0): |
|
|
| first = features[0] |
| batch = {} |
|
|
| batch_lens = [feat['input_ids'].shape for feat in features] |
| max_item_length = max(batch_lens)[0] |
| for idx in range(len(features)): |
| feat = features[idx] |
| temp_input_ids = torch.LongTensor([pad_id] * max_item_length) |
| temp_input_ids[:feat['input_ids'].shape[0]] = feat['input_ids'] |
| feat['input_ids'] = temp_input_ids |
| temp_labels = torch.LongTensor([IGNORE_INDEX] * max_item_length) |
| temp_labels[:feat['labels'].shape[0]] = feat['labels'] |
| feat['labels'] = temp_labels |
| feat['attention_mask'] = feat['input_ids'].ne(pad_id) |
|
|
| |
| |
| |
| if 'label' in first and first['label'] is not None: |
| label = first['label'].item() if isinstance(first['label'], torch.Tensor) else first['label'] |
| dtype = torch.long if isinstance(label, int) else torch.float |
| batch['labels'] = torch.tensor([f['label'] for f in features], dtype=dtype) |
| elif 'label_ids' in first and first['label_ids'] is not None: |
| if isinstance(first['label_ids'], torch.Tensor): |
| batch['labels'] = torch.stack([f['label_ids'] for f in features]) |
| else: |
| dtype = torch.long if isinstance(first['label_ids'][0], int) else torch.float |
| batch['labels'] = torch.tensor([f['label_ids'] for f in features], dtype=dtype) |
|
|
| |
| |
| for k, v in first.items(): |
| if k not in ('label', 'label_ids') and v is not None and not isinstance(v, str): |
| if isinstance(v, torch.Tensor): |
| batch[k] = torch.stack([f[k] for f in features]) |
| elif isinstance(v, np.ndarray): |
| batch[k] = torch.tensor(np.stack([f[k] for f in features])) |
| else: |
| batch[k] = torch.tensor([f[k] for f in features]) |
| return batch |
|
|
|
|
| def concat_pad_data_collator(features, max_item_length=None, pad_id=0): |
|
|
| first = features[0] |
| batch = {} |
|
|
| batch_lens = [feat['input_ids'].shape for feat in features] |
| max_item_length = max_item_length or max(batch_lens)[0] |
|
|
| |
| for idx in range(len(features)): |
| feat = features[idx] |
| temp_input_ids = torch.LongTensor([pad_id] * max_item_length) |
| temp_input_ids[:feat['input_ids'].shape[0]] = feat['input_ids'] |
| feat['input_ids'] = temp_input_ids |
| |
| temp_labels = torch.LongTensor([IGNORE_INDEX] * max_item_length) |
| temp_labels[:feat['labels'].shape[0]] = feat['labels'] |
| feat['labels'] = temp_labels |
|
|
| feat['attention_mask'] = feat['input_ids'].ne(pad_id) |
|
|
| if 'position_ids' in feat: |
| temp_position_ids = torch.LongTensor([pad_id] * max_item_length) |
| temp_position_ids[:feat['position_ids'].shape[0]] = feat['position_ids'] |
| feat['position_ids'] = temp_position_ids |
|
|
| if 'loss_weight' in feat: |
| temp_loss_weight = torch.FloatTensor([pad_id] * max_item_length) |
| temp_loss_weight[:feat['loss_weight'].shape[0]] = feat['loss_weight'] |
| feat['loss_weight'] = temp_loss_weight |
|
|
| |
| |
| |
| if 'label' in first and first['label'] is not None: |
| label = first['label'].item() if isinstance(first['label'], torch.Tensor) else first['label'] |
| dtype = torch.long if isinstance(label, int) else torch.float |
| batch['labels'] = torch.tensor([f['label'] for f in features], dtype=dtype) |
| elif 'label_ids' in first and first['label_ids'] is not None: |
| if isinstance(first['label_ids'], torch.Tensor): |
| batch['labels'] = torch.stack([f['label_ids'] for f in features]) |
| else: |
| dtype = torch.long if isinstance(first['label_ids'][0], int) else torch.float |
| batch['labels'] = torch.tensor([f['label_ids'] for f in features], dtype=dtype) |
|
|
| |
| |
| for k, v in first.items(): |
| if k not in ('label', 'label_ids', 'pixel_values', 'image_flags') and \ |
| v is not None and not isinstance(v, str): |
| if isinstance(v, torch.Tensor): |
| batch[k] = torch.stack([f[k] for f in features]) |
| elif isinstance(v, np.ndarray): |
| batch[k] = torch.tensor(np.stack([f[k] for f in features])) |
| else: |
| batch[k] = torch.tensor([f[k] for f in features]) |
| if k in ('pixel_values', 'image_flags'): |
| if isinstance(v, torch.Tensor): |
| batch[k] = torch.concat([f[k] for f in features]) |
| elif isinstance(v, np.ndarray): |
| batch[k] = torch.concat(np.stack([f[k] for f in features])) |
| else: |
| batch[k] = torch.concat([f[k] for f in features]) |
| return batch |
|
|
|
|
| def dpo_concat_pad_data_collator(features, pad_id=0): |
|
|
| first = features[0] |
| batch = {} |
|
|
| for prefix in ['chosen_', 'rejected_']: |
| batch_lens = [feat[f'{prefix}input_ids'].shape[0] for feat in features] |
| max_item_length = max(batch_lens) |
| for idx in range(len(features)): |
| feat = features[idx] |
| temp_input_ids = torch.LongTensor([pad_id] * max_item_length) |
| temp_input_ids[:feat[f'{prefix}input_ids'].shape[0]] = feat[f'{prefix}input_ids'] |
| feat[f'{prefix}input_ids'] = temp_input_ids |
| temp_labels = torch.LongTensor([IGNORE_INDEX] * max_item_length) |
| temp_labels[:feat[f'{prefix}labels'].shape[0]] = feat[f'{prefix}labels'] |
| feat[f'{prefix}labels'] = temp_labels |
| feat[f'{prefix}attention_mask'] = feat[f'{prefix}input_ids'].ne(pad_id) |
|
|
| |
| |
| for k, v in first.items(): |
| if k not in ('pixel_values', 'image_flags') and \ |
| v is not None and not isinstance(v, str): |
| if isinstance(v, torch.Tensor): |
| batch[k] = torch.stack([f[k] for f in features]) |
| elif isinstance(v, np.ndarray): |
| batch[k] = torch.tensor(np.stack([f[k] for f in features])) |
| else: |
| batch[k] = torch.tensor([f[k] for f in features]) |
| if k in ('pixel_values', 'image_flags'): |
| if isinstance(v, torch.Tensor): |
| batch[k] = torch.concat([f[k] for f in features]) |
| elif isinstance(v, np.ndarray): |
| batch[k] = torch.concat(np.stack([f[k] for f in features])) |
| else: |
| batch[k] = torch.concat([f[k] for f in features]) |
| return batch |
|
|
|
|
| def count_leading_negatives(labels): |
| for i, value in enumerate(labels): |
| if value != IGNORE_INDEX: |
| return i |
| return len(labels) |
|
|
|
|
|
|
| def concat_pad_data_collator_pure_text(features, max_item_length=None, pad_id=0): |
|
|
| first = features[0] |
| batch = {} |
|
|
| batch_lens = [feat['input_ids'].shape for feat in features] |
| max_item_length = max_item_length or max(batch_lens)[0] |
| |
|
|
| for idx in range(len(features)): |
| feat = features[idx] |
| temp_input_ids = torch.LongTensor([pad_id] * max_item_length) |
| temp_input_ids[:feat['input_ids'].shape[0]] = feat['input_ids'] |
| feat['input_ids'] = temp_input_ids |
| |
| temp_labels = torch.LongTensor([IGNORE_INDEX] * max_item_length) |
| temp_labels[:feat['labels'].shape[0]] = feat['labels'] |
| feat['labels'] = temp_labels |
|
|
| temp_attention_mask = torch.LongTensor([False] * max_item_length) |
| temp_attention_mask[:feat['attention_mask'].shape[0]] = feat['attention_mask'] |
| feat['attention_mask'] = temp_attention_mask |
|
|
| if 'position_ids' in feat: |
| temp_position_ids = torch.LongTensor([1] * max_item_length) |
| temp_position_ids[:feat['position_ids'].shape[0]] = feat['position_ids'] |
| feat['position_ids'] = temp_position_ids |
|
|
| |
| |
| |
| |
|
|
| |
| |
| for k, v in first.items(): |
| if isinstance(v, torch.Tensor): |
| batch[k] = torch.stack([f[k] for f in features]) |
| elif isinstance(v, np.ndarray): |
| batch[k] = torch.tensor(np.stack([f[k] for f in features])) |
| else: |
| batch[k] = torch.tensor([f[k] for f in features]) |
| |
| return batch |
|
|