import os import random import numpy as np import torch from datasets import Dataset import wandb SEED = 42 def set_seed(seed): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False os.environ["PYTHONHASHSEED"] = str(seed) set_seed(SEED) os.environ["HF_HOME"] = "/root/hf_cache" os.environ["HF_DATASETS_CACHE"] = "/root/hf_cache/datasets" BLOCK_SIZE = 2048 DATA_DIR = "/data/copypaste_2048" NUM_TRAIN = 500_000 NUM_VAL = 1_000 NUM_TEST = 1_000 VOCAB_SIZE = 250 DELIM_TOKEN = 251 PAD_TOKEN = 0 def generate_copy_paste_samples(num_samples, seed): def gen(): rng = np.random.default_rng(seed) max_seq_len = (BLOCK_SIZE - 1) // 2 for _ in range(num_samples): seq_len = rng.integers(10, max_seq_len + 1) seq = rng.integers(1, VOCAB_SIZE + 1, size=seq_len) input_ids = np.full(BLOCK_SIZE, PAD_TOKEN, dtype=np.int64) labels = np.full(BLOCK_SIZE, -100, dtype=np.int64) input_ids[:seq_len] = seq input_ids[seq_len] = DELIM_TOKEN input_ids[seq_len+1 : seq_len+1+seq_len] = seq labels[seq_len+1 : seq_len+1+seq_len] = seq attention_mask = np.zeros(BLOCK_SIZE, dtype=np.int64) attention_mask[:seq_len+1+seq_len] = 1 yield { "input_ids": input_ids.tolist(), "attention_mask": attention_mask.tolist(), "labels": labels.tolist() } return gen if __name__ == "__main__": print(f"Generating Copy-Paste dataset with SEED: {SEED} (Block size: {BLOCK_SIZE})...") ds_train = Dataset.from_generator(generate_copy_paste_samples(NUM_TRAIN, SEED)) ds_val = Dataset.from_generator(generate_copy_paste_samples(NUM_VAL, SEED + 1)) ds_test = Dataset.from_generator(generate_copy_paste_samples(NUM_TEST, SEED + 2)) os.makedirs(DATA_DIR, exist_ok=True) print(f"Saving finalized datasets to {DATA_DIR}...") ds_train.save_to_disk(f"{DATA_DIR}/train") ds_val.save_to_disk(f"{DATA_DIR}/val") ds_test.save_to_disk(f"{DATA_DIR}/test") print(f"Final Train blocks count: {len(ds_train)} (~{len(ds_train) * BLOCK_SIZE / 1e8:.2f}B tokens)") print(f"Final Val blocks count: {len(ds_val)}") print(f"Final Test blocks count: {len(ds_test)}")