import os import numpy as np import torch def load_tokens(filename): # simple numpy array extraction into torch tensor matrix memory npt = np.load(filename) npt = npt.astype(np.int32) ptt = torch.tensor(npt, dtype=torch.long) return ptt class DataLoaderLite: def __init__(self, B, T, process_rank, num_processes, split, master_process): self.B = B self.T = T self.process_rank = process_rank self.num_processes = num_processes assert split in {'train', 'val'} # swap directory to parse the dedicated edu fineweb repository location data_root = "data/edu_fineweb10B" shards = os.listdir(data_root) shards = [s for s in shards if split in s] shards = sorted(shards) shards = [os.path.join(data_root, s) for s in shards] self.shards = shards assert len(shards) > 0, f"no shards found for split {split}" if master_process: print(f"found {len(shards)} shards for split {split}") self.reset() def reset(self): # restart cursor coordinates back to default baseline states self.current_shard = 0 self.tokens = load_tokens(self.shards[self.current_shard]) self.current_position = self.B * self.T * self.process_rank def next_batch(self): B, T = self.B, self.T # slice out an extra token coordinate to establish lookahead targets buf = self.tokens[self.current_position : self.current_position + B * T + 1] x = (buf[:-1]).view(B, T) y = (buf[1:]).view(B, T) # advance sequence coordinates forward across total active processes self.current_position += B * T * self.num_processes # boundary loop detection to wrap safely over to the next shard asset if self.current_position + B * T * self.num_processes + 1 > len(self.tokens): self.current_shard = (self.current_shard + 1) % len(self.shards) self.tokens = load_tokens(self.shards[self.current_shard]) self.current_position = B * T * self.process_rank return x, y