| import torch
|
| from torch.utils.data import Dataset
|
| from model.config import ModelConfig
|
|
|
|
|
|
|
| from model.tokenizer import AdvancedTokenizer
|
|
|
| class TextDataset(Dataset):
|
| def __init__(self, text: str, tokenizer: AdvancedTokenizer, config: ModelConfig, pin_memory: bool = False):
|
| """
|
| Args:
|
| text (str): The full training corpus.
|
| tokenizer (AdvancedTokenizer): The tokenizer instance.
|
| config (ModelConfig): Configuration object.
|
| pin_memory (bool): If True, tensor becomes DMA-locked in system RAM for faster GPU transfer.
|
| """
|
| print("Encoding dataset (this may take a moment)...")
|
| self.data = torch.tensor(tokenizer.encode(text), dtype=torch.long)
|
|
|
| if pin_memory and torch.cuda.is_available():
|
| print("Pinning Dataset to Fixed RAM (Pinned Memory)...")
|
| self.data = self.data.pin_memory()
|
|
|
| self.block_size = config.block_size
|
| print(f"Dataset loaded. Total tokens: {len(self.data)}")
|
|
|
| def __len__(self):
|
|
|
|
|
| if len(self.data) <= self.block_size:
|
| return 0
|
| return len(self.data) - self.block_size
|
|
|
| def __getitem__(self, idx):
|
|
|
| chunk = self.data[idx : idx + self.block_size + 1]
|
|
|
|
|
| x = chunk[:-1]
|
| y = chunk[1:]
|
|
|
| return x, y
|
|
|