from datasets import load_dataset from transformers import TrainingArguments from span_marker import SpanMarkerModel, Trainer def perform_training(learning_rate: float, seed: int) -> None: # Load the dataset, ensure "tokens" and "ner_tags" columns, and get a list of labels dataset = load_dataset("gwlms/germeval2014") labels = dataset["train"].features["ner_tags"].feature.names # Initialize a SpanMarker model using a pretrained BERT-style encoder model_name = "deepset/gelectra-large" model = SpanMarkerModel.from_pretrained( model_name, labels=labels, # SpanMarker hyperparameters: model_max_length=256, marker_max_length=128, entity_max_length=8, ) # Prepare the 🤗 transformers training arguments args = TrainingArguments( output_dir=f"./span_marker-gelectra-large-bs16-lr{learning_rate}-{seed}", # Training Hyperparameters: learning_rate=learning_rate, per_device_train_batch_size=16, per_device_eval_batch_size=16, num_train_epochs=3, weight_decay=0.01, warmup_ratio=0.1, fp16=True, # Replace `bf16` with `fp16` if your hardware can't use bf16. # Other Training parameters logging_first_step=True, logging_steps=50, evaluation_strategy="epoch", save_strategy="epoch", save_total_limit=11, dataloader_num_workers=2, seed=seed, load_best_model_at_end=True, ) # Initialize the trainer using our model, training args & dataset, and train trainer = Trainer( model=model, args=args, train_dataset=dataset["train"], eval_dataset=dataset["validation"], ) trainer.train() trainer.save_model(f"./span_marker-gelectra-large-bs16-lr{learning_rate}-{seed}/best-checkpoint") # Compute & save the metrics on the test set metrics = trainer.evaluate(dataset["test"], metric_key_prefix="test") trainer.save_metrics("test", metrics) if __name__ == "__main__": for learning_rate in [5e-05]: for seed in [1,2,3,4,5]: perform_training(learning_rate, seed)