def log_html(self, name, html, step=None, timestamp=None): """Logs an html. ```python >>> log_html(name="text", html="<p>value</p>") ``` Args: name: str, name html: str, text value step: int, optional timestamp: datetime, optional """ self._log_has_events() logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.HTML, event=V1Event.make(timestamp=timestamp, step=step, html=html), ) self._add_event(logged_event)
def log_text(self, name, text, step=None, timestamp=None): """Logs a text. ```python >>> log_text(name="text", text="value") ``` Args: name: str, name text: str, text value step: int, optional timestamp: datetime, optional """ self._log_has_events() logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.TEXT, event=V1Event.make(timestamp=timestamp, step=step, text=text), ) self._add_event(logged_event)
def log_dataframe(self, path, name=None, content_type=None, step=None, timestamp=None): """Logs a dataframe. Args: path: path to the dataframe saved as file name: str, optional, if not provided the name of the file will be used content_type: str, optional step: int, optional timestamp: datetime, optional """ self._log_has_events() name = name or os.path.basename(path) ext = get_path_extension(filepath=path) asset_path = get_asset_path( run_path=self._artifacts_path, kind=V1ArtifactKind.DATAFRAME, name=name, step=step, ext=ext, ) asset_rel_path = os.path.relpath(asset_path, self._artifacts_path) df = events_processors.dataframe_path( from_path=path, asset_path=asset_path, content_type=content_type, asset_rel_path=asset_rel_path, ) logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.DATAFRAME, event=V1Event.make(timestamp=timestamp, step=step, dataframe=df), ) self._event_logger.add_event(logged_event)
def log_dataframe( self, path, name=None, content_type=None, step=None, timestamp=None ): name = name or os.path.basename(path) ext = get_path_extension(filepath=path) asset_path = get_asset_path( run_path=self.artifacts_path, kind=V1ArtifactKind.DATAFRAME, name=name, step=step, ext=ext, ) df = events_processors.dataframe_path( from_path=path, asset_path=asset_path, content_type=content_type ) logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.DATAFRAME, event=V1Event(timestamp=timestamp, step=step, dataframe=df), ) self._event_logger.add_event(logged_event)
def log_histogram(self, name, values, bins, max_bins=None, step=None, timestamp=None): event_value = events_processors.histogram(values=values, bins=bins, max_bins=max_bins) if event_value == UNKNOWN: return logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.HISTOGRAM, event=V1Event(timestamp=timestamp, step=step, histogram=event_value), ) self._event_logger.add_event(logged_event)
def log_artifact( self, path, name=None, artifact_kind=None, step=None, timestamp=None ): """Logs a generic artifact. Args: path: str, path to the artifact name: str, optional, if not provided the name of the file will be used artifact_kind: optional, str step: int, optional timestamp: datetime, optional """ self._log_has_events() name = name or get_base_filename(path) ext = get_path_extension(filepath=path) artifact_kind = artifact_kind or V1ArtifactKind.FILE asset_path = get_asset_path( run_path=self._artifacts_path, kind=artifact_kind, name=name, step=step, ext=ext, ) asset_rel_path = os.path.relpath(asset_path, self._artifacts_path) artifact = events_processors.artifact_path( from_path=path, asset_path=asset_path, kind=artifact_kind, asset_rel_path=asset_rel_path, ) logged_event = LoggedEventSpec( name=name, kind=artifact_kind, event=V1Event.make(timestamp=timestamp, step=step, artifact=artifact), ) self._add_event(logged_event)
def log_np_histogram(self, name, values, counts, step=None, timestamp=None): self._log_dashboard() event_value = events_processors.np_histogram(values=values, counts=counts) if event_value == UNKNOWN: return logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.HISTOGRAM, event=V1Event.make(timestamp=timestamp, step=step, histogram=event_value), ) self._event_logger.add_event(logged_event)
def log_curve(self, name, x, y, annotation=None, step=None, timestamp=None): self._log_dashboard() event_value = events_processors.curve( x=x, y=y, annotation=annotation, ) logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.CURVE, event=V1Event.make(timestamp=timestamp, step=step, curve=event_value), ) self._event_logger.add_event(logged_event)
def log_pr_curve(self, name, precision, recall, average_precision=None, step=None, timestamp=None): self._log_dashboard() event_value = events_processors.pr_curve( precision=precision, recall=recall, average_precision=average_precision, ) logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.CURVE, event=V1Event.make(timestamp=timestamp, step=step, curve=event_value), ) self._event_logger.add_event(logged_event)
def log_roc_auc_curve(self, name, fpr, tpr, auc=None, step=None, timestamp=None): self._log_dashboard() event_value = events_processors.roc_auc_curve( fpr=fpr, tpr=tpr, auc=auc, ) logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.CURVE, event=V1Event.make(timestamp=timestamp, step=step, curve=event_value), ) self._event_logger.add_event(logged_event)
def log_image_with_boxes( self, tensor_image, tensor_boxes, name=None, step=None, timestamp=None, rescale=1, dataformats="CHW", ): self._log_dashboard() name = name or "figure" asset_path = get_asset_path( run_path=self.artifacts_path, kind=V1ArtifactKind.IMAGE, name=name, step=step, ) asset_rel_path = os.path.relpath(asset_path, self.artifacts_path) event_value = events_processors.image_boxes( asset_path=asset_path, tensor_image=tensor_image, tensor_boxes=tensor_boxes, rescale=rescale, dataformats=dataformats, asset_rel_path=asset_rel_path, ) if event_value == UNKNOWN: return logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.IMAGE, event=V1Event.make(timestamp=timestamp, step=step, image=event_value), ) self._event_logger.add_event(logged_event)
def log_histogram(self, name, values, bins, max_bins=None, step=None, timestamp=None): """Logs a histogram. ```python >>> log_histogram(name="histo", values=np.arange(np.prod((1024,)), dtype=float).reshape((1024,)), bins="auto", step=1) # noqa ``` Args: name: str, name values: np.array bins: int or str max_bins: int, optional step: int, optional timestamp: datetime, optional """ self._log_has_events() event_value = events_processors.histogram(values=values, bins=bins, max_bins=max_bins) if event_value == UNKNOWN: return logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.HISTOGRAM, event=V1Event.make(timestamp=timestamp, step=step, histogram=event_value), ) self._event_logger.add_event(logged_event)
def log_metric(self, name: str, value: float, step: int = None, timestamp=None): """Logs a metric datapoint. ```python >>> log_metric(name="loss", value=0.01, step=10) ``` > It's very important to log `step` as one of your metrics if you want to compare experiments on the dashboard and use the steps in x-axis instead of timestamps. Args: name: str, metric name value: float, metric value step: int, optional timestamp: datetime, optional """ self._log_has_events() events = [] event_value = events_processors.metric(value) if event_value == UNKNOWN: return events.append( LoggedEventSpec( name=name, kind=V1ArtifactKind.METRIC, event=V1Event.make(timestamp=timestamp, step=step, metric=event_value), )) if events: self._event_logger.add_events(events) self._results[name] = event_value
def log_roc_auc_curve(self, name, fpr, tpr, auc=None, step=None, timestamp=None): """Logs ROC/AUC curve. This method expects an already processed values. ```python >>> log_roc_auc_curve("roc_value", fpr, tpr, auc=0.6, step=1) ``` Args: name: str, name of the curve fpr: List[float] or numpy.array, false positive rate tpr: List[float] or numpy.array, true positive rate auc: float, optional, calculated area under curve step: int, optional timestamp: datetime, optional """ self._log_has_events() event_value = events_processors.roc_auc_curve(fpr=fpr, tpr=tpr, auc=auc,) logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.CURVE, event=V1Event.make(timestamp=timestamp, step=step, curve=event_value), ) self._add_event(logged_event)
def log_video( self, data, name=None, fps=4, step=None, timestamp=None, content_type=None ): is_file = isinstance(data, str) and os.path.exists(data) content_type = content_type or "gif" if is_file: name = name or os.path.basename(data) content_type = get_path_extension(filepath=data) or content_type else: name = name or "video" asset_path = get_asset_path( run_path=self.artifacts_path, kind=V1ArtifactKind.VIDEO, name=name, step=step, ext=content_type, ) if is_file: event_value = events_processors.video_path( from_path=data, asset_path=asset_path, content_type=content_type ) else: event_value = events_processors.video( asset_path=asset_path, tensor=data, fps=fps, content_type=content_type ) if event_value == UNKNOWN: return logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.VIDEO, event=V1Event(timestamp=timestamp, step=step, video=event_value), ) self._event_logger.add_event(logged_event)
def log_model( self, path, name=None, framework=None, spec=None, step=None, timestamp=None ): name = name or os.path.basename(path) ext = None if os.path.isfile(path): ext = get_path_extension(filepath=path) asset_path = get_asset_path( run_path=self.artifacts_path, kind=V1ArtifactKind.MODEL, name=name, step=step, ext=ext, ) model = events_processors.model_path( from_path=path, asset_path=asset_path, framework=framework, spec=spec ) logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.MODEL, event=V1Event(timestamp=timestamp, step=step, model=model), ) self._event_logger.add_event(logged_event)
def log_np_histogram(self, name, values, counts, step=None, timestamp=None): """Logs a numpy histogram. ```python >>> values, counts = np.histogram(np.random.randint(255, size=(1000,))) >>> log_np_histogram(name="histo1", values=values, counts=counts, step=1) ``` Args: name: str, name values: np.array counts: np.array step: int, optional timestamp: datetime, optional """ self._log_has_events() event_value = events_processors.np_histogram(values=values, counts=counts) if event_value == UNKNOWN: return logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.HISTOGRAM, event=V1Event.make(timestamp=timestamp, step=step, histogram=event_value), ) self._event_logger.add_event(logged_event)
def log_curve(self, name, x, y, annotation=None, step=None, timestamp=None): """Logs a custom curve. ```python >>> log_curve("pr_value", x, y, annotation="more=info", step=10) ``` Args: name: str, name of the curve x: List[float] or numpy.array y: List[float] or numpy.array annotation: str, optional step: int, optional timestamp: datetime, optional """ self._log_has_events() event_value = events_processors.curve( x=x, y=y, annotation=annotation, ) logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.CURVE, event=V1Event.make(timestamp=timestamp, step=step, curve=event_value), ) self._event_logger.add_event(logged_event)
def log_artifact( self, path, name=None, artifact_kind=None, step=None, timestamp=None ): name = name or os.path.basename(name) ext = get_path_extension(filepath=path) artifact_kind = artifact_kind or V1ArtifactKind.FILE asset_path = get_asset_path( run_path=self.artifacts_path, kind=artifact_kind, name=name, step=step, ext=ext, ) artifact = events_processors.artifact_path( from_path=path, asset_path=asset_path, kind=artifact_kind ) logged_event = LoggedEventSpec( name=name, kind=artifact_kind, event=V1Event(timestamp=timestamp, step=step, artifact=artifact), ) self._event_logger.add_event(logged_event)
def log_audio( self, data, name=None, sample_rate=44100, step=None, timestamp=None, content_type=None, ): """Logs a audio. ```python >>> log_audio("path/to/my_audio1"), >>> log_audio(name="my_audio2", data=np.arange(np.prod((42,)), dtype=float).reshape((42,))) ``` Args: data: str or audio data name: str, optional, if data is a filepath the name will be the name of the file sample_rate: int, optional, sample rate in Hz step: int, optional timestamp: datetime, optional content_type: str, optional, default "wav" """ self._log_has_events() is_file = isinstance(data, str) and os.path.exists(data) ext = content_type or "wav" if is_file: name = name or os.path.basename(data) ext = get_path_extension(filepath=data) or ext else: name = name or "audio" asset_path = get_asset_path( run_path=self._artifacts_path, kind=V1ArtifactKind.AUDIO, name=name, step=step, ext=ext, ) asset_rel_path = os.path.relpath(asset_path, self._artifacts_path) if is_file: event_value = events_processors.audio_path( from_path=data, asset_path=asset_path, content_type=content_type, asset_rel_path=asset_rel_path, ) else: event_value = events_processors.audio( asset_path=asset_path, tensor=data, sample_rate=sample_rate, asset_rel_path=asset_rel_path, ) if event_value == UNKNOWN: return logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.AUDIO, event=V1Event.make(timestamp=timestamp, step=step, audio=event_value), ) self._event_logger.add_event(logged_event)
def log_video(self, data, name=None, fps=4, step=None, timestamp=None, content_type=None): """Logs a video. ```python >>> log_video("path/to/my_video1"), >>> log_video(name="my_vide2", data=np.arange(np.prod((4, 3, 1, 8, 8)), dtype=float).reshape((4, 3, 1, 8, 8))) # noqa ``` Args: data: video data or str. name: str, optional, if data is a filepath the name will be the name of the file fps: int, optional, frames per second step: int, optional timestamp: datetime, optional content_type: str, optional, default "gif" """ self._log_has_events() is_file = isinstance(data, str) and os.path.exists(data) content_type = content_type or "gif" if is_file: name = name or os.path.basename(data) content_type = get_path_extension(filepath=data) or content_type else: name = name or "video" asset_path = get_asset_path( run_path=self._artifacts_path, kind=V1ArtifactKind.VIDEO, name=name, step=step, ext=content_type, ) asset_rel_path = os.path.relpath(asset_path, self._artifacts_path) if is_file: event_value = events_processors.video_path( from_path=data, asset_path=asset_path, content_type=content_type, asset_rel_path=asset_rel_path, ) else: event_value = events_processors.video( asset_path=asset_path, tensor=data, fps=fps, content_type=content_type, asset_rel_path=asset_rel_path, ) if event_value == UNKNOWN: return logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.VIDEO, event=V1Event.make(timestamp=timestamp, step=step, video=event_value), ) self._event_logger.add_event(logged_event)
def log_image(self, data, name=None, step=None, timestamp=None, rescale=1, dataformats="CHW"): """Logs an image. ```python >>> log_image(data="path/to/image.png", step=10) >>> log_image(data=np_array, name="generated_image", step=10) ``` Args: data: str or numpy.array, a file path or numpy array name: str, name of the image, if a path is passed this can be optional and the name of the file will be used step: int, optional timestamp: datetime, optional rescale: int, optional dataformats: str, optional """ self._log_has_events() is_file = isinstance(data, str) and os.path.exists(data) ext = "png" if is_file: name = name or os.path.basename(data) ext = get_path_extension(filepath=data) or ext else: name = name or "image" asset_path = get_asset_path( run_path=self._artifacts_path, kind=V1ArtifactKind.IMAGE, name=name, step=step, ext=ext, ) asset_rel_path = os.path.relpath(asset_path, self._artifacts_path) if is_file: event_value = events_processors.image_path(from_path=data, asset_path=asset_path) elif hasattr(data, "encoded_image_string"): event_value = events_processors.encoded_image( asset_path=asset_path, data=data, asset_rel_path=asset_rel_path, ) else: event_value = events_processors.image( asset_path=asset_path, data=data, rescale=rescale, dataformats=dataformats, asset_rel_path=asset_rel_path, ) if event_value == UNKNOWN: return logged_event = LoggedEventSpec( name=name, kind=V1ArtifactKind.IMAGE, event=V1Event.make(timestamp=timestamp, step=step, image=event_value), ) self._event_logger.add_event(logged_event)