Transformers documentation
Veri toplayıcıları
Veri toplayıcıları
Bir veri toplayıcı (data collator), model için bireysel veri seti örneklerini bir partiye (batch) dönüştürür. Ayrıca örnekleri her partideki en uzun dizine dinamik olarak doldurabilir (padding); bu, küresel bir maksimum uzunluğa doldurmaktan daha verimlidir.
Dataset[0] → {"input_ids": [101, 2003], "labels": 1}
Dataset[1] → {"input_ids": [101, 2003, 1996], "labels": 0}
Dataset[2] → {"input_ids": [101, 7592], "labels": 1}
↓ collator
{
"input_ids": tensor([[101, 2003, 0], # padded to longest
[101, 2003, 1996],
[101, 7592, 0]]),
"labels": tensor([1, 0, 1])
}Transformers, çeşitli görevler için veri toplayıcıları (data collator) sağlar (mevcut tüm veri toplayıcılarını görüntüleyin). Özel bir veri toplayıcısı oluşturmak için:
- Standart tokenizer tabanlı dolgu ve ek alanlara ihtiyacınız olduğunda DataCollatorWithPadding kullanın.
- Özel dolgu mantığına, örnek başına birden fazla eşleşen girdiye veya tokenizer'ın kendi başına üretemediği bir batch yapısına ihtiyaç duyduğunuzda DataCollatorMixin kullanın.
DataCollatorWithPadding
Ek bir alan ekleme gibi basit kullanım senaryolarında DataCollatorWithPadding sınıfını alt sınıflandırın ve __call__ metodunu genişletin. Aşağıdaki örnek bir "score" alanı ekler.
- pad() bunu tanımadığı için özel alanı önce kaldırın.
input_idsveattention_maskile ilgilenmek için üst sınıfı çağırın.- Toplu işlemdeki
"score"alanını geri ekleyin.
import torch
from dataclasses import dataclass
from transformers import DataCollatorWithPadding, PreTrainedTokenizerBase
@dataclass
class DataCollatorWithScore(DataCollatorWithPadding):
tokenizer: PreTrainedTokenizerBase
def __call__(self, features):
scores = [f.pop("score") for f in features]
batch = super().__call__(features)
batch["score"] = torch.tensor(scores, dtype=torch.float)
return batchÖzel veri toplayıcıyı, diğer herhangi bir veri toplayıcısı gibi Trainer'a iletin.
trainer = Trainer(
...,
data_collator=DataCollatorWithScore(tokenizer=tokenizer),
)DataCollatorMixin
Tam kontrol için DataCollatorMixin sınıfından türetin ve kendi __call__ yönteminizi uygulayın. Özel dolgu mantığı oluşturun, birden fazla giriş türünü işleyin veya tamamen yeni batch yapıları oluşturun. Aşağıdaki DataCollatorForPreference örneği, her eğitim örneğinin seçilen ve reddedilen bir yanıtı olması ve modelin her ikisini de görmesi gerektiği için DataCollatorMixin kullanır.
paddüz listeler beklediği içinchosen_idsverejected_idsdeğerlerini ayrı ayrı tutun.- Girdi çiftini tek bir listede birleştirin.
- Collator ham token ID list'leriyle çalıştığı için
attention_mask'ı tokenizer yerine torch.ones_like ile oluşturun. input_idsveattention_maskdeğerlerini doldurun (pad).
import torch
from dataclasses import dataclass
from transformers.data.data_collator import DataCollatorMixin
from trl.trainer.utils import pad
@dataclass
class DataCollatorForPreference(DataCollatorMixin):
pad_token_id: int
pad_to_multiple_of: int | None = None
def __call__(self, examples: list[dict]) -> dict:
chosen_input_ids = [torch.tensor(ex["chosen_ids"]) for ex in examples]
rejected_input_ids = [torch.tensor(ex["rejected_ids"]) for ex in examples]
input_ids = chosen_input_ids + rejected_input_ids
attention_mask = [torch.ones_like(ids) for ids in input_ids]
output = {
"input_ids": pad(
input_ids,
padding_value=self.pad_token_id,
padding_side="right",
pad_to_multiple_of=self.pad_to_multiple_of,
),
"attention_mask": pad(
attention_mask,
padding_value=0,
padding_side="right",
pad_to_multiple_of=self.pad_to_multiple_of,
),
}
...
return outputSonraki adımlar
- Token sınıflandırması gibi yaygın görevler için kullanılabilen tüm data collatorları görüntüleyin.