| import argparse |
| import json |
| from pathlib import Path |
|
|
| from transformers import ( |
| AutoModelForSequenceClassification, |
| DataCollatorWithPadding, |
| ) |
|
|
| from curve_logger import CurveLoggerCallback |
| from trainer_utils import ( |
| LABELS, |
| compute_binary_metrics, |
| load_or_prepare_imdb, |
| make_trainer, |
| make_training_arguments, |
| ) |
|
|
|
|
| def parse_args(): |
| parser = argparse.ArgumentParser(description="Trainer basic usage") |
| parser.add_argument("--checkpoint", default="bert-base-uncased") |
| parser.add_argument("--output-dir", default="./results/page_01_basic") |
| parser.add_argument("--data-dir", default="./data/page_01_imdb") |
| parser.add_argument("--max-length", type=int, default=512) |
| parser.add_argument("--epochs", type=float, default=3) |
| parser.add_argument("--max-train-samples", type=int, default=None) |
| parser.add_argument("--max-eval-samples", type=int, default=None) |
| return parser.parse_args() |
|
|
|
|
| def main(): |
| args = parse_args() |
| output_dir = Path(args.output_dir) |
| output_dir.mkdir(parents=True, exist_ok=True) |
|
|
| train_ds, eval_ds, tokenizer = load_or_prepare_imdb( |
| checkpoint=args.checkpoint, |
| data_dir=args.data_dir, |
| max_length=args.max_length, |
| padding="max_length", |
| max_train_samples=args.max_train_samples, |
| max_eval_samples=args.max_eval_samples, |
| ) |
| model = AutoModelForSequenceClassification.from_pretrained( |
| args.checkpoint, |
| num_labels=2, |
| **LABELS, |
| ) |
|
|
| training_args = make_training_arguments( |
| output_dir=str(output_dir), |
| eval_strategy="epoch", |
| learning_rate=2e-5, |
| per_device_train_batch_size=16, |
| per_device_eval_batch_size=16, |
| num_train_epochs=args.epochs, |
| weight_decay=0.01, |
| save_strategy="epoch", |
| load_best_model_at_end=True, |
| metric_for_best_model="eval_f1", |
| greater_is_better=True, |
| report_to="none", |
| ) |
|
|
| trainer = make_trainer( |
| tokenizer=tokenizer, |
| model=model, |
| args=training_args, |
| train_dataset=train_ds, |
| eval_dataset=eval_ds, |
| data_collator=DataCollatorWithPadding(tokenizer=tokenizer), |
| compute_metrics=compute_binary_metrics, |
| callbacks=[CurveLoggerCallback(output_dir, stage="basic")], |
| ) |
|
|
| trainer.train() |
| metrics = trainer.evaluate() |
| predictions = trainer.predict(eval_ds.select(range(min(16, len(eval_ds))))) |
| trainer.save_model(str(output_dir / "final_model")) |
| tokenizer.save_pretrained(str(output_dir / "final_model")) |
|
|
| summary = { |
| "metrics": metrics, |
| "prediction_shape": list(predictions.predictions.shape), |
| } |
| (output_dir / "summary.json").write_text( |
| json.dumps(summary, ensure_ascii=False, indent=2), |
| encoding="utf-8", |
| ) |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|