Spaces:
Sleeping
Sleeping
| 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 |