o
    8wi;                     @   s   d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZ ddlmZ erbddlmZm Z m!Z! e"e#Z$edddZ%dZ&ed Z'G dd deZ(dS )z
Comet Logger
------------
    N)	Namespace)Mapping)TYPE_CHECKINGAnyLiteralOptionalUnion)RequirementCache)Tensor)Module)override)_convert_params)	_get_rank)Loggerrank_zero_experiment)rank_zero_only)ExistingExperiment
ExperimentOfflineExperimentzcomet-ml>=3.44.4comet_ml)modulezpytorch-lightning)r   r   r   c                       s  e Zd ZdZdddddddddee dee dee dee deed	  d
ee dee def fddZ	d*ddZ
eedefddZeedeeeef ef ddfddZeed+deeeeef f dee ddfddZeededdfddZeedee fddZeedee fd d!Zeedee fd"d#Zdeeef fd$d%Zed+d&ed'ee ddfd(d)Z   Z!S ),CometLoggera  Track your parameters, metrics, source code and more using `Comet
    <https://www.comet.com/?utm_source=pytorch_lightning&utm_medium=referral>`_.

    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"),  # Optional
            workspace=os.environ.get("COMET_WORKSPACE"),  # Optional
            project="default_project",  # Optional
            experiment_key=os.environ.get("COMET_EXPERIMENT_KEY"),  # Optional
            name="lightning_logs",  # 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(
            workspace=os.environ.get("COMET_WORKSPACE"),  # Optional
            project="default_project",  # Optional
            name="lightning_logs",  # Optional
            online=False
        )
        trainer = Trainer(logger=comet_logger)

    **Log Hyperparameters:**

    Log parameters used to initialize a :class:`~pytorch_lightning.core.LightningModule`:

    .. code-block:: python

        class LitModule(LightningModule):
            def __init__(self, *args, **kwarg):
                self.save_hyperparameters()

    Log other Experiment Parameters

    .. code-block:: python

        # log a single parameter
        logger.log_hyperparams({"batch_size": 16})

        # log multiple parameters
        logger.log_hyperparams({"batch_size": 16, "learning_rate": 0.001})

        # log nested parameters
        logger.log_hyperparams({"specific": {'param': {'subparam': "value"}}})

    **Log Metrics:**

    .. code-block:: python

        # log a single metric
        logger.log_metrics({"train/loss": 0.001})

        # add multiple metrics
        logger.log_metrics({"train/loss": 0.001, "val/loss": 0.002})

        # add nested metrics
        logger.log_metrics({"specific": {'metric': {'submetric': "value"}}})

    **Access the Comet Experiment object:**

    You can gain access to the underlying Comet
    `Experiment <https://www.comet.com/docs/v2/api-and-sdk/python-sdk/reference/Experiment/>`__ object
    and its methods through the :obj:`logger.experiment` property. This will let you use
    the additional logging features provided by the Comet SDK.

    Some examples of data you can log through the Experiment object:

    Log Image data:

    .. code-block:: python

        img = PIL.Image.open("<path to image>")
        logger.experiment.log_image(img, file_name="my_image.png")

    Log Text data:

    .. code-block:: python

        text = "Lightning is awesome!"
        logger.experiment.log_text(text)

    Log Audio data:

    .. code-block:: python

        audio = "<path to audio data>"
        logger.experiment.log_audio(audio, file_name="my_audio.wav")

    Log arbitrary data assets:

    You can log any type of data to Comet as an asset. These can be model
    checkpoints, datasets, debug logs, etc.

    .. code-block:: python

        logger.experiment.log_asset("<path to your asset>", file_name="my_data.pkl")

    Log Models to Comet's Model Registry:

    .. code-block:: python

        logger.experiment.log_model(name="my-model", "<path to your model>")

    See Also:
        - `Demo in Google Colab <https://tinyurl.com/22phzw5s>`__
        - `Comet Documentation <https://www.comet.com/docs/v2/integrations/ml-frameworks/pytorch-lightning/>`__

    Args:
        api_key: Comet API key. It's recommended to configure the API Key with `comet login`.
        workspace: Comet workspace name. If not provided, uses the default workspace.
        project: Comet project name. Defaults to `Uncategorized`.
        experiment_key: The Experiment identifier to be used for logging. This is used either to append
            data to an Existing Experiment or to control the key of new experiments (for example to match another
            identifier). Must be an alphanumeric string whose length is between 32 and 50 characters.
        mode: Control how the Comet experiment is started.
            * ``"get_or_create"``: Starts a fresh experiment if required, or persists logging to an existing one.
            * ``"get"``: Continue logging to an existing experiment identified by the ``experiment_key`` value.
            * ``"create"``: Always creates of a new experiment, useful for HPO sweeps.
        online: If True, the data will be logged to Comet server, otherwise it will be stored
            locally in an offline experiment. Default is ``True``.
        prefix: The prefix to add to names of the logged metrics.
            example: prefix=`exp1`, then metric name will be logged as `exp1_metric_name`
        **kwargs: Additional arguments like `name`, `log_code`, `offline_directory` etc. used by
            :class:`CometExperiment` can be passed as keyword arguments in this logger.

    Raises:
        ModuleNotFoundError:
            If required Comet package is not installed on the device.

    N)api_key	workspaceprojectexperiment_keymodeonlineprefixr   r   r   r   r   )get_or_creategetcreater   r   kwargsc                   s~  t sttt t   d|v r)td |d}	d|vr$|	|d< ntd d|v rAtd |d u r<|d}ntd d|v rYtd	 |d u rT|d}ntd
 d|v rstd d|vrn|d|d< ntd || _d | _	|| _
|| _|| _|| _|| _|| _|| _dtjd< dd l}
| j }|du rd|d< |
jdi || _t d urt dkrd S |   d S )Nexperiment_namezIThe parameter `experiment_name` is deprecated, please use `name` instead.namezRYou specified both `experiment_name` and `name` parameters, please use `name` onlyproject_namezIThe parameter `project_name` is deprecated, please use `project` instead.zUYou specified both `project_name` and `project` parameters, please use `project` onlyofflinezBThe parameter `offline is deprecated, please use `online` instead.zNYou specified both `offline` and `online` parameters, please use `online` onlysave_dirzOThe parameter `save_dir` is deprecated, please use `offline_directory` instead.offline_directoryzeYou specified both `save_dir` and `offline_directory` parameters, please use `offline_directory` only1COMET_DISABLE_AUTO_LOGGINGr   FTdisabled )_COMET_AVAILABLEModuleNotFoundErrorstrsuper__init__logwarningpop_api_key_experiment
_workspace_mode_online_project_name_experiment_key_prefix_kwargsosenvironr   copyExperimentConfig_comet_configr   _create_experiment)selfr   r   r   r   r   r   r   r"   r#   r   config_kwargs	__class__r,   \/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/pytorch_lightning/loggers/comet.pyr1      sX   











zCometLogger.__init__returnc              	   C   sn   dd l }|j| j| j| j| j| j| j| jd| _	| j	d u r#|j
d| j	 | _| j	j| _| j	dt d S )Nr   )r   r   r   r   r   r   experiment_configz"Failed to create Comet experiment.zCreated from)r   startr5   r7   r:   r;   r8   r9   rB   r6   
exceptionsExperimentNotFoundget_keyr%   	log_otherFRAMEWORK_NAME)rD   r   r,   r,   rH   rC     s   


zCometLogger._create_experimentc                 C   s   | j s|   | j S )zActual Comet object. To use Comet features in your :class:`~pytorch_lightning.core.LightningModule` do the
        following.

        Example::

            self.logger.experiment.some_comet_function()

        )r6   rC   rD   r,   r,   rH   
experiment0  s   zCometLogger.experimentparamsc                 C   s    t |}| jj|tddd d S )NTmanual)
parameters	frameworkflatten_nestedsource)r   rR    __internal_api__log_parameters__rP   )rD   rS   r,   r,   rH   log_hyperparamsC  s   
zCometLogger.log_hyperparamsmetricsstepc                 C   sn   t jdks	J d| }| D ]\}}t|tr"|  ||< q|dd }| j	j
|||| jtd d S )Nr   z-experiment tried to log from global_rank != 0epoch)r\   r]   r   rV   )r   rankr@   items
isinstancer
   cpudetachr4   rR   __internal_api__log_metrics__r<   rP   )rD   r[   r\   metrics_without_epochkeyvalr]   r,   r,   rH   log_metricsN  s   

zCometLogger.log_metricsstatusc                 C   s   | j du rdS | j  dS )zWe will not end experiment (will not call self._experiment.end()) here to have an ability to continue using
        it after training is complete but instead of ending we will upload/save all the data.N)r6   rR   flush)rD   rh   r,   r,   rH   finalizea  s   
zCometLogger.finalizec                 C   s   | j jS )z`Gets the save directory.

        Returns:
            The path to the save directory.

        )rB   r(   rQ   r,   r,   rH   r'   n  s   	zCometLogger.save_dirc                 C   s   | j S )zcGets the project name.

        Returns:
            The project name if it is specified.

        )r:   rQ   r,   r,   rH   r$   y  s   	zCometLogger.namec                 C   s   | j dur
| j  S dS )zWGets the version.

        Returns:
            The experiment key if present

        N)r6   rN   rQ   r,   r,   rH   version  s   


zCometLogger.versionc                 C   s2   | j  }| jd ur| j nd |d< d |d< |S )Nr;   r6   )__dict__r@   r6   rN   )rD   stater,   r,   rH   __getstate__  s   
zCometLogger.__getstate__modelinput_arrayc                 C   s"   | j d ur| j j|td d S d S )N)graphrV   )r6   !__internal_api__set_model_graph__rP   )rD   ro   rp   r,   r,   rH   	log_graph  s   

zCometLogger.log_graph)rI   N)N)"__name__
__module____qualname____doc__r   r/   r   boolr   r1   rC   propertyr   comet_experimentrR   r   r   r   dictr   rZ   r   r
   floatintrg   rj   r'   r$   rk   rn   r   rs   __classcell__r,   r,   rF   rH   r   -   sh     
	

U&	0		&r   ))rw   loggingr>   argparser   collections.abcr   typingr   r   r   r   r    lightning_utilities.core.importsr	   torchr
   torch.nnr   typing_extensionsr   !lightning_fabric.utilities.loggerr   $lightning_fabric.utilities.rank_zeror    pytorch_lightning.loggers.loggerr   r   %pytorch_lightning.utilities.rank_zeror   r   r   r   r   	getLoggerrt   r2   r-   rP   rz   r   r,   r,   r,   rH   <module>   s*   
