Source code for ignite.contrib.handlers.polyaxon_logger
"""Polyaxon logger and its helper handlers."""fromtypingimportAny,Callable,List,Optional,Unionfromtorch.optimimportOptimizerfromignite.contrib.handlers.base_loggerimportBaseLogger,BaseOptimizerParamsHandler,BaseOutputHandlerfromignite.engineimportEngine,Eventsfromignite.handlersimportglobal_step_from_engine__all__=["PolyaxonLogger","OutputHandler","OptimizerParamsHandler","global_step_from_engine"]
[docs]classPolyaxonLogger(BaseLogger):""" `Polyaxon tracking client <https://polyaxon.com/>`_ handler to log parameters and metrics during the training and validation. This class requires `polyaxon <https://github.com/polyaxon/polyaxon/>`_ package to be installed: .. code-block:: bash pip install polyaxon // If you are using polyaxon v0.x pip install polyaxon-client Args: args: Positional arguments accepted from `Experiment <https://polyaxon.com/docs/experimentation/tracking/client/>`_. kwargs: Keyword arguments accepted from `Experiment <https://polyaxon.com/docs/experimentation/tracking/client/>`_. Examples: .. code-block:: python from ignite.contrib.handlers.polyaxon_logger import * # Create a logger plx_logger = PolyaxonLogger() # Log experiment parameters: plx_logger.log_inputs(**{ "seed": seed, "batch_size": batch_size, "model": model.__class__.__name__, "pytorch version": torch.__version__, "ignite version": ignite.__version__, "cuda version": torch.version.cuda, "device name": torch.cuda.get_device_name(0) }) # Attach the logger to the trainer to log training loss at each iteration plx_logger.attach_output_handler( trainer, event_name=Events.ITERATION_COMPLETED, tag="training", output_transform=lambda loss: {"loss": loss} ) # Attach the logger to the evaluator on the training dataset and log NLL, Accuracy metrics after each epoch # We setup `global_step_transform=global_step_from_engine(trainer)` to take the epoch # of the `trainer` instead of `train_evaluator`. plx_logger.attach_output_handler( train_evaluator, event_name=Events.EPOCH_COMPLETED, tag="training", metric_names=["nll", "accuracy"], global_step_transform=global_step_from_engine(trainer), ) # Attach the logger to the evaluator on the validation dataset and log NLL, Accuracy metrics after # each epoch. We setup `global_step_transform=global_step_from_engine(trainer)` to take the epoch of the # `trainer` instead of `evaluator`. plx_logger.attach_output_handler( evaluator, event_name=Events.EPOCH_COMPLETED, tag="validation", metric_names=["nll", "accuracy"], global_step_transform=global_step_from_engine(trainer)), ) # Attach the logger to the trainer to log optimizer's parameters, e.g. learning rate at each iteration plx_logger.attach_opt_params_handler( trainer, event_name=Events.ITERATION_STARTED, optimizer=optimizer, param_name='lr' # optional ) # to manually end a run plx_logger.close() """def__init__(self,*args:Any,**kwargs:Any):try:frompolyaxon.trackingimportRunself.experiment=Run(*args,**kwargs)exceptImportError:try:frompolyaxon_client.trackingimportExperimentself.experiment=Experiment(*args,**kwargs)exceptImportError:raiseModuleNotFoundError("This contrib module requires polyaxon to be installed.\n""For Polyaxon v1.x please install it with command: \n pip install polyaxon\n""For Polyaxon v0.x please install it with command: \n pip install polyaxon-client")defclose(self)->None:try:self.experiment.end()except:passdef__getattr__(self,attr:Any)->Any:returngetattr(self.experiment,attr)def_create_output_handler(self,*args:Any,**kwargs:Any)->"OutputHandler":returnOutputHandler(*args,**kwargs)def_create_opt_params_handler(self,*args:Any,**kwargs:Any)->"OptimizerParamsHandler":returnOptimizerParamsHandler(*args,**kwargs)
[docs]classOutputHandler(BaseOutputHandler):"""Helper handler to log engine's output and/or metrics. Args: tag: common title for all produced plots. For example, "training" metric_names: list of metric names to plot or a string "all" to plot all available metrics. output_transform: output transform function to prepare `engine.state.output` as a number. For example, `output_transform = lambda output: output` This function can also return a dictionary, e.g `{"loss": loss1, "another_loss": loss2}` to label the plot with corresponding keys. global_step_transform: global step transform function to output a desired global step. Input of the function is `(engine, event_name)`. Output of function should be an integer. Default is None, global_step based on attached engine. If provided, uses function output as global_step. To setup global step from another engine, please use :meth:`~ignite.contrib.handlers.polyaxon_logger.global_step_from_engine`. state_attributes: list of attributes of the ``trainer.state`` to plot. Examples: .. code-block:: python from ignite.contrib.handlers.polyaxon_logger import * # Create a logger plx_logger = PolyaxonLogger() # Attach the logger to the evaluator on the validation dataset and log NLL, Accuracy metrics after # each epoch. We setup `global_step_transform=global_step_from_engine(trainer)` to take the epoch # of the `trainer`: plx_logger.attach( evaluator, log_handler=OutputHandler( tag="validation", metric_names=["nll", "accuracy"], global_step_transform=global_step_from_engine(trainer) ), event_name=Events.EPOCH_COMPLETED ) # or equivalently plx_logger.attach_output_handler( evaluator, event_name=Events.EPOCH_COMPLETED, tag="validation", metric_names=["nll", "accuracy"], global_step_transform=global_step_from_engine(trainer) ) Another example, where model is evaluated every 500 iterations: .. code-block:: python from ignite.contrib.handlers.polyaxon_logger import * @trainer.on(Events.ITERATION_COMPLETED(every=500)) def evaluate(engine): evaluator.run(validation_set, max_epochs=1) plx_logger = PolyaxonLogger() def global_step_transform(*args, **kwargs): return trainer.state.iteration # Attach the logger to the evaluator on the validation dataset and log NLL, Accuracy metrics after # every 500 iterations. Since evaluator engine does not have access to the training iteration, we # provide a global_step_transform to return the trainer.state.iteration for the global_step, each time # evaluator metrics are plotted on Polyaxon. plx_logger.attach_output_handler( evaluator, event_name=Events.EPOCH_COMPLETED, tag="validation", metrics=["nll", "accuracy"], global_step_transform=global_step_transform ) Another example where the State Attributes ``trainer.state.alpha`` and ``trainer.state.beta`` are also logged along with the NLL and Accuracy after each iteration: .. code-block:: python plx_logger.attach_output_handler( trainer, event_name=Events.ITERATION_COMPLETED, tag="training", metrics=["nll", "accuracy"], state_attributes=["alpha", "beta"], ) Example of `global_step_transform`: .. code-block:: python def global_step_transform(engine, event_name): return engine.state.get_event_attrib_value(event_name) .. versionchanged:: 0.4.7 accepts an optional list of `state_attributes` """def__init__(self,tag:str,metric_names:Optional[List[str]]=None,output_transform:Optional[Callable]=None,global_step_transform:Optional[Callable[[Engine,Union[str,Events]],int]]=None,state_attributes:Optional[List[str]]=None,):super(OutputHandler,self).__init__(tag,metric_names,output_transform,global_step_transform,state_attributes)def__call__(self,engine:Engine,logger:PolyaxonLogger,event_name:Union[str,Events])->None:ifnotisinstance(logger,PolyaxonLogger):raiseRuntimeError("Handler 'OutputHandler' works only with PolyaxonLogger")metrics=self._setup_output_metrics_state_attrs(engine,key_tuple=False)global_step=self.global_step_transform(engine,event_name)ifnotisinstance(global_step,int):raiseTypeError(f"global_step must be int, got {type(global_step)}."" Please check the output of global_step_transform.")metrics.update({"step":global_step})logger.log_metrics(**metrics)
[docs]classOptimizerParamsHandler(BaseOptimizerParamsHandler):"""Helper handler to log optimizer parameters Args: optimizer: torch optimizer or any object with attribute ``param_groups`` as a sequence. param_name: parameter name tag: common title for all produced plots. For example, "generator" Examples: .. code-block:: python from ignite.contrib.handlers.polyaxon_logger import * # Create a logger plx_logger = PolyaxonLogger() # Attach the logger to the trainer to log optimizer's parameters, e.g. learning rate at each iteration plx_logger.attach( trainer, log_handler=OptimizerParamsHandler(optimizer), event_name=Events.ITERATION_STARTED ) # or equivalently plx_logger.attach_opt_params_handler( trainer, event_name=Events.ITERATION_STARTED, optimizer=optimizer ) """def__init__(self,optimizer:Optimizer,param_name:str="lr",tag:Optional[str]=None):super(OptimizerParamsHandler,self).__init__(optimizer,param_name,tag)def__call__(self,engine:Engine,logger:PolyaxonLogger,event_name:Union[str,Events])->None:ifnotisinstance(logger,PolyaxonLogger):raiseRuntimeError("Handler OptimizerParamsHandler works only with PolyaxonLogger")global_step=engine.state.get_event_attrib_value(event_name)tag_prefix=f"{self.tag}/"ifself.tagelse""params={f"{tag_prefix}{self.param_name}/group_{i}":float(param_group[self.param_name])fori,param_groupinenumerate(self.optimizer.param_groups)}params["step"]=global_steplogger.log_metrics(**params)