""" Minimal command: python training_loop.py --hub_dir "segments/sidewalk-semantic" --push_to_hub Maximal command: python training_loop.py --hub_dir "segments/sidewalk-semantic" --batch_size 32 --learning_rate 6e-5 --model_flavor 0 --seed 42 --split train --push_to_hub """ import json import torch from pytorch_lightning import Trainer, callbacks, seed_everything from pytorch_lightning.loggers import WandbLogger from transformers import AutoConfig, SegformerForSemanticSegmentation, SegformerFeatureExtractor from dataloader import SidewalkSegmentationDataLoader from model import SidewalkSegmentationModel def main( hub_dir: str, batch_size: int = 32, learning_rate: float = 6e-5, model_flavor: int = 0, seed: int = 42, split: str = "train", push_to_hub: bool = False, ): seed_everything(seed) logger = WandbLogger(project="sidewalk-segmentation") gpu_value = 1 if torch.cuda.is_available() else 0 id2label_file = json.load(open("id2label.json", "r")) id2label = {int(k): v for k, v in id2label_file.items()} num_labels = len(id2label) model = SidewalkSegmentationModel( num_labels=num_labels, id2label=id2label, model_flavor=model_flavor, learning_rate=learning_rate, ) data_module = SidewalkSegmentationDataLoader( hub_dir=hub_dir, batch_size=batch_size, split=split, ) data_module.setup() checkpoint_callback = callbacks.ModelCheckpoint( dirpath="checkpoints", save_top_k=1, verbose=True, monitor="val_mean_iou", mode="max", ) early_stopping_callback = callbacks.EarlyStopping( monitor="val_mean_iou", patience=5, verbose=True, mode="max", ) trainer = Trainer( max_epochs=200, progress_bar_refresh_rate=10, gpus=gpu_value, logger=logger, callbacks=[checkpoint_callback, early_stopping_callback], deterministic=False, ) trainer.fit(model, data_module) if push_to_hub: config = AutoConfig.from_pretrained(f"nvidia/mit-b{model_flavor}") config.num_labels = num_labels config.id2label = id2label config.label2id = {v: k for k, v in id2label_file.items()} config.push_to_hub(f"flavors/b{model_flavor}", repo_url=f"https://huggingface.co/ChainYo/segformer-{model_flavor}-sidewalk") checkpoint_path = checkpoint_callback.best_model_filepath model = SegformerForSemanticSegmentation.from_pretrained(checkpoint_path, config=config,) model.push_to_hub(f"flavors/b{model_flavor}", repo_url=f"https://huggingface.co/ChainYo/segformer-{model_flavor}-sidewalk") if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument("--hub_dir", type=str, required=True) parser.add_argument("--batch_size", type=int, default=32) parser.add_argument("--learning_rate", type=float, default=6e-5) parser.add_argument("--model_flavor", type=int, default=0) parser.add_argument("--seed", type=int, default=42) parser.add_argument("--split", type=str, default="train") parser.add_argument("--push_to_hub", action="store_true") args = parser.parse_args() main( hub_dir=args.hub_dir, batch_size=args.batch_size, learning_rate=args.learning_rate, model_flavor=args.model_flavor, seed=args.seed, split=args.split, push_to_hub=args.push_to_hub, )