File size: 5,321 Bytes
62a0e4e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
---
trainer:
  class_path: eva.Trainer
  init_args:
    n_runs: &N_RUNS ${oc.env:N_RUNS, 20}
    default_root_dir: &OUTPUT_ROOT ${oc.env:OUTPUT_ROOT, logs/${oc.env:MODEL_NAME, vitg14_reg}/offline/camelyon16}
    max_epochs: &MAX_EPOCHS ${oc.env:MAX_EPOCHS, 100}
    checkpoint_type: ${oc.env:CHECKPOINT_TYPE, best}
    accelerator: ${oc.env:ACCELERATOR, auto}
    devices: ${oc.env:NUM_DEVICES, 1}
    callbacks:
      - class_path: eva.callbacks.ConfigurationLogger
      - class_path: lightning.pytorch.callbacks.TQDMProgressBar
        init_args:
          refresh_rate: ${oc.env:TQDM_REFRESH_RATE, 1}
      - class_path: lightning.pytorch.callbacks.LearningRateMonitor
        init_args:
          logging_interval: epoch
      - class_path: lightning.pytorch.callbacks.ModelCheckpoint
        init_args:
          filename: best
          save_last: ${oc.env:SAVE_LAST, false}
          save_top_k: 1
          monitor: &MONITOR_METRIC ${oc.env:MONITOR_METRIC, val/BinaryBalancedAccuracy}
          mode: &MONITOR_METRIC_MODE ${oc.env:MONITOR_METRIC_MODE, max}
      - class_path: lightning.pytorch.callbacks.EarlyStopping
        init_args:
          min_delta: 0
          patience: ${oc.env:PATIENCE, 20}
          monitor: *MONITOR_METRIC
          mode: *MONITOR_METRIC_MODE
      - class_path: eva.callbacks.ClassificationMultiEmbeddingsInMemoryWriter
        init_args:
          output_dir: &DATASET_EMBEDDINGS_ROOT ${oc.env:EMBEDDINGS_ROOT, ./data/embeddings/${oc.env:MODEL_NAME, vitg14_reg}/camelyon16}
          save_every_n: 10_000
          dataloader_idx_map:
            0: train
            1: val
            2: test
          metadata_keys: ["wsi_id"]  
          backbone:
            class_path: eva.core.models.wrappers.ModelFromFunction
            init_args:
              path: torch.hub.load
              arguments:
                repo_or_dir: facebookresearch/dinov2 
                model: dinov2_vitg14_reg
                pretrained: true
              checkpoint_path: ${oc.env:CHECKPOINT_PATH, ../checkpoints/teacher_epoch250000.pth}

          overwrite: true
    logger:
      - class_path: lightning.pytorch.loggers.TensorBoardLogger
        init_args:
          save_dir: *OUTPUT_ROOT
          name: ""
model:
  class_path: eva.HeadModule
  init_args:
    head:
      class_path: eva.vision.models.networks.ABMIL
      init_args:
        input_size: ${oc.env:IN_FEATURES, 1536}
        output_size: &NUM_CLASSES 1
        projected_input_size: 128
    criterion: torch.nn.BCEWithLogitsLoss
    optimizer:
      class_path: torch.optim.AdamW
      init_args:
        lr: ${oc.env:LR_VALUE, 0.001}
        betas: [0.9, 0.999]
    metrics:
      common:
        - class_path: eva.metrics.AverageLoss
        - class_path: eva.metrics.BinaryClassificationMetrics
data:
  class_path: eva.DataModule
  init_args:
    datasets:
      train:
        class_path: eva.datasets.InMemoryMultiEmbeddingsClassificationDataset
        init_args: &DATASET_ARGS
          root: *DATASET_EMBEDDINGS_ROOT
          manifest_file: manifest.csv
          split: train
          embeddings_transforms:
            class_path: eva.core.data.transforms.Pad2DTensor
            init_args:
              pad_size: &N_PATCHES ${oc.env:N_PATCHES, 1000}
          target_transforms:
            class_path: torchvision.transforms.v2.ToDtype
            init_args:
              dtype: torch.float32
      val:
        class_path: eva.datasets.InMemoryMultiEmbeddingsClassificationDataset
        init_args:
          <<: *DATASET_ARGS
          split: val
      test:
        class_path: eva.datasets.InMemoryMultiEmbeddingsClassificationDataset
        init_args:
          <<: *DATASET_ARGS
          split: test
      predict:
        - class_path: eva.vision.datasets.Camelyon16
          init_args: &PREDICT_DATASET_ARGS
            root: ${oc.env:DATA_ROOT, /block/eva-data/camelyon16}
            sampler:
              class_path: eva.vision.data.wsi.patching.samplers.ForegroundGridSampler
              init_args:
                max_samples: *N_PATCHES
            width: 224
            height: 224
            target_mpp: 0.25
            split: train
            coords_path: ${data.init_args.datasets.train.init_args.root}/coords_${.split}.csv
            image_transforms:
              class_path: eva.vision.data.transforms.common.ResizeAndCrop
              init_args:
                size: ${oc.env:RESIZE_DIM, 224} 
                mean: ${oc.env:NORMALIZE_MEAN, [0.485, 0.456, 0.406]} 
                std: ${oc.env:NORMALIZE_STD, [0.229, 0.224, 0.225]}
        - class_path: eva.vision.datasets.Camelyon16
          init_args:
            <<: *PREDICT_DATASET_ARGS
            split: val
        - class_path: eva.vision.datasets.Camelyon16
          init_args:
            <<: *PREDICT_DATASET_ARGS
            split: test
    dataloaders:
      train:
        batch_size: &BATCH_SIZE ${oc.env:BATCH_SIZE, 32}
        num_workers: &N_DATA_WORKERS ${oc.env:N_DATA_WORKERS, 4}
        shuffle: true
      val:
        batch_size: *BATCH_SIZE
        num_workers: *N_DATA_WORKERS
      test:
        batch_size: *BATCH_SIZE
        num_workers: *N_DATA_WORKERS
      predict:
        batch_size: &PREDICT_BATCH_SIZE ${oc.env:PREDICT_BATCH_SIZE, 64}
        num_workers: *N_DATA_WORKERS