import os import time import torch import warnings import argparse from data.preparation import prepare_data_crop from util.torch import init_distributed from util.logger import ( create_logger, save_config, prepare_log_folder, init_neptune, get_last_log_folder, ) from params import DATA_PATH def parse_args(): """ Parses arguments """ parser = argparse.ArgumentParser() parser.add_argument( "--fold", type=int, default=-1, help="Fold number", ) parser.add_argument( "--device", type=int, default=0, help="Device number", ) parser.add_argument( "--log_folder", type=str, default="", help="Folder to log results to", ) parser.add_argument( "--model", type=str, default="", help="Model name", ) parser.add_argument( "--epochs", type=int, default=0, help="Number of epochs", ) parser.add_argument( "--lr", type=float, default=0, help="learning rate", ) parser.add_argument( "--batch-size", type=int, default=0, help="Batch size", ) parser.add_argument( "--weight-decay", type=float, default=0.0, help="Weight decay", ) return parser.parse_args() class Config: """ Parameters used for training """ # General seed = 42 verbose = 1 pipe = "crop" targets = "target" # Data crop_folder = "../input/coords_crops_0.1_2/" resize = (224, 224) frames_chanel = 1 n_frames = 13 stride = 1 aug_strength = 5 crop = False fix_train_crops = True flip = False # k-fold k = 4 # folds_file = f"../input/folds_{k}.csv" folds_file = "../input/train_folded_v1.csv" selected_folds = [0, 1, 2, 3] # Model name = "coatnet_1_rw_224" pretrained_weights = None # "../logs/2024-09-19/17/" num_classes = 15 num_classes_aux = 0 drop_rate = 0. drop_path_rate = 0. n_channels = 3 reduce_stride = False pooling = "avg" head_3d = "lstm_side" if n_frames > 1 else "" delta = 2 # Training loss_config = { "name": "series", "weighted": False, "use_any": False, "smoothing": 0.0, "activation": "series", "aux_loss_weight": 0.0, "name_aux": "patient", "smoothing_aux": 0.0, "activation_aux": "", "ousm_k": 0, } data_config = { "batch_size": 16, # 8 "val_bs": 32, "mix": "mixup", "mix_proba": 1.0, # 1.0 "sched": False, "mix_alpha": 0.4, "additive_mix": False, "num_classes": 3, "num_workers": 8, } optimizer_config = { "name": "Ranger", "lr": 1e-3, "warmup_prop": 0.0, "betas": (0.9, 0.999), "max_grad_norm": 1.0, "weight_decay": 0.0, } epochs = 10 use_fp16 = True verbose = 1 verbose_eval = 50 if data_config["batch_size"] >= 16 else 100 fullfit = True n_fullfit = 1 if __name__ == "__main__": warnings.simplefilter("ignore", UserWarning) warnings.simplefilter("ignore", FutureWarning) config = Config init_distributed(config) if config.local_rank == 0: print("\nStarting !") args = parse_args() if not config.distributed: device = args.fold if args.fold > -1 else args.device time.sleep(device) print("Using GPU ", device) os.environ["CUDA_VISIBLE_DEVICES"] = str(device) assert torch.cuda.device_count() == 1 log_folder = args.log_folder if not log_folder: from params import LOG_PATH if config.local_rank == 0: log_folder = prepare_log_folder(LOG_PATH) print(f"\n -> Logging results to {log_folder}\n") else: time.sleep(2) log_folder = get_last_log_folder(LOG_PATH) # print(log_folder) if args.model: config.name = args.model if args.epochs: config.epochs = args.epochs if args.lr: config.optimizer_config["lr"] = args.lr if args.weight_decay: config.optimizer_config["weight_decay"] = args.weight_decay if args.batch_size: config.data_config["batch_size"] = args.batch_size config.data_config["val_bs"] = args.batch_size run = None if config.local_rank == 0: run = init_neptune(config, log_folder) if args.fold > -1: config.selected_folds = [args.fold] create_logger(directory=log_folder, name=f"logs_{args.fold}.txt") else: create_logger(directory=log_folder, name="logs.txt") save_config(config, log_folder + "config.json") if run is not None: run["global/config"].upload(log_folder + "config.json") if config.local_rank == 0: print("Device :", torch.cuda.get_device_name(0), "\n") print(f"- Model {config.name}") print(f"- Epochs {config.epochs}") print( f"- Learning rate {config.optimizer_config['lr']:.1e} (n_gpus={config.world_size})" ) print("\n -> Training\n") df = prepare_data_crop(DATA_PATH, crop_folder=config.crop_folder) from training.main import k_fold k_fold(config, df, log_folder=log_folder, run=run) if len(config.selected_folds) == 4: if config.local_rank == 0: print("\n -> Inference\n") # log_folder = "../logs/2024-10-04/9/" from inference.lvl1 import kfold_inference_crop kfold_inference_crop( df, log_folder, use_fp16=config.use_fp16, save=True, distributed=True, config=config, ) if config.local_rank == 0: print("\nDone !")