Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error at validation step when fine-tuning a model #18

Closed
GenevieveBuckley opened this issue Jul 7, 2022 · 7 comments
Closed

Error at validation step when fine-tuning a model #18

GenevieveBuckley opened this issue Jul 7, 2022 · 7 comments

Comments

@GenevieveBuckley
Copy link

GenevieveBuckley commented Jul 7, 2022

Summary

I'm trying to fine tune a model in empanada-napari, and encountering a pickle error at epoch 19.

EDIT: It turns out this happens only when the validation step is run, and leaving the validation directory empty in the GUI avoids this error. I had copied the same training directory path into the validation path, since I think that's what Ryan told me to do when he showed me how to fine tune a model. The fine tuning docs page also says this should work.

What I expected to happen

I expected the fine tuning training to complete sucessfully, after 100 iterations (the number specified in the GUI, I'm using the default values).

What happened instead

The fine tuning training appears to start successfully, but at epoch 19 I get:

AttributeError: Can't pickle local object 'FactorPad.__init__.<locals>.pad_func'

I don't know why the error always happens at epoch 19.

System details

Operating system: Windows 10
CUDA version: 11.6
conda environment python version: 3.9.10
empanada-napari version: 0.2.0
empanada-dl version: 0.1.4

I think that empanada-napari should be using the GPU for fine-tuning the model, but I can't see any confirmation of that. There's also no increase in GPU memory use when I start the fine tuning, so maybe it's not actually using the GPU at all?

To reproduce

  1. Create a conda environment
conda create -n napari-empanada python=3.9 pip ipython
conda activate napari-empanada
conda install napari -c conda-forge
python -m pip install empanada-napari
  1. Open napari, and create & save flipbooks for fine tuning an empanada-napari MitoNet model
  2. Start empanada-napari fine tuning of the model, using the default values.
  3. Observe this error at epoch 19: AttributeError: Can't pickle local object 'FactorPad.__init__.<locals>.pad_func'
Full error message (click to expand)
(napari-empanada) C:\Users\CryoEM>conda list | grep empanada
# packages in environment at C:\Users\CryoEM\.conda\envs\napari-empanada:
empanada-dl               0.1.4                    pypi_0    pypi
empanada-napari           0.2.0                    pypi_0    pypi


Created directory H:\data\ramaciotti-datasets\oocyte\ASV 08-30 Inwon oocyte2\empanada\oocyte-training-patches
Finished saving.
Found 26 images for training. Training for 100 epochs.
Model with 31656726 trainable parameters.
Found 1 image subdirectories with 26 images.
Found 1 image subdirectories with 26 images.
Steps per epoch adjusted from -1 to 1
Epoch: [0][0/1] Time  9.240     Data  4.675     ce 4.1782e+00   l1 6.1008e+01   mse 3.3257e-03  pointrend_ce 9.4649e-01
total_loss 6.4000e+00


Epoch 0 training metrics:
mito_semantic_iou 0.13612335920333862
Epoch: [1][0/1] Time  6.345     Data  4.539     ce 3.3382e+00   l1 5.0749e+01   mse 3.5384e-03  pointrend_ce 9.9021e-01
total_loss 5.5436e+00


Epoch 1 training metrics:
mito_semantic_iou 0.15259526669979095
Epoch: [2][0/1] Time  8.658     Data  4.466     ce 4.3790e+00   l1 5.0761e+01   mse 3.7653e-03  pointrend_ce 1.2585e+00
total_loss 6.8982e+00


Epoch 2 training metrics:
mito_semantic_iou 0.10419566929340361
Epoch: [3][0/1] Time 16.115     Data  4.495     ce 4.7639e+00   l1 5.2924e+01   mse 3.3809e-03  pointrend_ce 1.1638e+00
total_loss 7.1331e+00


Epoch 3 training metrics:
mito_semantic_iou 0.1630430966615677
Epoch: [4][0/1] Time  4.698     Data  4.346     ce 2.8276e+00   l1 4.4481e+01   mse 2.7066e-03  pointrend_ce 7.2677e-01
total_loss 4.5405e+00


Epoch 4 training metrics:
mito_semantic_iou 0.2011376917362213
Epoch: [5][0/1] Time  4.664     Data  4.338     ce 3.9980e+00   l1 4.9315e+01   mse 2.7469e-03  pointrend_ce 1.3533e+00
total_loss 6.3938e+00


Epoch 5 training metrics:
mito_semantic_iou 0.1908329874277115
Epoch: [6][0/1] Time  4.678     Data  4.330     ce 3.5166e+00   l1 4.0449e+01   mse 2.9290e-03  pointrend_ce 1.2153e+00
total_loss 5.7222e+00


Epoch 6 training metrics:
mito_semantic_iou 0.11712084710597992
Epoch: [7][0/1] Time  4.682     Data  4.335     ce 2.9782e+00   l1 4.5546e+01   mse 2.6126e-03  pointrend_ce 1.2935e+00
total_loss 5.2497e+00


Epoch 7 training metrics:
mito_semantic_iou 0.19130216538906097
Epoch: [8][0/1] Time  4.658     Data  4.347     ce 3.6599e+00   l1 5.4887e+01   mse 2.0232e-03  pointrend_ce 1.2693e+00
total_loss 5.8827e+00


Epoch 8 training metrics:
mito_semantic_iou 0.20763061940670016
Epoch: [9][0/1] Time  4.707     Data  4.378     ce 2.5141e+00   l1 4.1882e+01   mse 1.8335e-03  pointrend_ce 9.0550e-01
total_loss 4.2051e+00


Epoch 9 training metrics:
mito_semantic_iou 0.2604933977127075
Epoch: [10][0/1]        Time  4.679     Data  4.412     ce 1.7388e+00   l1 2.9987e+01   mse 2.0437e-03  pointrend_ce 8.3371e-01 total_loss 3.2811e+00


Epoch 10 training metrics:
mito_semantic_iou 0.2513369023799896
Epoch: [11][0/1]        Time  4.644     Data  4.367     ce 2.1971e+00   l1 3.6864e+01   mse 1.6970e-03  pointrend_ce 8.4837e-01 total_loss 3.7535e+00


Epoch 11 training metrics:
mito_semantic_iou 0.21290041506290436
Epoch: [12][0/1]        Time  4.704     Data  4.360     ce 1.0946e+00   l1 3.9918e+01   mse 1.7352e-03  pointrend_ce 5.7370e-01 total_loss 2.4145e+00


Epoch 12 training metrics:
mito_semantic_iou 0.4514885246753693
Epoch: [13][0/1]        Time  4.689     Data  4.341     ce 1.3370e+00   l1 5.2100e+01   mse 1.7049e-03  pointrend_ce 6.2143e-01 total_loss 2.8204e+00


Epoch 13 training metrics:
mito_semantic_iou 0.3192005157470703
Epoch: [14][0/1]        Time  4.663     Data  4.334     ce 1.2071e+00   l1 3.8879e+01   mse 1.6488e-03  pointrend_ce 4.9716e-01 total_loss 2.4229e+00


Epoch 14 training metrics:
mito_semantic_iou 0.4479334354400635
Epoch: [15][0/1]        Time  4.705     Data  4.355     ce 1.0944e+00   l1 4.6365e+01   mse 1.7241e-03  pointrend_ce 5.1541e-01 total_loss 2.4183e+00


Epoch 15 training metrics:
mito_semantic_iou 0.43887898325920105
Epoch: [16][0/1]        Time  4.688     Data  4.363     ce 6.4812e-01   l1 3.1086e+01   mse 1.6569e-03  pointrend_ce 3.3604e-01 total_loss 1.6264e+00


Epoch 16 training metrics:
mito_semantic_iou 0.526613712310791
Epoch: [17][0/1]        Time  4.659     Data  4.340     ce 6.2239e-01   l1 4.3259e+01   mse 1.6589e-03  pointrend_ce 2.9766e-01 total_loss 1.6844e+00


Epoch 17 training metrics:
mito_semantic_iou 0.5821987986564636
Epoch: [18][0/1]        Time  4.715     Data  4.376     ce 8.2417e-01   l1 5.3203e+01   mse 1.6852e-03  pointrend_ce 3.2354e-01 total_loss 2.0168e+00


Epoch 18 training metrics:
mito_semantic_iou 0.6062097549438477
Epoch: [19][0/1]        Time  4.684     Data  4.354     ce 3.3560e-01   l1 3.1103e+01   mse 1.5695e-03  pointrend_ce 2.1588e-01 total_loss 1.1764e+00


Epoch 19 training metrics:
mito_semantic_iou 0.8068138957023621
In [3]: Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\multiprocessing\spawn.py", line 116, in spawn_main
    exitcode = _main(fd, parent_sentinel)
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\multiprocessing\spawn.py", line 126, in _main
    self = reduction.pickle.load(from_parent)
EOFError: Ran out of input
Traceback (most recent call last):
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\site-packages\superqt\utils\_qthreading.py", line 616, in reraise
    raise e
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\site-packages\superqt\utils\_qthreading.py", line 176, in run
    result = self.work()
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\site-packages\superqt\utils\_qthreading.py", line 356, in work
    return self._func(*self._args, **self._kwargs)
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\site-packages\empanada_napari\_finetune.py", line 33, in run_finetuning
    finetune.main(config)
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\site-packages\empanada_napari\finetune.py", line 63, in main
    main_worker(config)
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\site-packages\empanada_napari\finetune.py", line 201, in main_worker
    validate(eval_loader, model, criterion, epoch, config)
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\site-packages\empanada_napari\finetune.py", line 389, in validate
    for i, batch in enumerate(eval_loader):
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\site-packages\torch\utils\data\dataloader.py", line 368, in __iter__
    return self._get_iterator()
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\site-packages\torch\utils\data\dataloader.py", line 314, in _get_iterator
    return _MultiProcessingDataLoaderIter(self)
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\site-packages\torch\utils\data\dataloader.py", line 927, in __init__
    w.start()
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\multiprocessing\process.py", line 121, in start
    self._popen = self._Popen(self)
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\multiprocessing\context.py", line 224, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\multiprocessing\context.py", line 327, in _Popen
    return Popen(process_obj)
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\multiprocessing\popen_spawn_win32.py", line 93, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Users\CryoEM\.conda\envs\napari-empanada\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
AttributeError: Can't pickle local object 'FactorPad.__init__.<locals>.pad_func'

If you suspect this is an IPython 8.1.1 bug, please report it at:
    https://github.com/ipython/ipython/issues
or send an email to the mailing list at [email protected]

You can print a more detailed traceback right now with "%tb", or use "%debug"
to interactively debug it.

Extra-detailed tracebacks for bug-reporting purposes can be enabled via:
    %config Application.verbose_crash=True

In [3]: %tb
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
File ~\.conda\envs\napari-empanada\lib\site-packages\superqt\utils\_qthreading.py:176, in WorkerBase.run(self)
    174     warnings.filterwarnings("always")
    175     warnings.showwarning = lambda *w: self.warned.emit(w)
--> 176     result = self.work()
    177 if isinstance(result, Exception):
    178     if isinstance(result, RuntimeError):
    179         # The Worker object has likely been deleted.
    180         # A deleted wrapped C/C++ object may result in a runtime
    181         # error that will cause segfault if we try to do much other
    182         # than simply notify the user.

File ~\.conda\envs\napari-empanada\lib\site-packages\superqt\utils\_qthreading.py:356, in FunctionWorker.work(self)
    355 def work(self) -> _R:
--> 356     return self._func(*self._args, **self._kwargs)

File ~\.conda\envs\napari-empanada\lib\site-packages\empanada_napari\_finetune.py:33, in finetuning_widget.<locals>.run_finetuning(config)
     30 @thread_worker
     31 def run_finetuning(config):
     32     from empanada_napari import finetune
---> 33     finetune.main(config)
     35     outpath = os.path.join(config['TRAIN']['model_dir'], config['model_name'] + '.yaml')
     36     print(f'Finished finetuning. Model config saved to {outpath}')

File ~\.conda\envs\napari-empanada\lib\site-packages\empanada_napari\finetune.py:63, in main(config)
     60 assert config['FINETUNE']['criterion'] in loss_names
     61 assert config['FINETUNE']['engine'] in engine_names
---> 63 main_worker(config)

File ~\.conda\envs\napari-empanada\lib\site-packages\empanada_napari\finetune.py:201, in main_worker(config)
    199 is_last_epoch = (epoch + 1) % epochs == 0
    200 if eval_loader is not None and (is_val_epoch or is_last_epoch):
--> 201     validate(eval_loader, model, criterion, epoch, config)
    203 save_now = (epoch + 1) % config['TRAIN']['save_freq'] == 0
    204 if save_now:

File ~\.conda\envs\napari-empanada\lib\site-packages\empanada_napari\finetune.py:389, in validate(eval_loader, model, criterion, epoch, config)
    386 engine_name = config['FINETUNE']['engine']
    387 engine = engines.__dict__[engine_name](model, **config['FINETUNE']['engine_params'])
--> 389 for i, batch in enumerate(eval_loader):
    390     end = time.time()
    391     images = batch['image']

File ~\.conda\envs\napari-empanada\lib\site-packages\torch\utils\data\dataloader.py:368, in DataLoader.__iter__(self)
    366     return self._iterator
    367 else:
--> 368     return self._get_iterator()

File ~\.conda\envs\napari-empanada\lib\site-packages\torch\utils\data\dataloader.py:314, in DataLoader._get_iterator(self)
    312 else:
    313     self.check_worker_number_rationality()
--> 314     return _MultiProcessingDataLoaderIter(self)

File ~\.conda\envs\napari-empanada\lib\site-packages\torch\utils\data\dataloader.py:927, in _MultiProcessingDataLoaderIter.__init__(self, loader)
    920 w.daemon = True
    921 # NB: Process.start() actually take some time as it needs to
    922 #     start a process and pass the arguments over via a pipe.
    923 #     Therefore, we only add a worker to self._workers list after
    924 #     it started, so that we do not call .join() if program dies
    925 #     before it starts, and __del__ tries to join but will get:
    926 #     AssertionError: can only join a started process.
--> 927 w.start()
    928 self._index_queues.append(index_queue)
    929 self._workers.append(w)

File ~\.conda\envs\napari-empanada\lib\multiprocessing\process.py:121, in BaseProcess.start(self)
    118 assert not _current_process._config.get('daemon'), \
    119        'daemonic processes are not allowed to have children'
    120 _cleanup()
--> 121 self._popen = self._Popen(self)
    122 self._sentinel = self._popen.sentinel
    123 # Avoid a refcycle if the target function holds an indirect
    124 # reference to the process object (see bpo-30775)

File ~\.conda\envs\napari-empanada\lib\multiprocessing\context.py:224, in Process._Popen(process_obj)
    222 @staticmethod
    223 def _Popen(process_obj):
--> 224     return _default_context.get_context().Process._Popen(process_obj)

File ~\.conda\envs\napari-empanada\lib\multiprocessing\context.py:327, in SpawnProcess._Popen(process_obj)
    324 @staticmethod
    325 def _Popen(process_obj):
    326     from .popen_spawn_win32 import Popen
--> 327     return Popen(process_obj)

File ~\.conda\envs\napari-empanada\lib\multiprocessing\popen_spawn_win32.py:93, in Popen.__init__(self, process_obj)
     91 try:
     92     reduction.dump(prep_data, to_child)
---> 93     reduction.dump(process_obj, to_child)
     94 finally:
     95     set_spawning_popen(None)

File ~\.conda\envs\napari-empanada\lib\multiprocessing\reduction.py:60, in dump(obj, file, protocol)
     58 def dump(obj, file, protocol=None):
     59     '''Replacement for pickle.dump() using ForkingPickler.'''
---> 60     ForkingPickler(file, protocol).dump(obj)

AttributeError: Can't pickle local object 'FactorPad.__init__.<locals>.pad_func'
@GenevieveBuckley
Copy link
Author

I wonder if the problem has something to do with how many processes multiprocessing is spawning. I can get a process name when I investigate the pickling error with %debug, but I'm not seeing much that might help me understand why things are going wrong.

@GenevieveBuckley
Copy link
Author

Update: no, it actually looks as if this is the problem is occurring the first time the validation runs. I've copy-pasted the same directory for both training and validation (mostly because Ryan told me to do that when he showed me how to run the fine tuning earlier).

--> 201             validate(eval_loader, model, criterion, epoch, config)

Variables:

ipdb> eval_loader
<torch.utils.data.dataloader.DataLoader object at 0x000002EF1D594460>
ipdb> criterion
PanopticLoss(
  (mse_loss): HeatmapMSE(
    (mse): MSELoss()
  )
  (l1_loss): OffsetL1(
    (l1): L1Loss()
  )
  (ce_loss): BootstrapCE(
    (bce): BCEWithLogitsLoss()
    (ce): CrossEntropyLoss()
  )
  (pr_loss): PointRendLoss(
    (bce): BCEWithLogitsLoss()
    (ce): CrossEntropyLoss()
  )
)
ipdb> epoch
19
config (click to expand details):
ipdb> config
{'model_name': 'OocyteFinetunedModel', 'TRAIN': {'train_dir': 'H:\\data\\ramaciotti-datasets\\oocyte\\ASV 08-30 Inwon oocyte2\\empanada\\oocyte-training-patches', 'additional_train_dirs': None, 'model_dir': 'H:\\data\\ramaciotti-datasets\\oocyte\\ASV 08-30 Inwon oocyte2\\empanada\\model', 'save_freq': 20, 'finetune_layer': 'none', 'lr_schedule': 'OneCycleLR', 'schedule_params': {'max_lr': 0.003, 'epochs': 100, 'steps_per_epoch': 1, 'pct_start': 0.3}, 'amp': True, 'optimizer': 'AdamW', 'optimizer_params': {'weight_decay': 0.1}, 'print_freq': 50, 'metrics': [{'metric': 'IoU', 'name': 'semantic_iou', 'labels': [1], 'output_key': 'sem_logits', 'target_key': 'sem'}], 'batch_size': 16, 'workers': 4, 'augmentations': [{'scale_limit': [-0.9, 1]}, {'min_height': 256, 'min_width': 256, 'border_mode': 0}, {'height': 256, 'width': 256}, {'limit': 180, 'border_mode': 0}, {'brightness_limit': 0.3, 'contrast_limit': 0.3}, {}, {}], 'epochs': 100}, 'EVAL': {'eval_dir': WindowsPath('H:/data/ramaciotti-datasets/oocyte/ASV 08-30 Inwon oocyte2/empanada/oocyte-training-patches'), 'epochs_per_eval': 20, 'metrics': [{'metric': 'IoU', 'name': 'semantic_iou', 'labels': [1], 'output_key': 'sem_logits', 'target_key': 'sem'}, {'metric': 'PQ', 'name': 'pq', 'labels': [1], 'label_divisor': 1000, 'output_key': 'pan_seg', 'target_key': 'pan_seg'}, {'metric': 'F1', 'name': 'f1_50', 'labels': [1], 'label_divisor': 1000, 'iou_thr': 0.5, 'output_key': 'pan_seg', 'target_key': 'pan_seg'}]}, 'MODEL': {'class_names': {1: 'mito'}, 'labels': [1], 'thing_list': [1], 'model': 'https://www.dropbox.com/s/crp3jhr55ie3d3s/MitoNet_v2.pth?dl=1', 'model_quantized': 'https://www.dropbox.com/s/kpen8o7kbq2qpez/MitoNet_v2_quantized.pth?dl=1', 'padding_factor': 16, 'norms': {'mean': 0.57571, 'std': 0.12765}, 'description': 'MitoNet_v1 was trained on the large CEM-MitoLab dataset and is a generalist for mitochondrial segmentation. The underlying architecture is PanopticDeeplab. This model is fairly large but powerful. If GPU memory is a limitation, try using MitoNet_v1_mini instead. Read the preprint: https://www.biorxiv.org/content/10.1101/2022.03.17.484806\n'}, 'FINETUNE': {'criterion': 'PanopticLoss', 'criterion_params': {'ce_weight': 1, 'l1_weight': 0.01, 'mse_weight': 200, 'pr_weight': 1, 'top_k_percent': 0.2}, 'dataset_class': 'SingleClassInstanceDataset', 'dataset_params': {'weight_gamma': 0.7}, 'engine': 'PanopticDeepLabEngine', 'engine_params': {'confidence_thr': 0.5, 'label_divisor': 1000, 'nms_kernel': 7, 'nms_threshold': 0.1, 'stuff_area': 64, 'thing_list': [1], 'void_label': 0}}, 'device': device(type='cuda', index=0), 'aug_string': 'RandomScale,PadIfNeeded,RandomCrop,Rotate,RandomBrightnessContrast,HorizontalFlip,VerticalFlip', 'start_epoch': 0}
model (click to expand details):
ipdb> model
RecursiveScriptModule(
  original_name=QuantizablePanopticDeepLabPR
  (encoder): RecursiveScriptModule(
    original_name=QuantizableResNet
    (conv1): RecursiveScriptModule(
      original_name=ConvBnReLU2d
      (0): RecursiveScriptModule(original_name=Conv2d)
      (1): RecursiveScriptModule(original_name=BatchNorm2d)
      (2): RecursiveScriptModule(original_name=ReLU)
    )
    (bn1): RecursiveScriptModule(original_name=Identity)
    (relu): RecursiveScriptModule(original_name=Identity)
    (maxpool): RecursiveScriptModule(original_name=MaxPool2d)
    (layer1): RecursiveScriptModule(
      original_name=Sequential
      (0): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (downsample): RecursiveScriptModule(
          original_name=Sequential
          (0): RecursiveScriptModule(
            original_name=ConvBn2d
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=BatchNorm2d)
          )
          (1): RecursiveScriptModule(original_name=Identity)
        )
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
      (1): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
      (2): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
    )
    (layer2): RecursiveScriptModule(
      original_name=Sequential
      (0): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (downsample): RecursiveScriptModule(
          original_name=Sequential
          (0): RecursiveScriptModule(
            original_name=ConvBn2d
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=BatchNorm2d)
          )
          (1): RecursiveScriptModule(original_name=Identity)
        )
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
      (1): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
      (2): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
      (3): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
    )
    (layer3): RecursiveScriptModule(
      original_name=Sequential
      (0): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (downsample): RecursiveScriptModule(
          original_name=Sequential
          (0): RecursiveScriptModule(
            original_name=ConvBn2d
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=BatchNorm2d)
          )
          (1): RecursiveScriptModule(original_name=Identity)
        )
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
      (1): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
      (2): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
      (3): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
      (4): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
      (5): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
    )
    (layer4): RecursiveScriptModule(
      original_name=Sequential
      (0): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (downsample): RecursiveScriptModule(
          original_name=Sequential
          (0): RecursiveScriptModule(
            original_name=ConvBn2d
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=BatchNorm2d)
          )
          (1): RecursiveScriptModule(original_name=Identity)
        )
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
      (1): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
      (2): RecursiveScriptModule(
        original_name=QuantizableBottleneck
        (conv1): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn1): RecursiveScriptModule(original_name=Identity)
        (conv2): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (bn2): RecursiveScriptModule(original_name=Identity)
        (conv3): RecursiveScriptModule(
          original_name=ConvBn2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
        )
        (bn3): RecursiveScriptModule(original_name=Identity)
        (relu): RecursiveScriptModule(original_name=ReLU)
        (skip_add_relu): RecursiveScriptModule(
          original_name=FloatFunctional
          (activation_post_process): RecursiveScriptModule(original_name=Identity)
        )
        (relu1): RecursiveScriptModule(original_name=Identity)
        (relu2): RecursiveScriptModule(original_name=Identity)
      )
    )
  )
  (semantic_decoder): RecursiveScriptModule(
    original_name=QuantizablePanopticDeepLabDecoder
    (aspp): RecursiveScriptModule(
      original_name=ASPP
      (convs): RecursiveScriptModule(
        original_name=ModuleList
        (0): RecursiveScriptModule(
          original_name=Sequential
          (0): RecursiveScriptModule(
            original_name=ConvBnReLU2d
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=BatchNorm2d)
            (2): RecursiveScriptModule(original_name=ReLU)
          )
          (1): RecursiveScriptModule(original_name=Identity)
          (2): RecursiveScriptModule(original_name=Identity)
        )
        (1): RecursiveScriptModule(
          original_name=ASPPConv
          (0): RecursiveScriptModule(
            original_name=ConvBnReLU2d
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=BatchNorm2d)
            (2): RecursiveScriptModule(original_name=ReLU)
          )
          (1): RecursiveScriptModule(original_name=Identity)
          (2): RecursiveScriptModule(original_name=Identity)
        )
        (2): RecursiveScriptModule(
          original_name=ASPPConv
          (0): RecursiveScriptModule(
            original_name=ConvBnReLU2d
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=BatchNorm2d)
            (2): RecursiveScriptModule(original_name=ReLU)
          )
          (1): RecursiveScriptModule(original_name=Identity)
          (2): RecursiveScriptModule(original_name=Identity)
        )
        (3): RecursiveScriptModule(
          original_name=ASPPConv
          (0): RecursiveScriptModule(
            original_name=ConvBnReLU2d
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=BatchNorm2d)
            (2): RecursiveScriptModule(original_name=ReLU)
          )
          (1): RecursiveScriptModule(original_name=Identity)
          (2): RecursiveScriptModule(original_name=Identity)
        )
        (4): RecursiveScriptModule(
          original_name=ASPPPooling
          (aspp_pooling): RecursiveScriptModule(
            original_name=Sequential
            (0): RecursiveScriptModule(original_name=AdaptiveAvgPool2d)
            (1): RecursiveScriptModule(
              original_name=ConvReLU2d
              (0): RecursiveScriptModule(original_name=Conv2d)
              (1): RecursiveScriptModule(original_name=ReLU)
            )
            (2): RecursiveScriptModule(original_name=Identity)
          )
        )
      )
      (project): RecursiveScriptModule(
        original_name=Sequential
        (0): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (1): RecursiveScriptModule(original_name=Identity)
        (2): RecursiveScriptModule(original_name=Identity)
        (3): RecursiveScriptModule(original_name=Dropout)
      )
    )
    (project): RecursiveScriptModule(
      original_name=ModuleList
      (0): RecursiveScriptModule(
        original_name=Sequential
        (0): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (1): RecursiveScriptModule(original_name=Identity)
        (2): RecursiveScriptModule(original_name=Identity)
      )
    )
    (fuse): RecursiveScriptModule(
      original_name=ModuleList
      (0): RecursiveScriptModule(
        original_name=Sequential
        (0): RecursiveScriptModule(
          original_name=SeparableConv2d
          (sepconv): RecursiveScriptModule(
            original_name=Sequential
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=Conv2d)
          )
        )
        (1): RecursiveScriptModule(original_name=BatchNorm2d)
        (2): RecursiveScriptModule(original_name=ReLU)
      )
    )
  )
  (instance_decoder): RecursiveScriptModule(
    original_name=QuantizablePanopticDeepLabDecoder
    (aspp): RecursiveScriptModule(
      original_name=ASPP
      (convs): RecursiveScriptModule(
        original_name=ModuleList
        (0): RecursiveScriptModule(
          original_name=Sequential
          (0): RecursiveScriptModule(
            original_name=ConvBnReLU2d
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=BatchNorm2d)
            (2): RecursiveScriptModule(original_name=ReLU)
          )
          (1): RecursiveScriptModule(original_name=Identity)
          (2): RecursiveScriptModule(original_name=Identity)
        )
        (1): RecursiveScriptModule(
          original_name=ASPPConv
          (0): RecursiveScriptModule(
            original_name=ConvBnReLU2d
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=BatchNorm2d)
            (2): RecursiveScriptModule(original_name=ReLU)
          )
          (1): RecursiveScriptModule(original_name=Identity)
          (2): RecursiveScriptModule(original_name=Identity)
        )
        (2): RecursiveScriptModule(
          original_name=ASPPConv
          (0): RecursiveScriptModule(
            original_name=ConvBnReLU2d
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=BatchNorm2d)
            (2): RecursiveScriptModule(original_name=ReLU)
          )
          (1): RecursiveScriptModule(original_name=Identity)
          (2): RecursiveScriptModule(original_name=Identity)
        )
        (3): RecursiveScriptModule(
          original_name=ASPPConv
          (0): RecursiveScriptModule(
            original_name=ConvBnReLU2d
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=BatchNorm2d)
            (2): RecursiveScriptModule(original_name=ReLU)
          )
          (1): RecursiveScriptModule(original_name=Identity)
          (2): RecursiveScriptModule(original_name=Identity)
        )
        (4): RecursiveScriptModule(
          original_name=ASPPPooling
          (aspp_pooling): RecursiveScriptModule(
            original_name=Sequential
            (0): RecursiveScriptModule(original_name=AdaptiveAvgPool2d)
            (1): RecursiveScriptModule(
              original_name=ConvReLU2d
              (0): RecursiveScriptModule(original_name=Conv2d)
              (1): RecursiveScriptModule(original_name=ReLU)
            )
            (2): RecursiveScriptModule(original_name=Identity)
          )
        )
      )
      (project): RecursiveScriptModule(
        original_name=Sequential
        (0): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (1): RecursiveScriptModule(original_name=Identity)
        (2): RecursiveScriptModule(original_name=Identity)
        (3): RecursiveScriptModule(original_name=Dropout)
      )
    )
    (project): RecursiveScriptModule(
      original_name=ModuleList
      (0): RecursiveScriptModule(
        original_name=Sequential
        (0): RecursiveScriptModule(
          original_name=ConvBnReLU2d
          (0): RecursiveScriptModule(original_name=Conv2d)
          (1): RecursiveScriptModule(original_name=BatchNorm2d)
          (2): RecursiveScriptModule(original_name=ReLU)
        )
        (1): RecursiveScriptModule(original_name=Identity)
        (2): RecursiveScriptModule(original_name=Identity)
      )
    )
    (fuse): RecursiveScriptModule(
      original_name=ModuleList
      (0): RecursiveScriptModule(
        original_name=Sequential
        (0): RecursiveScriptModule(
          original_name=SeparableConv2d
          (sepconv): RecursiveScriptModule(
            original_name=Sequential
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=Conv2d)
          )
        )
        (1): RecursiveScriptModule(original_name=BatchNorm2d)
        (2): RecursiveScriptModule(original_name=ReLU)
      )
    )
  )
  (semantic_head): RecursiveScriptModule(
    original_name=PanopticDeepLabHead
    (head): RecursiveScriptModule(
      original_name=Sequential
      (0): RecursiveScriptModule(
        original_name=Sequential
        (0): RecursiveScriptModule(
          original_name=SeparableConv2d
          (sepconv): RecursiveScriptModule(
            original_name=Sequential
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=Conv2d)
          )
        )
        (1): RecursiveScriptModule(original_name=BatchNorm2d)
        (2): RecursiveScriptModule(original_name=ReLU)
      )
      (1): RecursiveScriptModule(original_name=Conv2d)
    )
  )
  (ins_center): RecursiveScriptModule(
    original_name=PanopticDeepLabHead
    (head): RecursiveScriptModule(
      original_name=Sequential
      (0): RecursiveScriptModule(
        original_name=Sequential
        (0): RecursiveScriptModule(
          original_name=SeparableConv2d
          (sepconv): RecursiveScriptModule(
            original_name=Sequential
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=Conv2d)
          )
        )
        (1): RecursiveScriptModule(original_name=BatchNorm2d)
        (2): RecursiveScriptModule(original_name=ReLU)
      )
      (1): RecursiveScriptModule(original_name=Conv2d)
    )
  )
  (ins_xy): RecursiveScriptModule(
    original_name=PanopticDeepLabHead
    (head): RecursiveScriptModule(
      original_name=Sequential
      (0): RecursiveScriptModule(
        original_name=Sequential
        (0): RecursiveScriptModule(
          original_name=SeparableConv2d
          (sepconv): RecursiveScriptModule(
            original_name=Sequential
            (0): RecursiveScriptModule(original_name=Conv2d)
            (1): RecursiveScriptModule(original_name=Conv2d)
          )
        )
        (1): RecursiveScriptModule(original_name=BatchNorm2d)
        (2): RecursiveScriptModule(original_name=ReLU)
      )
      (1): RecursiveScriptModule(original_name=Conv2d)
    )
  )
  (interpolate): RecursiveScriptModule(original_name=Interpolate2d)
  (quant): RecursiveScriptModule(original_name=Identity)
  (dequant): RecursiveScriptModule(original_name=Identity)
  (semantic_pr): RecursiveScriptModule(
    original_name=QuantizablePointRendSemSegHead
    (point_head): RecursiveScriptModule(
      original_name=StandardPointHead
      (fc_layers): RecursiveScriptModule(
        original_name=ModuleList
        (0): RecursiveScriptModule(
          original_name=Sequential
          (0): RecursiveScriptModule(
            original_name=ConvReLU1d
            (0): RecursiveScriptModule(original_name=Conv1d)
            (1): RecursiveScriptModule(original_name=ReLU)
          )
          (1): RecursiveScriptModule(original_name=Identity)
        )
        (1): RecursiveScriptModule(
          original_name=Sequential
          (0): RecursiveScriptModule(
            original_name=ConvReLU1d
            (0): RecursiveScriptModule(original_name=Conv1d)
            (1): RecursiveScriptModule(original_name=ReLU)
          )
          (1): RecursiveScriptModule(original_name=Identity)
        )
        (2): RecursiveScriptModule(
          original_name=Sequential
          (0): RecursiveScriptModule(
            original_name=ConvReLU1d
            (0): RecursiveScriptModule(original_name=Conv1d)
            (1): RecursiveScriptModule(original_name=ReLU)
          )
          (1): RecursiveScriptModule(original_name=Identity)
        )
      )
      (predictor): RecursiveScriptModule(original_name=Conv1d)
    )
    (interpolate): RecursiveScriptModule(original_name=Interpolate2d)
    (quant): RecursiveScriptModule(original_name=Identity)
    (dequant): RecursiveScriptModule(original_name=Identity)
  )
)

@GenevieveBuckley GenevieveBuckley changed the title Error when fine-tuning a model (pickle error at epoch 19) Error at validation step when fine-tuning a model Jul 7, 2022
@GenevieveBuckley
Copy link
Author

I've left the validation directory GUI field empty, and it now seems to be running without hitting the error.

@conradry
Copy link
Contributor

conradry commented Jul 11, 2022

Hi Genevieve,

I think the error message is exactly right:

AttributeError: Can't pickle local object 'FactorPad.__init__.<locals>.pad_func'

The FactorPad transform, defined here, uses a closure that doesn't play nice with pickling. I'm not sure how I've never run into this issue on any of the Mac, Linux, and Windows systems I've tested the plugin on. I've confirmed that refactoring the transform enables pickling.

My guess is that everything will work if you replace the FactorPad function in source with:

class FactorPad(A.Lambda):
        def __init__(self, factor=128):
            super().__init__(image=self.pad_func, mask=self.pad_func)
            self.factor = factor

        def pad_func(self, x, **kwargs):
            return factor_pad(x, factor=self.factor)

I'll release this fix in the next version of empanada. In the meantime another valid work around is to use a custom config to disable multiprocessing. E.g., download this finetuning config file, set workers to 0, point the "Custom config" field in the plugin to this modified config file and run.

P.S. It looks like the model was running on GPU so I'm not sure why you didn't see utilization increase. "Using CPU for training" gets printed to terminal if a GPU isn't being used. I suppose an equivalent "Using GPU for training" statement would be nice.

@GenevieveBuckley
Copy link
Author

Ok, I'll try that workaround.

"Using CPU for training" gets printed to terminal if a GPU isn't being used. I suppose an equivalent "Using GPU for training" statement would be nice.

👍 Yes, that'd be good to have

@conradry
Copy link
Contributor

Upgrading to empanada-dl v1.6.0 and empanada-napari v0.2.1 should fix this issue.

@GenevieveBuckley
Copy link
Author

That's great, thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants