Skip to main content

"Experimaestro is a computer science experiment manager"

Project description

PyPI version

Experimaestro is a computer science experiment manager whose goals are:

  • To decompose experiments into a set of parameterizable tasks
  • Schedule tasks and handle dependencies between tasks
  • Avoids to re-run the same task two times by computing unique task IDs dependending on the parameters
  • Handle experimental parameters through tags

Full documentation can be found in https://experimaestro.github.io/experimaestro-python/

Install

With pip

You can then install the package using pip install experimaestro

Develop

Checkout the git directory, then

pip install -e .

Example

This very simple example shows how to submit two tasks that concatenate two strings. Under the curtain,

  • A directory is created for each task (in workdir/jobs/helloworld.add/HASHID) based on a unique ID computed from the parameters
  • Two processes for Say are launched (there are no dependencies, so they will be run in parallel)
  • A tag y is created for the main task
# --- Task and types definitions

import logging
from pathlib import Path
from experimaestro import *
import click
import time
import os
from typing import List

# --- Just to be able to monitor the tasks

def slowdown(N: int):
    for i in range(N):
        time.sleep(float(os.environ.get("XPM_EXAMPLE_WAIT", 2)))
        progress((i+1)/N)


# --- Define the tasks

hw = Identifier("helloworld")

@argument("word", type=str, required=True, help="Word to generate")
@task(hw.say)
def Say(word: str):
    slowdown(len(word))
    print(word.upper(),)

@argument("strings", type=List[Say], help="Strings to concat")
@task(hw.concat)
def Concat(strings: List[Say]):
    # We access the file where standard output was stored
    says = []
    slowdown(len(strings))
    for string in strings:
        with open(string.stdout()) as fp:
            says.append(fp.read().strip())
    print(" ".join(says))


# --- Defines the experiment

@click.option("--debug", is_flag=True, help="Print debug information")
@click.option("--port", type=int, default=12345, help="Port for monitoring")
@click.argument("workdir", type=Path)
@click.command()
def cli(port, workdir, debug):
    """Runs an experiment"""
    logging.getLogger().setLevel(logging.DEBUG if debug else logging.INFO)

    # Sets the working directory and the name of the xp
    with experiment(workdir, "helloworld", port=12345) as xp:
        # Submit the tasks
        hello = Say(word="hello").submit()
        world = Say(word="world").submit()

        # Concat will depend on the two first tasks
        Concat(strings=[hello, world]).tag("y", 1).submit()


if __name__ == "__main__":
    cli()

which can be launched with python test.py /tmp/helloworld-workdir

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for experimaestro, version 0.7.2
Filename, size File type Python version Upload date Hashes
Filename, size experimaestro-0.7.2-py2.py3-none-any.whl (3.4 MB) File type Wheel Python version py2.py3 Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page