Storing data science artifacts#

skore provides a Project class to store data science artifacts. The storage is either local or remote, based on the value passed to the parameter mode at initialization. When mode is set to hub, the project is configured to communicate with skore hub. Refer to the documentation of Project for the detailed API and take a look on the example.

Creating a project#

All modes share the same constructor shape: pass name, mode, and any mode-specific keyword arguments.

from pathlib import Path
from skore import Project

# Local persistence
project_local = Project(name="my-xp", mode="local", workspace=Path("/tmp/skore"))

# Skore Hub (requires skore.login() first)
project_hub = Project(name="my-xp", mode="hub", workspace="my-workspace")

# MLflow experiment
project_mlflow = Project(
    name="my-experiment",
    mode="mlflow",
    tracking_uri="http://localhost:5000",
)

Working with reports#

Once a project is created, store EstimatorReport via the method Project.put().

To retrieve the reports stored in the project, use the project summary by calling the method Project.summarize(). This method returns a Summary object that holds the metadata and metrics of the stored reports and renders as an interactive table in Jupyter-like environments. Reports are listed in ascending order of their date.

The interactive view provides different views to sort, group by, and filter the reports; the selection produces a query string ready to pass to Summary.query(...). Once the reports are filtered, retrieve them by calling the compare method on the object returned by Project.summarize(). This method returns a list of EstimatorReport instances (or a ComparisonReport when called with return_as="report").

To retrieve a specific report for which you have its id (as returned by Project.summarize()), use the Project.get() method.

Synchronizing projects#

Use Project.sync() to transfer reports between projects. The project on which the method is called is the source.

project_hub = Project(
    name=project_local.name,
    mode="hub",
    workspace="my-workspace",
)
result = project_local.sync(project_hub)

The caller is the source; reverse the call for the opposite direction. Set bidirectional=True to transfer missing reports in both directions.

When both projects have the same name, pass the destination mode as a shortcut. The destination is built with the caller’s name and the supplied mode-specific arguments.

result = project_local.sync("hub", workspace="my-workspace")

Reports are matched using the report_id column returned by Project.summarize().frame() and copied with their keys. Existing IDs are skipped; contents and metadata are not compared. Reports without a report_id are ignored. Set dry_run=True to return the transfer plan without loading or storing reports.

The returned pandas.DataFrame is indexed by report_id. Its direction column is "outbound" from the caller to the other project, "inbound" from the other project to the caller, or missing when a report is skipped. Its status column is "planned", "transferred", or "skipped".

Note

Two MLflow projects must use the same tracking URI because MLflow uses process-global tracking state. Synchronization does not provide concurrency control.