Skip to content

Hyperdrive Usage

Description

This example computes hyperdrive usage in a workspace.

Useful snippets:

  • Extract / compute duration, start time and end time from runs
  • Check run types

Example

Connect to the relevant workspace.

from azureml.core import Workspace
ws = Workspace.from_config()

Utility methods used to extract duration and start time from a run.

from datetime import datetime

def to_datetime(s):
    return datetime.strptime(s, '%Y-%m-%dT%H:%M:%S.%fZ')

def get_duration_and_start(run):
    try:
        details = run.get_details()
        start = to_datetime(details['startTimeUtc'])
        end = to_datetime(details['endTimeUtc'])
        duration = end-start
        return duration.total_seconds(), start
    except:
        raise ValueError(f"Error getting duration from {run.id}")

We then find a list of all experiments which include at least one hyperdrive run.

This can be slow ⌚

If your workspace has a lot of experiments/runs, this can be quite slow.

# get all experiments which include a hyperdrive run
hyperdrive_experiments = set()
for exp_name, exp in ws.experiments.items():
    for run in exp.get_runs():
        if run.type == "hyperdrive":
            print(f"Adding {exp_name}")
            hyperdrive_experiments.add(exp_name)
            break

Create a pandas DataFrame to store the relevant information.

import pandas as pd

columns = [
    "start_date",
    "experiment",
    "run_id",
    "duration",
    "n_child_runs",
]

df = pd.DataFrame(columns=columns)

Now run through each hyperdrive experiment and compute duration, number of child runs, adding these data to the DataFrame.

for exp_name in hyperdrive_experiments:
    exp = ws.experiments[exp_name]
    runs = exp.get_runs()
    for run in exp.get_runs():

        if run.type == "hyperdrive":

            duration, start_date = get_duration_and_start(run)
            n_child_runs = len(list(run.get_children()))

            row = {
                "start_date": start_date,
                "experiment": exp_name,
                "run_id": run.id,
                "duration": duration,
                "n_child_runs": n_child_runs,
            }

            print(f"Adding {row}")

            df = df.append(row, ignore_index=True)

Finally, save these results to csv.

df.to_csv("hyperdrive-usage.csv", index=False)