@ptrblck
after line by line elimination test, finally found out the root causes that make the SSD() not deepcopyable:

class SSD(nn.Module):
def init(self, num_classes: int, base_net: nn.ModuleList, source_layer_indexes: List[int],
extras: nn.ModuleList, classification_headers: nn.ModuleList,
regression_headers: nn.ModuleList, is_test=False, config=None, device=None):
“”“Compose a SSD model using the given components.
“””
super(SSD, self).init()
    self.num_classes = num_classes
    self.base_net = base_net
    self.source_layer_indexes = source_layer_indexes
    self.extras = extras
    self.classification_headers = classification_headers
    self.regression_headers = regression_headers
    self.is_test = is_test
    self.config = config  


If I comment out the “self.config = config” line, then SSD() is deepcopyable.
Where the config is a module imported from:

from .config import squeezenet_ssd_config as config

And the squeezenet_ssd_config is as below:

import numpy as np
from vision.utils.box_utils import SSDSpec, SSDBoxSizes, generate_ssd_priors
image_size = 300
image_mean = np.array([127, 127, 127])  # RGB layout
image_std = 128.0
iou_threshold = 0.45
center_variance = 0.1
size_variance = 0.2
specs = [
SSDSpec(17, 16, SSDBoxSizes(60, 105), [2, 3]),
SSDSpec(10, 32, SSDBoxSizes(105, 150), [2, 3]),
SSDSpec(5, 64, SSDBoxSizes(150, 195), [2, 3]),
SSDSpec(3, 100, SSDBoxSizes(195, 240), [2, 3]),
SSDSpec(2, 150, SSDBoxSizes(240, 285), [2, 3]),
SSDSpec(1, 300, SSDBoxSizes(285, 330), [2, 3])
]
priors = generate_ssd_priors(specs, image_size)

How should I modify the code to keep the “config” and still make the SSD() deepcopyable? Any advice will be highly appreciated.
Thanks a lot for your help in advanced.