Skip to content

IceKhan13/QiskitFlow

Repository files navigation

QiskitFlow. Reproducible quantum experiments.

logo

Platform for tracking, sharing and running quantum experiments in a clean and understandable for developers, researchers and students manner.

Alpha release is in the works. Files from hackathon project are located in hackathon folder

Hot to run

Flow

flow

Flow of actions while using QiskitFlow is following:

  • Install QiskitFlow if not installed yet
  • Annotate your code with Experiment abstraction QiskitFlow library provides
  • Run your code as usual: QiskitFlow will write metadata of your experiment execution in local folder
  • You can review experiments using CLI interface

We are tracking metrics, parameters, state vectors and counts of experiments. Artifacts, circuits, sourcecode and other useful things are on their way.

Note: qiskitflow creates _experiments folder in place of execution of code, where all serialized information is stored in json format, so it's easy to track it even in git

Installation

In order to install qiskitflow locally you need to follow 2 step process:

  • install python library for code annopatation and cli
  • run docker containers for backend server, ui and database

To install qiskitflow library and CLI simply run

pip install qiskitflow

In order to run containers with required services we suggest to use docker-compose. But by no means we restrict you to deploy qiskitflow to any container aware environment. At the end of the day all required services are just docker images.

  1. Copy docker-compose.yaml file to your machine
  2. Run docker-compose up in a folder where you saved compose file. In a few moments you should see logs from server, ui and database.

NOTE: in order to share experiments you need to have backend server up and running.

NOTE: username and password for local server is admin

Code annotation

Library for quantum programs annotation

Sample example of annotation:

from qiskitflow import Experiment

with Experiment("awesome_experiment") as experiment:

    # your quantum program here!
    
    experiment.write_metric("test metric", 0.1)
    experiment.write_metric("test metric 2", 2)

    experiment.write_parameter("test parameter", "test parameter value")
    experiment.write_parameter("test parameter 2", "test paraeter value 2")

    experiment.write_counts("measurement", {"00": 1024, "11": 0})
Full example with quantum teleportation

import numpy as np
import time
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, execute, BasicAer, IBMQ
from qiskit.visualization import plot_histogram, plot_bloch_multivector
from qiskit.extensions import Initialize
from qiskit_textbook.tools import random_state, array_to_latex

from qiskitflow import Experiment

with Experiment("quantum teleportation") as experiment:
    start_time = time.time()
    
    # conduct experiment as usual
    psi = random_state(1)
    init_gate = Initialize(psi)
    init_gate.label = "init"
    inverse_init_gate = init_gate.gates_to_uncompute()

    qr = QuantumRegister(3, name="q")
    crz = ClassicalRegister(1, name="crz")
    crx = ClassicalRegister(1, name="crx")
    qc = QuantumCircuit(qr, crz, crx)
    qc.append(init_gate, [0])
    qc.barrier()
    create_bell_pair(qc, 1, 2)
    qc.barrier()
    alice_gates(qc, 0, 1)
    measure_and_send(qc, 0, 1)
    bob_gates(qc, 2, crz, crx)
    qc.append(inverse_init_gate, [2])
    cr_result = ClassicalRegister(1)
    qc.add_register(cr_result)
    qc.measure(2,2)
    backend_name = "qasm_simulator"
    backend = BasicAer.get_backend(backend_name)
    counts = execute(qc, backend, shots=1024).result().get_counts()
    
    end_time = time.time()
    
    runtime = end_time - start_time
    
    # qiskitflow =========

    # log parameters used
    experiment.write_parameter("backend name", backend_name)
    # log metrics of experiment
    experiment.write_metric("runtime", runtime)
    # log counts of experiment
    experiment.write_counts("experiment counts", counts)


CLI

List of experiment runs

qiskitflow runs [--search=<SEARCH_BY_RUN_ID>] [--experiment=<EXPERIMENT_NAME>] [--order_by=<METRIC_TO_ORDER_BY>] [--order_type=<asc or desc>]
experiments list screenshot

list

Experiment run information

qiskitflow run <RUN_ID>
experiment information screenshots

Experiment information info

Share experiment run

qiskitflow share <RUN_ID> --user=<USER> --password=<password> --host=<HOST> --port=<PORT>

Example for local backend server

qiskitflow share 86b6e7ba32f04d34b842a91079482454 --user=<USER> --password=<password> --host=http://localhost --port=8000
experiment share screenshots

Experiment information share


Examples

Jupyter notebook with quantum teleportation example

UI

Screenshots

Experiment information ui