| import os |
| import warnings |
| import webbrowser |
| from pathlib import Path |
| from typing import Any |
|
|
| from gradio_client import Client |
|
|
| from trackio import context_vars, deploy, utils |
| from trackio.imports import import_csv, import_tf_events |
| from trackio.run import Run |
| from trackio.sqlite_storage import SQLiteStorage |
| from trackio.ui import demo |
| from trackio.utils import TRACKIO_DIR, TRACKIO_LOGO_DIR |
|
|
| __version__ = Path(__file__).parent.joinpath("version.txt").read_text().strip() |
|
|
| __all__ = ["init", "log", "finish", "show", "import_csv", "import_tf_events"] |
|
|
|
|
| config = {} |
|
|
|
|
| def init( |
| project: str, |
| name: str | None = None, |
| space_id: str | None = None, |
| dataset_id: str | None = None, |
| config: dict | None = None, |
| resume: str = "never", |
| settings: Any = None, |
| ) -> Run: |
| """ |
| Creates a new Trackio project and returns a Run object. |
| |
| Args: |
| project: The name of the project (can be an existing project to continue tracking or a new project to start tracking from scratch). |
| name: The name of the run (if not provided, a default name will be generated). |
| space_id: If provided, the project will be logged to a Hugging Face Space instead of a local directory. Should be a complete Space name like "username/reponame" or "orgname/reponame", or just "reponame" in which case the Space will be created in the currently-logged-in Hugging Face user's namespace. If the Space does not exist, it will be created. If the Space already exists, the project will be logged to it. |
| dataset_id: If a space_id is provided, a persistent Hugging Face Dataset will be created and the metrics will be synced to it every 5 minutes. Specify a Dataset with name like "username/datasetname" or "orgname/datasetname", or "datasetname" (uses currently-logged-in Hugging Face user's namespace), or None (uses the same name as the Space but with the "_dataset" suffix). If the Dataset does not exist, it will be created. If the Dataset already exists, the project will be appended to it. |
| config: A dictionary of configuration options. Provided for compatibility with wandb.init() |
| resume: Controls how to handle resuming a run. Can be one of: |
| - "must": Must resume the run with the given name, raises error if run doesn't exist |
| - "allow": Resume the run if it exists, otherwise create a new run |
| - "never": Never resume a run, always create a new one |
| settings: Not used. Provided for compatibility with wandb.init() |
| """ |
| if settings is not None: |
| warnings.warn( |
| "* Warning: settings is not used. Provided for compatibility with wandb.init(). Please create an issue at: https://github.com/gradio-app/trackio/issues if you need a specific feature implemented." |
| ) |
|
|
| if space_id is None and dataset_id is not None: |
| raise ValueError("Must provide a `space_id` when `dataset_id` is provided.") |
| space_id, dataset_id = utils.preprocess_space_and_dataset_ids(space_id, dataset_id) |
| url = context_vars.current_server.get() |
|
|
| if url is None: |
| if space_id is None: |
| _, url, _ = demo.launch( |
| show_api=False, |
| inline=False, |
| quiet=True, |
| prevent_thread_lock=True, |
| show_error=True, |
| ) |
| else: |
| url = space_id |
| context_vars.current_server.set(url) |
|
|
| if ( |
| context_vars.current_project.get() is None |
| or context_vars.current_project.get() != project |
| ): |
| print(f"* Trackio project initialized: {project}") |
|
|
| if dataset_id is not None: |
| os.environ["TRACKIO_DATASET_ID"] = dataset_id |
| print( |
| f"* Trackio metrics will be synced to Hugging Face Dataset: {dataset_id}" |
| ) |
| if space_id is None: |
| print(f"* Trackio metrics logged to: {TRACKIO_DIR}") |
| utils.print_dashboard_instructions(project) |
| else: |
| deploy.create_space_if_not_exists(space_id, dataset_id) |
| print( |
| f"* View dashboard by going to: {deploy.SPACE_URL.format(space_id=space_id)}" |
| ) |
| context_vars.current_project.set(project) |
|
|
| client = None |
| if not space_id: |
| client = Client(url, verbose=False) |
|
|
| if resume == "must": |
| if name is None: |
| raise ValueError("Must provide a run name when resume='must'") |
| if name not in SQLiteStorage.get_runs(project): |
| raise ValueError(f"Run '{name}' does not exist in project '{project}'") |
| elif resume == "allow": |
| if name is not None and name in SQLiteStorage.get_runs(project): |
| print(f"* Resuming existing run: {name}") |
| elif resume == "never": |
| if name is not None and name in SQLiteStorage.get_runs(project): |
| name = None |
| else: |
| raise ValueError("resume must be one of: 'must', 'allow', or 'never'") |
|
|
| run = Run( |
| url=url, |
| project=project, |
| client=client, |
| name=name, |
| config=config, |
| ) |
| context_vars.current_run.set(run) |
| globals()["config"] = run.config |
| return run |
|
|
|
|
| def log(metrics: dict, step: int | None = None) -> None: |
| """ |
| Logs metrics to the current run. |
| |
| Args: |
| metrics: A dictionary of metrics to log. |
| step: The step number. If not provided, the step will be incremented automatically. |
| """ |
| run = context_vars.current_run.get() |
| if run is None: |
| raise RuntimeError("Call trackio.init() before log().") |
| run.log(metrics) |
|
|
|
|
| def finish(): |
| """ |
| Finishes the current run. |
| """ |
| run = context_vars.current_run.get() |
| if run is None: |
| raise RuntimeError("Call trackio.init() before finish().") |
| run.finish() |
|
|
|
|
| def show(project: str | None = None): |
| """ |
| Launches the Trackio dashboard. |
| |
| Args: |
| project: The name of the project whose runs to show. If not provided, all projects will be shown and the user can select one. |
| """ |
| _, url, share_url = demo.launch( |
| show_api=False, |
| quiet=True, |
| inline=False, |
| prevent_thread_lock=True, |
| favicon_path=TRACKIO_LOGO_DIR / "trackio_logo_light.png", |
| allowed_paths=[TRACKIO_LOGO_DIR], |
| ) |
| base_url = share_url + "/" if share_url else url |
| dashboard_url = base_url + f"?project={project}" if project else base_url |
| print(f"* Trackio UI launched at: {dashboard_url}") |
| webbrowser.open(dashboard_url) |
| utils.block_except_in_notebook() |
|
|