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
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
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.
- Copy docker-compose.yaml file to your machine
- 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
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)
qiskitflow runs [--search=<SEARCH_BY_RUN_ID>] [--experiment=<EXPERIMENT_NAME>] [--order_by=<METRIC_TO_ORDER_BY>] [--order_type=<asc or desc>]
qiskitflow run <RUN_ID>
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