Using the management system

In practice, rather than managing experiments by executing artiq_run over and over, most use cases are better served by using the ARTIQ management system. This is the high-level application part of ARTIQ, which can be used to schedule experiments, manage devices and parameters, and distribute and store results. It also allows for distributed use of ARTIQ, with a single master coordinating demands on the system issued over the network by multiple clients. Using this system, multiple users on different machines can schedule experiments or analyze results on the same ARTIQ system, potentially simultaneously, without interfering with each other.

The management system consists of at least two parts:

  1. the ARTIQ master, which runs on a single machine, facilitates communication with the core device and peripherals, and is responsible for most of the actual duties of the system,

  2. one or more ARTIQ clients, which may be local or remote and which communicate only with the master. Both a GUI (the dashboard) and a straightforward command line client are provided, with many of the same capabilities.

as well as, optionally,

  1. one or more controller managers, which coordinate the operation of certain (generally, non-realtime) classes of device and provide certain services to the clients,

  2. and one or more instances of the ARTIQ browser, a GUI application designed to facilitate the analysis of experiment results and datasets.

In this tutorial, we will explore the basic operation of the management system. Because the various components of the management system run wholly on the host machine, and not on the core device (in other words, they do not inherently involve any kernel functions), it is not necessary to have a core device or any specialized hardware set up to use it. The examples in this tutorial can all be carried out using only your host computer.

Running your first experiment with the master

Until now, we have executed experiments using artiq_run, which is a simple standalone tool that bypasses the management system. We will now see how to run an experiment using a master and a client. In this arrangement, the master is responsible for communicating with the core device, scheduling and keeping track of experiments, and carrying out RPCs the core device may call for. Clients submit experiments to the master to be scheduled and, if necessary, query the master about the state of experiments and their results.

First, create a folder called ~/artiq-master. Copy into it the device_db.py for your system (your device database, exactly as in Getting started with the core device); the master uses the device database in the same way as artiq_run when communicating with the core device.

Tip

Since no devices are actually used in these examples, you can also use a device database in the model of the device_db.py from examples/no_hardware, which uses resources from artiq/sim instead of referencing or requiring any real local hardware.

Secondly, create a subfolder ~/artiq-master/repository to contain experiments. By default, the master scans for a folder of this name to determine what experiments are available; if you’d prefer to use a different name, this can be changed by running artiq_master -r [folder name] instead of artiq_master below. Experiments don’t have to be in the repository to be submitted to the master, but the repository contains those experiments the master is automatically aware of.

Create a very simple experiment in ~/artiq-master/repository and save it as mgmt_tutorial.py:

from artiq.experiment import *

class MgmtTutorial(EnvExperiment):
    """Management tutorial"""
    def build(self):
        pass  # no devices used

    def run(self):
        print("Hello World")

Start the master with:

$ cd ~/artiq-master
$ artiq_master

This command should display ARTIQ master is now ready and not return, as the master keeps running. In another terminal, use the client to request this experiment:

$ artiq_client submit repository/mgmt_tutorial.py

This command should print a message in the format RID: 0, telling you the scheduling ID assigned to the experiment by the master, and exit. Note that it doesn’t matter where the client is run; the client does not require direct access to device_db.py or the repository folder, and only directly communicates with the master. Relatedly, the path to an experiment a client submits is given relative to the location of the master, not the client.

Return to the terminal where the master is running. You should see an output similar to:

INFO:worker(0,mgmt_tutorial.py):print:Hello World

In other words, a worker created by the master has executed the experiment and carried out the print instruction. Congratulations!

Tip

In order to run the master and the clients on different PCs, start the master with a --bind flag:

$ artiq_master --bind [hostname or IP to bind to]

and then use the option --server or -s for clients, as in:

$ artiq_client -s [hostname or IP of the master]
$ artiq_dashboard -s [hostname or IP of the master]

Both IPv4 and IPv6 are supported. See also the individual references artiq_master, artiq_dashboard, and artiq_client for more details.

You may also notice that the master has created some other organizational files in its home directory, notably a folder results, where a HDF5 record is preserved of every experiment that is submitted and run. The files in results will be discussed in greater detail in Data and user interfaces.

Running the dashboard and controller manager

Submitting experiments with artiq_client has some interesting qualities: for instance, experiments can be requested simultaneously by different clients and be relied upon to execute cleanly in sequence, which is useful in a distributed context. On the other hand, on an local level, it doesn’t necessarily carry many practical advantages over using artiq_run. The real convenience of the management system lies in its GUI, the dashboard. We will now try submitting an experiment using the dashboard.

First, start the controller manager:

$ artiq_ctlmgr

Like the master, this command should not return, as the controller manager keeps running. Note that the controller manager requires access to the device database, but not in the local directory – it gets that access automatically by connecting to the master.

Note

We will not be using controllers in this part of the tutorial. Nonetheless, the dashboard will expect to be able to contact certain controllers given in the device database, and print error messages if this isn’t the case (e.g. Is aqctl_moninj_proxy running?). It is equally possible to check your device database and start the requisite controllers manually, or to temporarily delete their entries from device_db.py, but it’s normally quite convenient to let the controller manager handle things. The role and use of controller managers will be covered in more detail in Data and user interfaces.

In a third terminal, start the dashboard:

$ artiq_dashboard

Like artiq_client, the dashboard requires no direct access to the device database or the repository. It communicates with the master to receive information about available experiments and the state of the system.

You should see the list of experiments from the repository in the dock called ‘Explorer’. In our case, this will only be the single experiment we created, listed by the name we gave it in the docstring inside the triple quotes, “Management tutorial”. Select it, and in the window that opens, click ‘Submit’.

This time you will find the output displayed directly in the dock called ‘Log’. The dashboard log combines the master’s console output, the dashboard’s own logs, and the device logs of the core device itself (if there is one in use); normally, this is the only log it’s necessary to check.

Adding a new experiment

Create a new file in your repository folder, called timed_tutorial.py:

from artiq.experiment import *
import time

class TimedTutorial(EnvExperiment):
    """Timed tutorial"""
    def build(self):
        pass  # no devices used

    def run(self):
        print("Hello World")
        time.sleep(10)
        print("Goodnight World")

Save it. You will notice that it does not immediately appear in the ‘Explorer’ dock. For stability reasons, the master operates with a cached idea of the repository, and changes in the file system will often not be reflected until a repository rescan is triggered.

You can ask it to do this through the command-line client:

$ artiq_client scan-repository

or you can right-click in the Explorer and select ‘Scan repository HEAD’. Now you should be able to select and submit the new experiment.

If you switch the ‘Log’ dock to its ‘Schedule’ tab while the experiment is still running, you will see the experiment appear, displaying its RID, status, priority, and other information. Click ‘Submit’ again while the first experiment is in progress, and a second iteration of the experiment will appear in the Schedule, queued up to execute next in line.

Note

You may have noted that experiments can be submitted with a due date, a priority level, a pipeline identifier, and other specific settings. Some of these are self-explanatory. Many are scheduling-related. For more information on experiment scheduling, see Experiment scheduling.

In the meantime, you can try out submitting either of the two experiments with different priority levels and take a look at the queues that ensue. If you are interested, you can try submitting experiments through the command line client at the same time, or even open a second dashboard in a different terminal. Observe that no matter the source, all submitted experiments will be accounted for and handled by the scheduler in an orderly way.

Adding arguments

Experiments may have arguments, values which can be set in the dashboard on submission and used in the experiment’s code. Create a new experiment called argument_tutorial.py, and give it the following build() and run() functions:

def build(self):
    self.setattr_argument("count", NumberValue(precision=0, step=1))

def run(self):
    for i in range(self.count):
        print("Hello World", i)

The method setattr_argument() acts to set the argument and make its value accessible, similar to the effect of setattr_device(). The second input sets the type of the argument; here, NumberValue represents a floating point numerical value. To learn what other types are supported, see artiq.language.environment and artiq.language.scan.

Rescan the repository as before. Open the new experiment in the dashboard. Above the submission options, you should now see a spin box that allows you to set the value of count. Try setting it and submitting it.

Interactive arguments

With standard arguments, it is only possible to use setattr_argument() in build(); these arguments are always requested at submission time. However, it is also possible to use interactive arguments, which can be requested and supplied inside run(), while the experiment is being executed. Modify the experiment as follows (and push the result):

def build(self):
    pass

def run(self):
    repeat = True
    while repeat:
        print("Hello World")
        with self.interactive(title="Repeat?") as interactive:
            interactive.setattr_argument("repeat", BooleanValue(True))
        repeat = interactive.repeat

Close and reopen the submission window, or click on the button labeled ‘Recompute all arguments’, in order to update the submission parameters. Submit again. It should print once, then wait; you may notice in ‘Schedule’ that the experiment does not exit, but hangs at status ‘running’.

Now, in the same dock as ‘Explorer’, navigate to the tab ‘Interactive Args’. You can now choose and submit a value for ‘repeat’. Every time an interactive argument is requested, the experiment pauses until an input is supplied.

Note

If you choose to ‘Cancel’ instead, an CancelledArgsError will be raised (which an experiment can catch, instead of halting).

In order to request and supply multiple interactive arguments at once, simply place them in the same with block; see also the example interactive.py in examples/no_hardware.

Setting up Git integration

So far, we have used the bare filesystem for the experiment repository, without any version control. Using Git to host the experiment repository helps with tracking modifications to experiments and with the traceability to a particular version of an experiment.

Note

The workflow we will describe in this tutorial is designed for a situation where the computer running the ARTIQ master is also used as a Git server to which multiple users may contribute code. This is not the only way Git integration can be useful, and the setup can be customized according to your needs. The main point to remember is that when scanning or submitting, the ARTIQ master uses the internal Git data, not any checked-out files that may be present, to fetch the latest fully completed commit at the repository’s head. See also Git integration, especially if you are unfamiliar with Git.

We will use our current repository folder as the working directory for making local modifications to the experiments, move it away from the master’s data directory, and replace it with a new repository folder, which will hold only the Git data used by the master. Stop the master with Ctrl+C and enter the following commands:

$ cd ~/artiq-master
$ mv repository ~/artiq-work
$ mkdir repository
$ cd repository
$ git init --bare

Now initialize a regular (non-bare) Git repository in our working directory:

$ cd ~/artiq-work
$ git init

Then add and commit our experiments:

$ git add mgmt_tutorial.py
$ git add timed_tutorial.py
$ git commit -m "First version of the tutorial experiments"

and finally, connect the two repositories and push the commit upstream to the master’s repository:

$ git remote add origin ~/artiq-master/repository
$ git push -u origin master

Tip

If you are not familiar with command-line Git and would like to understand these commands in more detail, look for tutorials on the basic use of Git; there are many available online.

Start the master again with the -g flag, which tells it to treat its repository folder as a bare Git repository:

$ cd ~/artiq-master
$ artiq_master -g

Note

Note that you need at least one commit in the repository before the master can be started.

Now you should be able to restart the dashboard and see your experiments there.

To make things more convenient, we will make Git tell the master to rescan the repository whenever new data is pushed from downstream. Create a file ~/artiq-master/repository/hooks/post-receive with the following contents:

#!/bin/sh
artiq_client scan-repository --async

Then set its execution permissions:

$ chmod 755 repository/hooks/post-receive

Note

Remote client machines may also push and pull into the master repository, using e.g. Git over SSH.

Let’s now make a modification to the experiments. In the working directory artiq-work, open mgmt_tutorial.py again and add an exclamation mark to the end of “Hello World”. Before committing it, check that the experiment can still be executed correctly by submitting it directly from the working directory, using the command-line client:

$ artiq_client submit --content ~/artiq-work/mgmt_tutorial.py

Note

The --content flag submits by content, that is, by sending a raw file rather than selecting an experiment from the master’s local environment. Since you are likely running the client and the master on the same machine, it is probably not strictly necessary here. In a distributed setup across multiple machines, the master will not have access to the client’s filesystem, and the --content flag is the only way to run experiments directly from a client file. See also Submission from the raw filesystem.

Verify the log in the GUI. If you are happy with the result, commit the new version and push it into the master’s repository:

$ cd ~/artiq-work
$ git commit -a -m "More enthusiasm"
$ git push

Notice that commands other than git commit and git push are no longer necessary. The Git hook should cause a repository rescan automatically, and submitting the experiment in the dashboard should run the new version, with enthusiasm included.

The ARTIQ session

Often, you will want to run an instance of the controller manager and dashboard along with the ARTIQ master, whether or not you also intend to allow other clients to connect remotely. For convenience, all three can be started simultaneously with a single command:

$ artiq_session

Arguments to the individual tools (including -s and --bind) can still be specified using the -m, -d and -c options for master, dashboard and manager respectively. Use an equals sign to avoid confusion in parsing, for example:

$ artiq_session -m=-g

to start the session with Git integration. See also artiq_session.