def resnet_preprocessor_graph(cls, mode: str) -> SensorPreprocessorGraph: def create_resnet_builder(in_uuid: str, out_uuid: str): return ResNetPreprocessor( input_height=cls.THOR_CONTROLLER_KWARGS["height"], input_width=cls.THOR_CONTROLLER_KWARGS["width"], output_width=7, output_height=7, output_dims=512, pool=False, torchvision_resnet_model=torchvision.models.resnet18, input_uuids=[in_uuid], output_uuid=out_uuid, ) img_uuids = [cls.EGOCENTRIC_RGB_UUID, cls.UNSHUFFLED_RGB_UUID] return SensorPreprocessorGraph( source_observation_spaces=SensorSuite([ sensor for sensor in cls.SENSORS if (mode == "train" or not isinstance(sensor, ExpertActionSensor)) ]).observation_spaces, preprocessors=[ create_resnet_builder(sid, f"{sid}_resnet") for sid in img_uuids ], )
def machine_params(self, mode="train", **kwargs): if mode == "train": workers_per_device = 1 gpu_ids = ([] if not torch.cuda.is_available() else self.TRAINING_GPUS * workers_per_device) nprocesses = (1 if not torch.cuda.is_available() else evenly_distribute_count_into_bins( self.NUM_PROCESSES, len(gpu_ids))) elif mode == "valid": nprocesses = 1 gpu_ids = [] if not torch.cuda.is_available( ) else self.VALIDATION_GPUS elif mode == "test": nprocesses = 1 gpu_ids = [] if not torch.cuda.is_available( ) else self.TESTING_GPUS else: raise NotImplementedError( "mode must be 'train', 'valid', or 'test'.") sensor_preprocessor_graph = (SensorPreprocessorGraph( source_observation_spaces=SensorSuite( self.SENSORS).observation_spaces, preprocessors=self.PREPROCESSORS, ) if mode == "train" or ( (isinstance(nprocesses, int) and nprocesses > 0) or (isinstance(nprocesses, Sequence) and sum(nprocesses) > 0)) else None) return MachineParams( nprocesses=nprocesses, devices=gpu_ids, sensor_preprocessor_graph=sensor_preprocessor_graph, )
def resnet_preprocessor_graph(cls, mode: str) -> SensorPreprocessorGraph: def create_resnet_builder(in_uuid: str, out_uuid: str): cnn_type, pretraining_type = cls.CNN_PREPROCESSOR_TYPE_AND_PRETRAINING if pretraining_type == "imagenet": assert cnn_type in [ "RN18", "RN50", ], "Only allow using RN18/RN50 with `imagenet` pretrained weights." return ResNetPreprocessor( input_height=cls.THOR_CONTROLLER_KWARGS["height"], input_width=cls.THOR_CONTROLLER_KWARGS["width"], output_width=7, output_height=7, output_dims=512 if "18" in cnn_type else 2048, pool=False, torchvision_resnet_model=getattr( torchvision.models, f"resnet{cnn_type.replace('RN', '')}"), input_uuids=[in_uuid], output_uuid=out_uuid, ) elif pretraining_type == "clip": from allenact_plugins.clip_plugin.clip_preprocessors import ( ClipResNetPreprocessor, ) import clip # Let's make sure we download the clip model now # so we don't download it on every spawned process clip.load(cnn_type, "cpu") return ClipResNetPreprocessor( rgb_input_uuid=in_uuid, clip_model_type=cnn_type, pool=False, output_uuid=out_uuid, ) else: raise NotImplementedError img_uuids = [cls.EGOCENTRIC_RGB_UUID, cls.UNSHUFFLED_RGB_UUID] return SensorPreprocessorGraph( source_observation_spaces=SensorSuite([ sensor for sensor in cls.sensors() if (mode == "train" or not isinstance(sensor, ExpertActionSensor)) ]).observation_spaces, preprocessors=[ create_resnet_builder(sid, f"{sid}_resnet") for sid in img_uuids ], )
def machine_params(self, mode="train", **kwargs): sampler_devices: Sequence[int] = [] if mode == "train": workers_per_device = 1 gpu_ids = ( [] if not torch.cuda.is_available() else self.TRAIN_GPU_IDS * workers_per_device ) nprocesses = ( 1 if not torch.cuda.is_available() else evenly_distribute_count_into_bins(self.NUM_PROCESSES, len(gpu_ids)) ) sampler_devices = self.SAMPLER_GPU_IDS elif mode == "valid": nprocesses = 1 gpu_ids = [] if not torch.cuda.is_available() else self.VALID_GPU_IDS elif mode == "test": nprocesses = 5 if torch.cuda.is_available() else 1 gpu_ids = [] if not torch.cuda.is_available() else self.TEST_GPU_IDS else: raise NotImplementedError("mode must be 'train', 'valid', or 'test'.") sensors = [*self.SENSORS] if mode != "train": sensors = [s for s in sensors if not isinstance(s, ExpertActionSensor)] sensor_preprocessor_graph = ( SensorPreprocessorGraph( source_observation_spaces=SensorSuite(sensors).observation_spaces, preprocessors=self.preprocessors(), ) if mode == "train" or ( (isinstance(nprocesses, int) and nprocesses > 0) or (isinstance(nprocesses, Sequence) and sum(nprocesses) > 0) ) else None ) return MachineParams( nprocesses=nprocesses, devices=gpu_ids, sampler_devices=sampler_devices if mode == "train" else gpu_ids, # ignored with > 1 gpu_ids sensor_preprocessor_graph=sensor_preprocessor_graph, )
def machine_params(self, mode="train", **kwargs): sampler_devices: Sequence[torch.device] = [] devices: Sequence[torch.device] if mode == "train": workers_per_device = 1 devices = ([torch.device("cpu")] if not torch.cuda.is_available() else cast(Tuple, self.train_gpu_ids) * workers_per_device) nprocesses = evenly_distribute_count_into_bins( self.num_train_processes, max(len(devices), 1)) sampler_devices = self.sampler_devices elif mode == "valid": nprocesses = 1 devices = ([torch.device("cpu")] if not torch.cuda.is_available() else self.val_gpu_ids) elif mode == "test": nprocesses = 10 if torch.cuda.is_available() else 1 devices = ([torch.device("cpu")] if not torch.cuda.is_available() else self.test_gpu_ids) else: raise NotImplementedError( "mode must be 'train', 'valid', or 'test'.") sensors = [*self.SENSORS] if mode != "train": sensors = [ s for s in sensors if not isinstance(s, ExpertActionSensor) ] sensor_preprocessor_graph = (SensorPreprocessorGraph( source_observation_spaces=SensorSuite(sensors).observation_spaces, preprocessors=self.preprocessors(), ) if mode == "train" or ( (isinstance(nprocesses, int) and nprocesses > 0) or (isinstance(nprocesses, Sequence) and sum(nprocesses) > 0)) else None) return MachineParams( nprocesses=nprocesses, devices=devices, sampler_devices=sampler_devices if mode == "train" else devices, # ignored with > 1 gpu_ids sensor_preprocessor_graph=sensor_preprocessor_graph, )
def machine_params(self, mode="train", **kwargs): sampler_devices: Sequence[int] = [] if mode == "train": workers_per_device = 1 gpu_ids = ([] if not torch.cuda.is_available() else self.TRAIN_GPU_IDS * workers_per_device) nprocesses = (1 if not torch.cuda.is_available() else self.split_num_processes(len(gpu_ids))) sampler_devices = self.TRAIN_GPU_IDS elif mode == "valid": nprocesses = 1 gpu_ids = [] if not torch.cuda.is_available( ) else self.VALID_GPU_IDS elif mode == "test": nprocesses = 7 gpu_ids = [] if not torch.cuda.is_available( ) else self.TEST_GPU_IDS else: raise NotImplementedError( "mode must be 'train', 'valid', or 'test'.") # Disable parallelization for validation process if mode == "valid": for prep in self.PREPROCESSORS: prep.kwargs["parallel"] = False sensor_preprocessor_graph = (SensorPreprocessorGraph( source_observation_spaces=SensorSuite( self.SENSORS).observation_spaces, preprocessors=self.PREPROCESSORS, ) if mode == "train" or ( (isinstance(nprocesses, int) and nprocesses > 0) or (isinstance(nprocesses, Sequence) and sum(nprocesses) > 0)) else None) return MachineParams( nprocesses=nprocesses, devices=gpu_ids, sampler_devices=sampler_devices if mode == "train" else gpu_ids, # ignored with > 1 gpu_ids sensor_preprocessor_graph=sensor_preprocessor_graph, )