def _set_comet_experiment(configuration, config_key): experiment = OfflineExperiment( project_name='general', workspace='benjaminbenoit', offline_directory="../damic_comet_experiences") experiment.set_name(config_key) experiment.log_parameters(configuration) return experiment
verbose = 10, n_jobs = 2, n_points = 2, scoring = 'accuracy', ) checkpoint_callback = skopt.callbacks.CheckpointSaver(f'D:\\FINKI\\8_dps\\Project\\MODELS\\skopt_checkpoints\\{EXPERIMENT_ID}.pkl') hyperparameters_optimizer.fit(X_train, y_train, callback = [checkpoint_callback]) skopt.dump(hyperparameters_optimizer, f'saved_models\\{EXPERIMENT_ID}.pkl') y_pred = hyperparameters_optimizer.best_estimator_.predict(X_test) for i in range(len(hyperparameters_optimizer.cv_results_['params'])): exp = OfflineExperiment( api_key = 'A8Lg71j9LtIrsv0deBA0DVGcR', project_name = ALGORITHM, workspace = "8_dps", auto_output_logging = 'native', offline_directory = f'D:\\FINKI\\8_dps\\Project\\MODELS\\comet_ml_offline_experiments\\{EXPERIMENT_ID}' ) exp.set_name(f'{EXPERIMENT_ID}_{i + 1}') exp.add_tags([DS, SEGMENTS_LENGTH, ]) for k, v in hyperparameters_optimizer.cv_results_.items(): if k == "params": exp.log_parameters(dict(v[i])) else: exp.log_metric(k, v[i]) exp.end()
class CometLogger(LightningLoggerBase): r""" Log using `Comet.ml <https://www.comet.ml>`_. Install it with pip: .. code-block:: bash pip install comet-ml Comet requires either an API Key (online mode) or a local directory path (offline mode). **ONLINE MODE** .. code-block:: python import os from pytorch_lightning import Trainer from pytorch_lightning.loggers import CometLogger # arguments made to CometLogger are passed on to the comet_ml.Experiment class comet_logger = CometLogger( api_key=os.environ.get('COMET_API_KEY'), workspace=os.environ.get('COMET_WORKSPACE'), # Optional save_dir='.', # Optional project_name='default_project', # Optional rest_api_key=os.environ.get('COMET_REST_API_KEY'), # Optional experiment_name='default' # Optional ) trainer = Trainer(logger=comet_logger) **OFFLINE MODE** .. code-block:: python from pytorch_lightning.loggers import CometLogger # arguments made to CometLogger are passed on to the comet_ml.Experiment class comet_logger = CometLogger( save_dir='.', workspace=os.environ.get('COMET_WORKSPACE'), # Optional project_name='default_project', # Optional rest_api_key=os.environ.get('COMET_REST_API_KEY'), # Optional experiment_name='default' # Optional ) trainer = Trainer(logger=comet_logger) Args: api_key: Required in online mode. API key, found on Comet.ml. If not given, this will be loaded from the environment variable COMET_API_KEY or ~/.comet.config if either exists. save_dir: Required in offline mode. The path for the directory to save local comet logs. If given, this also sets the directory for saving checkpoints. project_name: Optional. Send your experiment to a specific project. Otherwise will be sent to Uncategorized Experiments. If the project name does not already exist, Comet.ml will create a new project. rest_api_key: Optional. Rest API key found in Comet.ml settings. This is used to determine version number experiment_name: Optional. String representing the name for this particular experiment on Comet.ml. experiment_key: Optional. If set, restores from existing experiment. offline: If api_key and save_dir are both given, this determines whether the experiment will be in online or offline mode. This is useful if you use save_dir to control the checkpoints directory and have a ~/.comet.config file but still want to run offline experiments. \**kwargs: Additional arguments like `workspace`, `log_code`, etc. used by :class:`CometExperiment` can be passed as keyword arguments in this logger. """ def __init__(self, api_key: Optional[str] = None, save_dir: Optional[str] = None, project_name: Optional[str] = None, rest_api_key: Optional[str] = None, experiment_name: Optional[str] = None, experiment_key: Optional[str] = None, offline: bool = False, **kwargs): if comet_ml is None: raise ImportError( "You want to use `comet_ml` logger which is not installed yet," " install it with `pip install comet-ml`.") super().__init__() self._experiment = None # Determine online or offline mode based on which arguments were passed to CometLogger api_key = api_key or comet_ml.config.get_api_key( None, comet_ml.config.get_config()) if api_key is not None and save_dir is not None: self.mode = "offline" if offline else "online" self.api_key = api_key self._save_dir = save_dir elif api_key is not None: self.mode = "online" self.api_key = api_key self._save_dir = None elif save_dir is not None: self.mode = "offline" self._save_dir = save_dir else: # If neither api_key nor save_dir are passed as arguments, raise an exception raise MisconfigurationException( "CometLogger requires either api_key or save_dir during initialization." ) log.info(f"CometLogger will be initialized in {self.mode} mode") self._project_name = project_name self._experiment_key = experiment_key self._experiment_name = experiment_name self._kwargs = kwargs self._future_experiment_key = None if rest_api_key is not None: # Comet.ml rest API, used to determine version number self.rest_api_key = rest_api_key self.comet_api = API(self.rest_api_key) else: self.rest_api_key = None self.comet_api = None self._kwargs = kwargs @property @rank_zero_experiment def experiment(self): r""" Actual Comet object. To use Comet features in your :class:`~pytorch_lightning.core.lightning.LightningModule` do the following. Example:: self.logger.experiment.some_comet_function() """ if self._experiment is not None: return self._experiment if self._future_experiment_key is not None: os.environ["COMET_EXPERIMENT_KEY"] = self._future_experiment_key self._future_experiment_key = None try: if self.mode == "online": if self._experiment_key is None: self._experiment = CometExperiment( api_key=self.api_key, project_name=self._project_name, **self._kwargs, ) self._experiment_key = self._experiment.get_key() else: self._experiment = CometExistingExperiment( api_key=self.api_key, project_name=self._project_name, previous_experiment=self._experiment_key, **self._kwargs, ) else: self._experiment = CometOfflineExperiment( offline_directory=self.save_dir, project_name=self._project_name, **self._kwargs, ) finally: os.environ.pop("COMET_EXPERIMENT_KEY", None) if self._experiment_name: self._experiment.set_name(self._experiment_name) return self._experiment @rank_zero_only def log_hyperparams(self, params: Union[Dict[str, Any], Namespace]) -> None: params = self._convert_params(params) params = self._flatten_dict(params) self.experiment.log_parameters(params) @rank_zero_only def log_metrics(self, metrics: Dict[str, Union[torch.Tensor, float]], step: Optional[int] = None) -> None: assert rank_zero_only.rank == 0, "experiment tried to log from global_rank != 0" # Comet.ml expects metrics to be a dictionary of detached tensors on CPU for key, val in metrics.items(): if is_tensor(val): metrics[key] = val.cpu().detach() metrics_without_epoch = metrics.copy() epoch = metrics_without_epoch.pop('epoch', None) self.experiment.log_metrics(metrics_without_epoch, step=step, epoch=epoch) def reset_experiment(self): self._experiment = None @rank_zero_only def finalize(self, status: str) -> None: r""" When calling ``self.experiment.end()``, that experiment won't log any more data to Comet. That's why, if you need to log any more data, you need to create an ExistingCometExperiment. For example, to log data when testing your model after training, because when training is finalized :meth:`CometLogger.finalize` is called. This happens automatically in the :meth:`~CometLogger.experiment` property, when ``self._experiment`` is set to ``None``, i.e. ``self.reset_experiment()``. """ self.experiment.end() self.reset_experiment() @property def save_dir(self) -> Optional[str]: return self._save_dir @property def name(self) -> str: # Don't create an experiment if we don't have one if self._experiment is not None and self._experiment.project_name is not None: return self._experiment.project_name if self._project_name is not None: return self._project_name return "comet-default" @property def version(self) -> str: # Don't create an experiment if we don't have one if self._experiment is not None: return self._experiment.id if self._experiment_key is not None: return self._experiment_key if self._future_experiment_key is not None: return self._future_experiment_key # Pre-generate an experiment key self._future_experiment_key = comet_ml.generate_guid() return self._future_experiment_key def __getstate__(self): state = self.__dict__.copy() # Save the experiment id in case an experiment object already exists, # this way we could create an ExistingExperiment pointing to the same # experiment state[ "_experiment_key"] = self._experiment.id if self._experiment is not None else None # Remove the experiment object as it contains hard to pickle objects # (like network connections), the experiment object will be recreated if # needed later state["_experiment"] = None return state
def main(args): torch.manual_seed(0) # Get device device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') # Get dataset dataset = Dataset("train.txt") loader = DataLoader(dataset, batch_size=hp.batch_size**2, shuffle=True, collate_fn=dataset.collate_fn, drop_last=True, num_workers=hp.num_workers) speaker_encoder = None if hp.speaker_encoder_path != "": speaker_encoder = load_speaker_encoder(Path(hp.speaker_encoder_path), device).to(device) for param in speaker_encoder.parameters(): param.requires_grad = False else: speaker_encoder.train() # Define model fastspeech_model = FastSpeech2(speaker_encoder).to(device) model = nn.DataParallel(fastspeech_model).to(device) print("Model Has Been Defined") num_param = utils.get_param_num(model) print('Number of FastSpeech2 Parameters:', num_param) # Optimizer and loss optimizer = torch.optim.Adam(model.parameters(), lr=1e-4, betas=hp.betas, eps=hp.eps, weight_decay=hp.weight_decay) scheduled_optim = ScheduledOptim(optimizer, hp.decoder_hidden, hp.n_warm_up_step, args.restore_step) Loss = FastSpeech2Loss().to(device) print("Optimizer and Loss Function Defined.") # Load checkpoint if exists checkpoint_path = os.path.join(hp.checkpoint_path) try: checkpoint = torch.load( os.path.join(checkpoint_path, 'checkpoint_{}.pth.tar'.format(args.restore_step))) model.load_state_dict(checkpoint['model']) optimizer.load_state_dict(checkpoint['optimizer']) print("\n---Model Restored at Step {}---\n".format(args.restore_step)) except: print("\n---Start New Training---\n") if not os.path.exists(checkpoint_path): os.makedirs(checkpoint_path) # Load vocoder if hp.vocoder == 'melgan': vocoder = utils.get_melgan() vocoder_infer = utils.melgan_infer elif hp.vocoder == 'waveglow': vocoder = utils.get_waveglow() vocoder_infer = utils.waveglow_infer else: raise ValueError("Vocoder '%s' is not supported", hp.vocoder) comet_experiment = None use_comet = int(os.getenv("USE_COMET", default=0)) if use_comet != 0: if use_comet == 1: offline_dir = os.path.join(hp.models_path, "comet") os.makedirs(offline_dir, exist_ok=True) comet_experiment = OfflineExperiment( project_name="mlp-project", workspace="ino-voice", offline_directory=offline_dir, ) elif use_comet == 2: comet_experiment = Experiment( api_key="BtyTwUoagGMh3uN4VZt6gMOn8", project_name="mlp-project", workspace="ino-voice", ) comet_experiment.set_name(args.experiment_name) comet_experiment.log_parameters(hp) comet_experiment.log_html(args.m) start_time = time.perf_counter() first_mel_train_loss, first_postnet_train_loss, first_d_train_loss, first_f_train_loss, first_e_train_loss = \ None, None, None, None, None for epoch in range(hp.epochs): total_step = hp.epochs * len(loader) * hp.batch_size for i, batchs in enumerate(loader): for j, data_of_batch in enumerate(batchs): model = model.train() current_step = i * hp.batch_size + j + args.restore_step + epoch * len( loader) * hp.batch_size + 1 # Get Data text = torch.from_numpy( data_of_batch["text"]).long().to(device) mel_target = torch.from_numpy( data_of_batch["mel_target"]).float().to(device) D = torch.from_numpy(data_of_batch["D"]).long().to(device) log_D = torch.from_numpy( data_of_batch["log_D"]).float().to(device) f0 = torch.from_numpy(data_of_batch["f0"]).float().to(device) energy = torch.from_numpy( data_of_batch["energy"]).float().to(device) src_len = torch.from_numpy( data_of_batch["src_len"]).long().to(device) mel_len = torch.from_numpy( data_of_batch["mel_len"]).long().to(device) max_src_len = np.max(data_of_batch["src_len"]).astype(np.int32) max_mel_len = np.max(data_of_batch["mel_len"]).astype(np.int32) # text = torch.from_numpy(data_of_batch["text"]).long() # mel_target = torch.from_numpy(data_of_batch["mel_target"]).float() # D = torch.from_numpy(data_of_batch["D"]).long() # log_D = torch.from_numpy(data_of_batch["log_D"]).float() # f0 = torch.from_numpy(data_of_batch["f0"]).float() # energy = torch.from_numpy(data_of_batch["energy"]).float() # src_len = torch.from_numpy(data_of_batch["src_len"]).long() # mel_len = torch.from_numpy(data_of_batch["mel_len"]).long() # max_src_len = np.max(data_of_batch["src_len"]).astype(np.int32) # max_mel_len = np.max(data_of_batch["mel_len"]).astype(np.int32) # Forward mel_output, mel_postnet_output, log_duration_output, f0_output, energy_output, src_mask, mel_mask, _ = \ model(text, src_len, mel_target, mel_len, D, f0, energy, max_src_len, max_mel_len) # Cal Loss mel_loss, mel_postnet_loss, d_loss, f_loss, e_loss = Loss( log_duration_output, log_D, f0_output, f0, energy_output, energy, mel_output, mel_postnet_output, mel_target, ~src_mask, ~mel_mask) total_loss = mel_loss + mel_postnet_loss + d_loss + f_loss + e_loss # Set initial values for scaling if first_mel_train_loss is None: first_mel_train_loss = mel_loss first_postnet_train_loss = mel_postnet_loss first_d_train_loss = d_loss first_f_train_loss = f_loss first_e_train_loss = e_loss mel_l = mel_loss.item() / first_mel_train_loss mel_postnet_l = mel_postnet_loss.item( ) / first_postnet_train_loss d_l = d_loss.item() / first_d_train_loss f_l = f_loss.item() / first_f_train_loss e_l = e_loss.item() / first_e_train_loss # Logger if comet_experiment is not None: comet_experiment.log_metric( "total_loss", mel_l + mel_postnet_l + d_l + f_l + e_l, current_step) comet_experiment.log_metric("mel_loss", mel_l, current_step) comet_experiment.log_metric("mel_postnet_loss", mel_postnet_l, current_step) comet_experiment.log_metric("duration_loss", d_l, current_step) comet_experiment.log_metric("f0_loss", f_l, current_step) comet_experiment.log_metric("energy_loss", e_l, current_step) # Backward total_loss = total_loss / hp.acc_steps total_loss.backward() if current_step % hp.acc_steps != 0: continue # Clipping gradients to avoid gradient explosion nn.utils.clip_grad_norm_(model.parameters(), hp.grad_clip_thresh) # Update weights scheduled_optim.step_and_update_lr() scheduled_optim.zero_grad() # Print if current_step % hp.log_step == 0: now = time.perf_counter() print("\nEpoch [{}/{}], Step [{}/{}]:".format( epoch + 1, hp.epochs, current_step, total_step)) print( "Total Loss: {:.4f}, Mel Loss: {:.5f}, Mel PostNet Loss: {:.5f}, Duration Loss: {:.5f}, " "F0 Loss: {:.5f}, Energy Loss: {:.5f};".format( mel_l + mel_postnet_l + d_l + f_l + e_l, mel_l, mel_postnet_l, d_l, f_l, e_l)) print("Time Used: {:.3f}s".format(now - start_time)) start_time = now if current_step % hp.checkpoint == 0: file_path = os.path.join( checkpoint_path, 'checkpoint_{}.pth.tar'.format(current_step)) torch.save( { 'model': model.state_dict(), 'optimizer': optimizer.state_dict() }, file_path) print("saving model at to {}".format(file_path)) if current_step % hp.synth_step == 0: length = mel_len[0].item() mel_target_torch = mel_target[ 0, :length].detach().unsqueeze(0).transpose(1, 2) mel_target = mel_target[ 0, :length].detach().cpu().transpose(0, 1) mel_torch = mel_output[0, :length].detach().unsqueeze( 0).transpose(1, 2) mel = mel_output[0, :length].detach().cpu().transpose(0, 1) mel_postnet_torch = mel_postnet_output[ 0, :length].detach().unsqueeze(0).transpose(1, 2) mel_postnet = mel_postnet_output[ 0, :length].detach().cpu().transpose(0, 1) if comet_experiment is not None: comet_experiment.log_audio( audiotools.inv_mel_spec(mel), hp.sampling_rate, "step_{}_griffin_lim.wav".format(current_step)) comet_experiment.log_audio( audiotools.inv_mel_spec(mel_postnet), hp.sampling_rate, "step_{}_postnet_griffin_lim.wav".format( current_step)) comet_experiment.log_audio( vocoder_infer(mel_torch, vocoder), hp.sampling_rate, 'step_{}_{}.wav'.format(current_step, hp.vocoder)) comet_experiment.log_audio( vocoder_infer(mel_postnet_torch, vocoder), hp.sampling_rate, 'step_{}_postnet_{}.wav'.format( current_step, hp.vocoder)) comet_experiment.log_audio( vocoder_infer(mel_target_torch, vocoder), hp.sampling_rate, 'step_{}_ground-truth_{}.wav'.format( current_step, hp.vocoder)) f0 = f0[0, :length].detach().cpu().numpy() energy = energy[0, :length].detach().cpu().numpy() f0_output = f0_output[ 0, :length].detach().cpu().numpy() energy_output = energy_output[ 0, :length].detach().cpu().numpy() utils.plot_data( [(mel_postnet.numpy(), f0_output, energy_output), (mel_target.numpy(), f0, energy)], comet_experiment, [ 'Synthesized Spectrogram', 'Ground-Truth Spectrogram' ]) if current_step % hp.eval_step == 0: model.eval() with torch.no_grad(): if comet_experiment is not None: with comet_experiment.validate(): d_l, f_l, e_l, m_l, m_p_l = evaluate( model, current_step, comet_experiment) t_l = d_l + f_l + e_l + m_l + m_p_l comet_experiment.log_metric( "total_loss", t_l, current_step) comet_experiment.log_metric( "mel_loss", m_l, current_step) comet_experiment.log_metric( "mel_postnet_loss", m_p_l, current_step) comet_experiment.log_metric( "duration_loss", d_l, current_step) comet_experiment.log_metric( "F0_loss", f_l, current_step) comet_experiment.log_metric( "energy_loss", e_l, current_step)
class CometLogger(LightningLoggerBase): r""" Log using `Comet.ml <https://www.comet.ml>`_. Install it with pip: .. code-block:: bash pip install comet-ml Comet requires either an API Key (online mode) or a local directory path (offline mode). **ONLINE MODE** Example: >>> import os >>> from pytorch_lightning import Trainer >>> from pytorch_lightning.loggers import CometLogger >>> # arguments made to CometLogger are passed on to the comet_ml.Experiment class >>> comet_logger = CometLogger( ... api_key=os.environ.get('COMET_API_KEY'), ... workspace=os.environ.get('COMET_WORKSPACE'), # Optional ... save_dir='.', # Optional ... project_name='default_project', # Optional ... rest_api_key=os.environ.get('COMET_REST_API_KEY'), # Optional ... experiment_name='default' # Optional ... ) >>> trainer = Trainer(logger=comet_logger) **OFFLINE MODE** Example: >>> from pytorch_lightning.loggers import CometLogger >>> # arguments made to CometLogger are passed on to the comet_ml.Experiment class >>> comet_logger = CometLogger( ... save_dir='.', ... workspace=os.environ.get('COMET_WORKSPACE'), # Optional ... project_name='default_project', # Optional ... rest_api_key=os.environ.get('COMET_REST_API_KEY'), # Optional ... experiment_name='default' # Optional ... ) >>> trainer = Trainer(logger=comet_logger) Args: api_key: Required in online mode. API key, found on Comet.ml save_dir: Required in offline mode. The path for the directory to save local comet logs workspace: Optional. Name of workspace for this user project_name: Optional. Send your experiment to a specific project. Otherwise will be sent to Uncategorized Experiments. If the project name does not already exist, Comet.ml will create a new project. rest_api_key: Optional. Rest API key found in Comet.ml settings. This is used to determine version number experiment_name: Optional. String representing the name for this particular experiment on Comet.ml. experiment_key: Optional. If set, restores from existing experiment. """ def __init__(self, api_key: Optional[str] = None, save_dir: Optional[str] = None, workspace: Optional[str] = None, project_name: Optional[str] = None, rest_api_key: Optional[str] = None, experiment_name: Optional[str] = None, experiment_key: Optional[str] = None, force_offline: bool = False, **kwargs): if not _COMET_AVAILABLE: raise ImportError( 'You want to use `comet_ml` logger which is not installed yet,' ' install it with `pip install comet-ml`.') super().__init__() self._experiment = None self.save_dir = save_dir self.api_key = api_key # Determine online or offline mode based on which arguments were passed to CometLogger if api_key is None and save_dir is None: # If neither api_key nor save_dir are passed as arguments, raise an exception raise MisconfigurationException( "CometLogger requires either api_key or save_dir during initialization." ) elif api_key is None: self.mode = "offline" elif save_dir is None: self.mode = "online" else: # both given so need explicit argument self.mode = "offline" if force_offline else "online" log.info(f"CometLogger will be initialized in {self.mode} mode") self.workspace = workspace self.project_name = project_name self.experiment_name = experiment_name self.experiment_key = experiment_key self._kwargs = kwargs if rest_api_key is not None: # Comet.ml rest API, used to determine version number self.rest_api_key = rest_api_key self.comet_api = API(self.rest_api_key) else: self.rest_api_key = None self.comet_api = None if self.experiment_name is None: self._version = self.experiment.id else: # ensure that the directory name is unique by appending a number to the end root_save_dir = Path(self.save_dir) / self.name root_save_dir.mkdir(exist_ok=True, parents=True) max_i = -1 for path in root_save_dir.glob("*"): name = path.name if name.startswith(self.experiment_name): try: i = int(name.split("_")[-1]) max_i = max(max_i, i) except (IndexError, ValueError): # no _ or no int at end continue self._version = f"{self.experiment_name}_{max_i + 1}" self._kwargs = kwargs @property def experiment(self) -> CometBaseExperiment: r""" Actual Comet object. To use Comet features in your :class:`~pytorch_lightning.core.lightning.LightningModule` do the following. Example:: self.logger.experiment.some_comet_function() """ if self._experiment is not None: return self._experiment if self.mode == "online": if self.experiment_key is None: self._experiment = CometExperiment( api_key=self.api_key, workspace=self.workspace, project_name=self.project_name, **self._kwargs) self.experiment_key = self._experiment.get_key() else: self._experiment = CometExistingExperiment( api_key=self.api_key, workspace=self.workspace, project_name=self.project_name, previous_experiment=self.experiment_key, **self._kwargs) else: save_dir = Path(self.save_dir) / self.name / self.version save_dir.mkdir(exist_ok=True, parents=True) self._experiment = CometOfflineExperiment( offline_directory=save_dir, workspace=self.workspace, project_name=self.project_name, **self._kwargs) if self.experiment_name is not None: self._experiment.set_name(self.experiment_name) return self._experiment @rank_zero_only def log_hyperparams(self, params: Union[Dict[str, Any], Namespace]) -> None: params = self._convert_params(params) params = self._flatten_dict(params) self.experiment.log_parameters(params) @rank_zero_only def log_metrics(self, metrics: Dict[str, Union[torch.Tensor, float]], step: Optional[int] = None) -> None: # Comet.ml expects metrics to be a dictionary of detached tensors on CPU for key, val in metrics.items(): if is_tensor(val): metrics[key] = val.cpu().detach() self.experiment.log_metrics(metrics, step=step) def reset_experiment(self): self._experiment = None @rank_zero_only def finalize(self, status: str) -> None: r""" When calling ``self.experiment.end()``, that experiment won't log any more data to Comet. That's why, if you need to log any more data, you need to create an ExistingCometExperiment. For example, to log data when testing your model after training, because when training is finalized :meth:`CometLogger.finalize` is called. This happens automatically in the :meth:`~CometLogger.experiment` property, when ``self._experiment`` is set to ``None``, i.e. ``self.reset_experiment()``. """ self.experiment.end() self.reset_experiment() @property def name(self) -> str: return str(self.project_name) # no setter because you can't change the project name of an experiment (I don't think) @property def version(self) -> str: return self._version
project_name='swissroll-' + args.tag, workspace="wronnyhuang") else: experiment = Experiment(api_key="vPCPPZrcrUBitgoQkvzxdsh9k", parse_args=False, project_name='swissroll-' + args.tag, workspace="wronnyhuang") open(join(logdir, 'comet_expt_key.txt'), 'w+').write(experiment.get_key()) if any([a.find('nhidden1') != -1 for a in sys.argv[1:]]): args.nhidden = [ args.nhidden1, args.nhidden2, args.nhidden3, args.nhidden4, args.nhidden5, args.nhidden6 ] experiment.log_parameters(vars(args)) experiment.set_name(args.sugg) print(sys.argv) os.environ['CUDA_VISIBLE_DEVICES'] = str(args.gpu) np.random.seed(args.seed) tf.set_random_seed(args.seed) # make dataset X, y = twospirals(args.ndata // 2, noise=args.noise) order = np.random.permutation(len(X)) X = X[order] y = y[order] splitIdx = int(.5 * len(X)) xtrain, ytrain = X[:splitIdx], y[:splitIdx, None] xtest, ytest = X[splitIdx:], y[splitIdx:, None]
device = 'cuda' if torch.cuda.is_available() else 'cpu' # Set all seeds for full reproducibility np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) torch.backends.cudnn.benchmark = False torch.backends.cudnn.deterministic = True # Set up Comet Experiment tracking experiment = OfflineExperiment("z15Um8oxWZwiXQXZxZKGh48cl", workspace='swechhachoudhary', offline_directory="../swechhas_experiments") experiment.set_name( name=args.config + "_dim={}_overlapped={}".format(latent_dim, train_split)) experiment.log_parameters(configuration) if encoding_model == 'pca': encoding_model = PCAEncoder(seed) flattened = True elif encoding_model == 'vae': encoding_model = VAE(latent_dim=latent_dim).to(device) flattened = True elif encoding_model == "ae": encoding_model = AE(latent_dim=latent_dim).to(device) flattened = True elif encoding_model == "cae": encoding_model = CAE(latent_dim=latent_dim).to(device) flattened = False
class CometWriter: def __init__(self, logger, project_name: Optional[str] = None, experiment_name: Optional[str] = None, api_key: Optional[str] = None, log_dir: Optional[str] = None, offline: bool = False, **kwargs): if not _COMET_AVAILABLE: raise ImportError( "You want to use `comet_ml` logger which is not installed yet," " install it with `pip install comet-ml`.") self.project_name = project_name self.experiment_name = experiment_name self.kwargs = kwargs self.timer = Timer() if (api_key is not None) and (log_dir is not None): self.mode = "offline" if offline else "online" self.api_key = api_key self.log_dir = log_dir elif api_key is not None: self.mode = "online" self.api_key = api_key self.log_dir = None elif log_dir is not None: self.mode = "offline" self.log_dir = log_dir else: logger.warning( "CometLogger requires either api_key or save_dir during initialization." ) if self.mode == "online": self.experiment = CometExperiment( api_key=self.api_key, project_name=self.project_name, **self.kwargs, ) else: self.experiment = CometOfflineExperiment( offline_directory=self.log_dir, project_name=self.project_name, **self.kwargs, ) if self.experiment_name: self.experiment.set_name(self.experiment_name) def set_step(self, step, epoch=None, mode='train') -> None: self.mode = mode self.step = step self.epoch = epoch if step == 0: self.timer.reset() else: duration = self.timer.check() self.add_scalar({'steps_per_sec': 1 / duration}) def log_hyperparams(self, params: Dict[str, Any]) -> None: self.experiment.log_parameters(params) def log_code(self, file_name=None, folder='models/') -> None: self.experiment.log_code(file_name=file_name, folder=folder) def add_scalar(self, metrics: Dict[str, Union[torch.Tensor, float]], step: Optional[int] = None, epoch: Optional[int] = None) -> None: metrics_renamed = {} for key, val in metrics.items(): tag = '{}/{}'.format(key, self.mode) if is_tensor(val): metrics_renamed[tag] = val.cpu().detach() else: metrics_renamed[tag] = val if epoch is None: self.experiment.log_metrics(metrics_renamed, step=self.step, epoch=self.epoch) else: self.experiment.log_metrics(metrics_renamed, epoch=epoch) def add_plot(self, figure_name, figure): """ Primarily for log gate plots """ self.experiment.log_figure(figure_name=figure_name, figure=figure) def add_hist3d(self, hist, name): """ Primarily for log gate plots """ self.experiment.log_histogram_3d(hist, name=name) def reset_experiment(self): self.experiment = None def finalize(self) -> None: self.experiment.end() self.reset_experiment()
# Parse configuration file batch_size = configuration['batch_size'] seed = configuration['seed'] n_epochs = configuration['n_epochs'] # Set all seeds for full reproducibility np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) torch.backends.cudnn.benchmark = False torch.backends.cudnn.deterministic = True latent_dim = configuration['Zdim'] if not os.path.exists('experiments'): print('mkdir ', 'experiments') os.mkdir('experiments') if configuration['encode']: experiment = OfflineExperiment(project_name="ali", workspace='timothynest', offline_directory=str('../experiments/' + configuration['experiment'])) elif configuration['cluster']: experiment = OfflineExperiment(project_name="ali", workspace='timothynest', offline_directory=str( '../experiments/' + configuration['experiment'] + '/cluster')) experiment.set_name(name=configuration['experiment']) experiment.log_parameters(configuration) experiment.add_tag(configuration['experiment']) # Initiate experiment main(datapath, configuration, experiment)
def train(config, weights, ntrain, ntest, nepochs, recreate, prefix, plot_freq, customize, comet_offline): # tf.debugging.enable_check_numerics() """Train a model defined by config""" config_file_path = config config, config_file_stem = parse_config(config, nepochs=nepochs, weights=weights) if plot_freq: config["callbacks"]["plot_freq"] = plot_freq if customize: config = customization_functions[customize](config) # Decide tf.distribute.strategy depending on number of available GPUs horovod_enabled = config["setup"]["horovod_enabled"] if horovod_enabled: num_gpus = initialize_horovod() else: strategy, num_gpus = get_strategy() outdir = "" if not horovod_enabled or hvd.rank() == 0: outdir = create_experiment_dir(prefix=prefix + config_file_stem + "_", suffix=platform.node()) shutil.copy( config_file_path, outdir + "/config.yaml" ) # Copy the config file to the train dir for later reference try: if comet_offline: print("Using comet-ml OfflineExperiment, saving logs locally.") from comet_ml import OfflineExperiment experiment = OfflineExperiment( project_name="particleflow-tf", auto_metric_logging=True, auto_param_logging=True, auto_histogram_weight_logging=True, auto_histogram_gradient_logging=False, auto_histogram_activation_logging=False, offline_directory=outdir + "/cometml", ) else: print("Using comet-ml Experiment, streaming logs to www.comet.ml.") from comet_ml import Experiment experiment = Experiment( project_name="particleflow-tf", auto_metric_logging=True, auto_param_logging=True, auto_histogram_weight_logging=True, auto_histogram_gradient_logging=False, auto_histogram_activation_logging=False, ) except Exception as e: print("Failed to initialize comet-ml dashboard: {}".format(e)) experiment = None if experiment: experiment.set_name(outdir) experiment.log_code("mlpf/tfmodel/model.py") experiment.log_code("mlpf/tfmodel/utils.py") experiment.log_code(config_file_path) ds_train, num_train_steps = get_datasets(config["train_test_datasets"], config, num_gpus, "train") ds_test, num_test_steps = get_datasets(config["train_test_datasets"], config, num_gpus, "test") ds_val, ds_info = get_heptfds_dataset( config["validation_datasets"][0], config, num_gpus, "test", config["setup"]["num_events_validation"], supervised=False, ) ds_val = ds_val.batch(5) if ntrain: ds_train = ds_train.take(ntrain) num_train_steps = ntrain if ntest: ds_test = ds_test.take(ntest) num_test_steps = ntest print("num_train_steps", num_train_steps) print("num_test_steps", num_test_steps) total_steps = num_train_steps * config["setup"]["num_epochs"] print("total_steps", total_steps) if horovod_enabled: model, optim_callbacks, initial_epoch = model_scope( config, total_steps, weights, horovod_enabled) else: with strategy.scope(): model, optim_callbacks, initial_epoch = model_scope( config, total_steps, weights) callbacks = prepare_callbacks( config, outdir, ds_val, comet_experiment=experiment, horovod_enabled=config["setup"]["horovod_enabled"]) verbose = 1 if horovod_enabled: callbacks.append(hvd.callbacks.BroadcastGlobalVariablesCallback(0)) callbacks.append(hvd.callbacks.MetricAverageCallback()) verbose = 1 if hvd.rank() == 0 else 0 num_train_steps /= hvd.size() num_test_steps /= hvd.size() callbacks.append(optim_callbacks) model.fit( ds_train.repeat(), validation_data=ds_test.repeat(), epochs=initial_epoch + config["setup"]["num_epochs"], callbacks=callbacks, steps_per_epoch=num_train_steps, validation_steps=num_test_steps, initial_epoch=initial_epoch, verbose=verbose, )
api_key="hIXq6lDzWzz24zgKv7RYz6blo", project_name="supercyclecons", workspace="cinjon", auto_metric_logging=True, auto_output_logging=None, auto_param_logging=False, offline_directory=params['local_comet_dir']) else: comet_exp = CometExperiment(api_key="hIXq6lDzWzz24zgKv7RYz6blo", project_name="supercyclecons", workspace="cinjon", auto_metric_logging=True, auto_output_logging=None, auto_param_logging=False) comet_exp.log_parameters(vars(args)) comet_exp.set_name(params['name']) def partial_load(pretrained_dict, model): model_dict = model.state_dict() # 1. filter out unnecessary keys pretrained_dict = { k: v for k, v in pretrained_dict.items() if k in model_dict } # 2. overwrite entries in the existing state dict model_dict.update(pretrained_dict) # 3. load the new state dict model.load_state_dict(pretrained_dict)
def run_experiment_iter(i, experiment, train_iter, nExp, agent_list, env, video, user_seed, experiment_name, log_params, debug, project_name, sps, sps_es, **kwargs): """ Function used to paralelize the run_experiment calculations. Parameters ---------- i : int Index of the agent being trained. Raises ------ NotImplementedError In case Comet is used, raises this error to signal where user intervention is required (namely to set the api_key and the workspace). Returns ------- rewards : array An array with the cumulative rewards, where each column corresponds to an agent (random seed), and each row to a training iteration. arms : array An array with the number of agent arms, where each column corresponds to an agent (random seed), and each row to a training iteration. agent : Agent The trained agent. """ if debug: start = time.time() print("Experiment {0} out of {1}...".format(i + 1, nExp)) if not user_seed: seed = int.from_bytes(os.urandom(4), 'big') else: seed = user_seed if experiment_name: raise NotImplementedError( "Before using Comet, you need to come here and set your API key") experiment = Experiment(api_key=None, project_name=project_name, workspace=None, display_summary=False, offline_directory="offline") experiment.add_tag(experiment_name) experiment.set_name("{0}_{1}".format(experiment_name, i)) # Sometimes adding the tag fails log_params["experiment_tag"] = experiment_name experiment.log_parameters(log_params) agent = agent_list[i] if sps_es: # This one overrides sps rewards, arms, agent = run_sps_es_experiment(agent, env, train_iter, seed=seed, video=video, experiment=experiment, **kwargs) elif sps: rewards, arms, agent = run_sps_experiment(agent, env, train_iter, seed=seed, video=video, experiment=experiment, **kwargs) else: rewards, arms, agent = run_aql_experiment(agent, env, train_iter, seed=seed, video=video, experiment=experiment, **kwargs) agent_list[i] = agent if experiment: experiment.end() if debug: end = time.time() elapsed = end - start units = "secs" if elapsed > 3600: elapsed /= 3600 units = "hours" elif elapsed > 60: elapsed /= 60 units = "mins" print("Time elapsed: {0:.02f} {1}".format(elapsed, units)) return rewards, arms, agent
logging.info(opt) if opt.resume and not opt.load_checkpoint: parser.error( 'load_checkpoint argument is required to resume training from checkpoint' ) if not opt.attention and opt.attention_method: parser.error("Attention method provided, but attention is not turned on") if opt.attention and not opt.attention_method: parser.error("Attention turned on, but no attention method provided") if opt.exp_name is None and not comet_args.get('disabled'): parser.error('Please provide exp_name if logging to CometML') experiment.set_name(opt.exp_name) if torch.cuda.is_available(): logging.info("Cuda device set to %i" % opt.cuda_device) torch.cuda.set_device(opt.cuda_device) if opt.attention: if not opt.attention_method: logging.info("No attention method provided. Using DOT method.") opt.attention_method = 'dot' # Set random seed if opt.random_seed: random.seed(opt.random_seed) np.random.seed(opt.random_seed) torch.manual_seed(opt.random_seed)
def main(args): print('Pretrain? ', not args.not_pretrain) print(args.model) start_time = time.time() if opt['local_comet_dir']: comet_exp = OfflineExperiment(api_key="hIXq6lDzWzz24zgKv7RYz6blo", project_name="selfcifar", workspace="cinjon", auto_metric_logging=True, auto_output_logging=None, auto_param_logging=False, offline_directory=opt['local_comet_dir']) else: comet_exp = CometExperiment(api_key="hIXq6lDzWzz24zgKv7RYz6blo", project_name="selfcifar", workspace="cinjon", auto_metric_logging=True, auto_output_logging=None, auto_param_logging=False) comet_exp.log_parameters(vars(args)) comet_exp.set_name(args.name) # Build model # path = "/misc/kcgscratch1/ChoGroup/resnick/spaceofmotion/zeping/bsn" linear_cls = NonLinearModel if args.do_nonlinear else LinearModel if args.model == "amdim": hparams = load_hparams_from_tags_csv( '/checkpoint/cinjon/amdim/meta_tags.csv') # hparams = load_hparams_from_tags_csv(os.path.join(path, "meta_tags.csv")) model = AMDIMModel(hparams) if not args.not_pretrain: # _path = os.path.join(path, "_ckpt_epoch_434.ckpt") _path = '/checkpoint/cinjon/amdim/_ckpt_epoch_434.ckpt' model.load_state_dict(torch.load(_path)["state_dict"]) else: print("AMDIM not loading checkpoint") # Debug linear_model = linear_cls(AMDIM_OUTPUT_DIM, args.num_classes) elif args.model == "ccc": model = CCCModel(None) if not args.not_pretrain: # _path = os.path.join(path, "TimeCycleCkpt14.pth") _path = '/checkpoint/cinjon/spaceofmotion/bsn/TimeCycleCkpt14.pth' checkpoint = torch.load(_path) base_dict = { '.'.join(k.split('.')[1:]): v for k, v in list(checkpoint['state_dict'].items()) } model.load_state_dict(base_dict) else: print("CCC not loading checkpoint") # Debug linear_model = linaer_cls(CCC_OUTPUT_DIM, args.num_classes) #.to(device) elif args.model == "corrflow": model = CORRFLOWModel(None) if not args.not_pretrain: _path = '/checkpoint/cinjon/spaceofmotion/supercons/corrflow.kineticsmodel.pth' # _path = os.path.join(path, "corrflow.kineticsmodel.pth") checkpoint = torch.load(_path) base_dict = { '.'.join(k.split('.')[1:]): v for k, v in list(checkpoint['state_dict'].items()) } model.load_state_dict(base_dict) else: print("CorrFlow not loading checkpoing") # Debug linear_model = linear_cls(CORRFLOW_OUTPUT_DIM, args.num_classes) elif args.model == "resnet": if not args.not_pretrain: resnet = torchvision.models.resnet50(pretrained=True) else: resnet = torchvision.models.resnet50(pretrained=False) print("ResNet not loading checkpoint") # Debug modules = list(resnet.children())[:-1] model = nn.Sequential(*modules) linear_model = linear_cls(RESNET_OUTPUT_DIM, args.num_classes) else: raise Exception("model type has to be amdim, ccc, corrflow or resnet") if torch.cuda.device_count() > 1: model = nn.DataParallel(model).to(device) linear_model = nn.DataParallel(linear_model).to(device) else: model = model.to(device) linear_model = linear_model.to(device) # model = model.to(device) # linear_model = linear_model.to(device) # Freeze model for p in model.parameters(): p.requires_grad = False model.eval() if args.optimizer == "Adam": optimizer = optim.Adam(linear_model.parameters(), lr=args.lr, weight_decay=args.weight_decay) print("Optimizer: Adam with weight decay: {}".format( args.weight_decay)) elif args.optimizer == "SGD": optimizer = optim.SGD(linear_model.parameters(), lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay) print("Optimizer: SGD with weight decay: {} momentum: {}".format( args.weight_decay, args.momentum)) else: raise Exception("optimizer should be Adam or SGD") optimizer.zero_grad() # Set up log dir now = datetime.datetime.now() log_dir = '/checkpoint/cinjon/spaceofmotion/bsn/cifar-%d-weights/%s/%s' % ( args.num_classes, args.model, args.name) # log_dir = "{}{:%Y%m%dT%H%M}".format(args.model, now) # log_dir = os.path.join("weights", log_dir) if not os.path.exists(log_dir): os.makedirs(log_dir) print("Saving to {}".format(log_dir)) batch_size = args.batch_size * torch.cuda.device_count() # CIFAR-10 if args.num_classes == 10: data_path = ("/private/home/cinjon/cifar-data/cifar-10-batches-py") _train_dataset = CIFAR_dataset(glob(os.path.join(data_path, "data*")), args.num_classes, args.model, True) # _train_acc_dataset = CIFAR_dataset( # glob(os.path.join(data_path, "data*")), # args.num_classes, # args.model, # False) train_dataloader = data.DataLoader(_train_dataset, shuffle=True, batch_size=batch_size, num_workers=args.num_workers) # train_split = int(len(_train_dataset) * 0.8) # train_dev_split = int(len(_train_dataset) - train_split) # train_dataset, train_dev_dataset = data.random_split( # _train_dataset, [train_split, train_dev_split]) # train_acc_dataloader = data.DataLoader( # train_dataset, shuffle=False, batch_size=batch_size, num_workers=args.num_workers) # train_dev_acc_dataloader = data.DataLoader( # train_dev_dataset, shuffle=False, batch_size=batch_size, num_workers=args.num_workers) # train_dataset = data.Subset(_train_dataset, list(range(train_split))) # train_dataloader = data.DataLoader( # train_dataset, shuffle=True, batch_size=batch_size, num_workers=args.num_workers) # train_acc_dataset = data.Subset( # _train_acc_dataset, list(range(train_split))) # train_acc_dataloader = data.DataLoader( # train_acc_dataset, shuffle=False, batch_size=batch_size, num_workers=args.num_workers) # train_dev_acc_dataset = data.Subset( # _train_acc_dataset, list(range(train_split, len(_train_acc_dataset)))) # train_dev_acc_dataloader = data.DataLoader( # train_dev_acc_dataset, shuffle=False, batch_size=batch_size, num_workers=args.num_workers) _val_dataset = CIFAR_dataset([os.path.join(data_path, "test_batch")], args.num_classes, args.model, False) val_dataloader = data.DataLoader(_val_dataset, shuffle=False, batch_size=batch_size, num_workers=args.num_workers) # val_split = int(len(_val_dataset) * 0.8) # val_dev_split = int(len(_val_dataset) - val_split) # val_dataset, val_dev_dataset = data.random_split( # _val_dataset, [val_split, val_dev_split]) # val_dataloader = data.DataLoader( # val_dataset, shuffle=False, batch_size=batch_size, num_workers=args.num_workers) # val_dev_dataloader = data.DataLoader( # val_dev_dataset, shuffle=False, batch_size=batch_size, num_workers=args.num_workers) # CIFAR-100 elif args.num_classes == 100: data_path = ("/private/home/cinjon/cifar-data/cifar-100-python") _train_dataset = CIFAR_dataset([os.path.join(data_path, "train")], args.num_classes, args.model, True) train_dataloader = data.DataLoader(_train_dataset, shuffle=True, batch_size=batch_size) _val_dataset = CIFAR_dataset([os.path.join(data_path, "test")], args.num_classes, args.model, False) val_dataloader = data.DataLoader(_val_dataset, shuffle=False, batch_size=batch_size) else: raise Exception("num_classes should be 10 or 100") best_acc = 0.0 best_epoch = 0 # Training for epoch in range(1, args.epochs + 1): current_lr = max(3e-4, args.lr *\ math.pow(0.5, math.floor(epoch / args.lr_interval))) linear_model.train() if args.optimizer == "Adam": optimizer = optim.Adam(linear_model.parameters(), lr=current_lr, weight_decay=args.weight_decay) elif args.optimizer == "SGD": optimizer = optim.SGD( linear_model.parameters(), lr=current_lr, momentum=args.momentum, weight_decay=args.weight_decay, ) #################################################### # Train t = time.time() train_acc = 0 train_loss_sum = 0.0 for iter, input in enumerate(train_dataloader): if time.time( ) - start_time > args.time * 3600 - 300 and comet_exp is not None: comet_exp.end() sys.exit(-1) imgs = input[0].to(device) if args.model != "resnet": imgs = imgs.unsqueeze(1) lbls = input[1].flatten().to(device) # output = model(imgs) # output = linear_model(output) output = linear_model(model(imgs)) loss = F.cross_entropy(output, lbls) train_loss_sum += float(loss.data) train_acc += int(sum(torch.argmax(output, dim=1) == lbls)) optimizer.zero_grad() loss.backward() optimizer.step() # log_text = "train epoch {}/{}\titer {}/{} loss:{} {:.3f}s/iter" if iter % 1500 == 0: log_text = "train epoch {}/{}\titer {}/{} loss:{}" print(log_text.format(epoch, args.epochs, iter + 1, len(train_dataloader), loss.data, time.time() - t), flush=False) t = time.time() train_acc /= len(_train_dataset) train_loss_sum /= len(train_dataloader) with comet_exp.train(): comet_exp.log_metrics({ 'acc': train_acc, 'loss': train_loss_sum }, step=(epoch + 1) * len(train_dataloader), epoch=epoch + 1) print("train acc epoch {}/{} loss:{} train_acc:{}".format( epoch, args.epochs, train_loss_sum, train_acc), flush=True) ####################################################################### # Train acc # linear_model.eval() # train_acc = 0 # train_loss_sum = 0.0 # for iter, input in enumerate(train_acc_dataloader): # imgs = input[0].to(device) # if args.model != "resnet": # imgs = imgs.unsqueeze(1) # lbls = input[1].flatten().to(device) # # # output = model(imgs) # # output = linear_model(output) # output = linear_model(model(imgs)) # loss = F.cross_entropy(output, lbls) # train_loss_sum += float(loss.data) # train_acc += int(sum(torch.argmax(output, dim=1) == lbls)) # # print("train acc epoch {}/{}\titer {}/{} loss:{} {:.3f}s/iter".format( # epoch, # args.epochs, # iter+1, # len(train_acc_dataloader), # loss.data, # time.time() - t), # flush=True) # t = time.time() # # # train_acc /= len(train_acc_dataset) # train_loss_sum /= len(train_acc_dataloader) # print("train acc epoch {}/{} loss:{} train_acc:{}".format( # epoch, args.epochs, train_loss_sum, train_acc), flush=True) ####################################################################### # Train dev acc # # linear_model.eval() # train_dev_acc = 0 # train_dev_loss_sum = 0.0 # for iter, input in enumerate(train_dev_acc_dataloader): # imgs = input[0].to(device) # if args.model != "resnet": # imgs = imgs.unsqueeze(1) # lbls = input[1].flatten().to(device) # # output = model(imgs) # output = linear_model(output) # # output = linear_model(model(imgs)) # loss = F.cross_entropy(output, lbls) # train_dev_loss_sum += float(loss.data) # train_dev_acc += int(sum(torch.argmax(output, dim=1) == lbls)) # # print("train dev acc epoch {}/{}\titer {}/{} loss:{} {:.3f}s/iter".format( # epoch, # args.epochs, # iter+1, # len(train_dev_acc_dataloader), # loss.data, # time.time() - t), # flush=True) # t = time.time() # # train_dev_acc /= len(train_dev_acc_dataset) # train_dev_loss_sum /= len(train_dev_acc_dataloader) # print("train dev epoch {}/{} loss:{} train_dev_acc:{}".format( # epoch, args.epochs, train_dev_loss_sum, train_dev_acc), flush=True) ####################################################################### # Val dev # # linear_model.eval() # val_dev_acc = 0 # val_dev_loss_sum = 0.0 # for iter, input in enumerate(val_dev_dataloader): # imgs = input[0].to(device) # if args.model != "resnet": # imgs = imgs.unsqueeze(1) # lbls = input[1].flatten().to(device) # # output = model(imgs) # output = linear_model(output) # loss = F.cross_entropy(output, lbls) # val_dev_loss_sum += float(loss.data) # val_dev_acc += int(sum(torch.argmax(output, dim=1) == lbls)) # # print("val dev epoch {}/{} iter {}/{} loss:{} {:.3f}s/iter".format( # epoch, # args.epochs, # iter+1, # len(val_dev_dataloader), # loss.data, # time.time() - t), # flush=True) # t = time.time() # # val_dev_acc /= len(val_dev_dataset) # val_dev_loss_sum /= len(val_dev_dataloader) # print("val dev epoch {}/{} loss:{} val_dev_acc:{}".format( # epoch, args.epochs, val_dev_loss_sum, val_dev_acc), flush=True) ####################################################################### # Val linear_model.eval() val_acc = 0 val_loss_sum = 0.0 for iter, input in enumerate(val_dataloader): if time.time( ) - start_time > args.time * 3600 - 300 and comet_exp is not None: comet_exp.end() sys.exit(-1) imgs = input[0].to(device) if args.model != "resnet": imgs = imgs.unsqueeze(1) lbls = input[1].flatten().to(device) output = model(imgs) output = linear_model(output) loss = F.cross_entropy(output, lbls) val_loss_sum += float(loss.data) val_acc += int(sum(torch.argmax(output, dim=1) == lbls)) # log_text = "val epoch {}/{} iter {}/{} loss:{} {:.3f}s/iter" if iter % 1500 == 0: log_text = "val epoch {}/{} iter {}/{} loss:{}" print(log_text.format(epoch, args.epochs, iter + 1, len(val_dataloader), loss.data, time.time() - t), flush=False) t = time.time() val_acc /= len(_val_dataset) val_loss_sum /= len(val_dataloader) print("val epoch {}/{} loss:{} val_acc:{}".format( epoch, args.epochs, val_loss_sum, val_acc)) with comet_exp.test(): comet_exp.log_metrics({ 'acc': val_acc, 'loss': val_loss_sum }, step=(epoch + 1) * len(train_dataloader), epoch=epoch + 1) if val_acc > best_acc: best_acc = val_acc best_epoch = epoch linear_save_path = os.path.join(log_dir, "{}.linear.pth".format(epoch)) model_save_path = os.path.join(log_dir, "{}.model.pth".format(epoch)) torch.save(linear_model.state_dict(), linear_save_path) torch.save(model.state_dict(), model_save_path) # Check bias and variance print( "Epoch {} lr {} total: train_loss:{} train_acc:{} val_loss:{} val_acc:{}" .format(epoch, current_lr, train_loss_sum, train_acc, val_loss_sum, val_acc), flush=True) # print("Epoch {} lr {} total: train_acc:{} train_dev_acc:{} val_dev_acc:{} val_acc:{}".format( # epoch, current_lr, train_acc, train_dev_acc, val_dev_acc, val_acc), flush=True) print("The best epoch: {} acc: {}".format(best_epoch, best_acc))
def _get_comet_experiment(): experiment = OfflineExperiment(project_name='general', workspace='benjaminbenoit', offline_directory="../transformer_net_comet_experiences") experiment.set_name("TransformerNet") return experiment
# Set all seeds for full reproducibility np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) torch.backends.cudnn.benchmark = False torch.backends.cudnn.deterministic = True # Set up Comet Experiment tracking # Replace this with appropriate comet # workspaces experiment = OfflineExperiment("z15Um8oxWZwiXQXZxZKGh48cl", workspace='swechhachoudhary', offline_directory="../swechhas_experiments") experiment.set_name( name=args.config + "_dim={}_split={}".format(latent_dim, train_unlabeled_split)) experiment.log_parameters(configuration) if encoding_model == 'pca': encoding_model = PCAEncoder(seed) flattened = True elif encoding_model == 'vae': encoding_model = VAE(latent_dim=latent_dim).to(device) flattened = True elif encoding_model == "ae": encoding_model = AE(latent_dim=latent_dim).to(device) flattened = True elif encoding_model == "cae": encoding_model = CAE(latent_dim=latent_dim).to(device) flattened = False