from datasets import load_dataset, DatasetDict from transformers import AutoTokenizer, T5ForConditionalGeneration, Seq2SeqTrainingArguments, Seq2SeqTrainer from transformers import EarlyStoppingCallback, get_linear_schedule_with_warmup from transformers.integrations import TensorBoardCallback import torch import logging # Set up logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # Load the dataset and take only 1000 samples logger.info("Loading dataset...") dataset = load_dataset("fddemarco/pushshift-reddit-comments", split="train") dataset = dataset.shuffle(seed=42) logger.info("Dataset loaded, shuffled, and truncated to 10,000 samples.") # Split the train dataset into train and test train_testvalid = dataset["train"].train_test_split(test_size=0.2, seed=42) test_valid = train_testvalid["test"].train_test_split(test_size=0.5, seed=42) dataset = DatasetDict({ "train": train_testvalid["train"], "test": test_valid["test"], "validation": test_valid["train"] }) # Prepare the dataset def prepare_data(example): return {"input_text": example["body"], "target_text": example["body"]} logger.info("Preparing dataset...") processed_dataset = {split: data.map(prepare_data) for split, data in dataset.items()} logger.info("Dataset prepared.") # Tokenize the dataset model_name = "t5-large" tokenizer = AutoTokenizer.from_pretrained(model_name) def tokenize_function(examples): model_inputs = tokenizer(examples["input_text"], max_length=256, truncation=True, padding="max_length") labels = tokenizer(examples["target_text"], max_length=256, truncation=True, padding="max_length") model_inputs["labels"] = labels["input_ids"] return model_inputs logger.info("Tokenizing dataset...") tokenized_dataset = {split: data.map(tokenize_function, batched=True) for split, data in processed_dataset.items()} logger.info("Dataset tokenized.") # Check available splits in the dataset available_splits = list(tokenized_dataset.keys()) logger.info(f"Available splits in the dataset: {available_splits}") # Set up the model and trainer logger.info("Setting up model and trainer...") model = T5ForConditionalGeneration.from_pretrained(model_name) training_args = Seq2SeqTrainingArguments( output_dir="./results", num_train_epochs=3, # Reduced from 5 to 3 per_device_train_batch_size=32, # Increased from 16 to 32 per_device_eval_batch_size=32, warmup_steps=2000, # Increased from 1000 to 2000 weight_decay=0.01, logging_dir="./logs", logging_steps=500, # Increased from 100 to 500 evaluation_strategy="steps", eval_steps=2000, # Increased from 500 to 2000 save_steps=2000, # Increased from 500 to 2000 use_cpu=False, load_best_model_at_end=True, metric_for_best_model="eval_loss", greater_is_better=False, fp16=True, gradient_accumulation_steps=2, # Reduced from 4 to 2 predict_with_generate=True, generation_max_length=256, generation_num_beams=4, ) optimizer = torch.optim.AdamW(model.parameters(), lr=3e-5) # Slightly lower learning rate scheduler = get_linear_schedule_with_warmup( optimizer, num_warmup_steps=500, num_training_steps=len(tokenized_dataset["train"]) * training_args.num_train_epochs ) trainer = Seq2SeqTrainer( model=model, args=training_args, train_dataset=tokenized_dataset["train"], eval_dataset=tokenized_dataset.get("test"), tokenizer=tokenizer, optimizers=(optimizer, scheduler), callbacks=[EarlyStoppingCallback(early_stopping_patience=3), TensorBoardCallback()] ) logger.info("Model and trainer set up.") # Train the model logger.info("Starting training...") trainer.train() logger.info("Training completed.") # Log final results logger.info("Evaluating model...") results = trainer.evaluate() logger.info(f"Final evaluation results: {results}") # Save the model and tokenizer to the Hugging Face Hub logger.info("Saving model and tokenizer to Hugging Face Hub...") model_name = "umut-bozdag/humanize_model" trainer.push_to_hub(model_name) tokenizer.push_to_hub(model_name) logger.info(f"Model and tokenizer saved successfully as '{model_name}'")