Skip to content

Thin and vendor agnostic layer to access, control and monitor underlying on-prem or cloud quantum computers

License

Notifications You must be signed in to change notification settings

qiskit-community/qrmi

QRMI: Quantum Resource Management Interface

This is repository with Quantum Resource Management Interface (QRMI) implementation.

QRMI ⚛️ is a vendor agnostic library to control state, run tasks and monitor behavior of quantum computational resources (qubits, QPUs, entire quantum systems, etc.).

QRMI acts like a thin middleware layer that abstracts away complexities of controling quantum resources by exposing set of simple APIs to acquire/release hardware, run tasks and monitor state of quantum resources.

QRMI is written in Rust 🦀 with Python 🐍 and C ©️ APIs exposed for ease of integration to pretty much any computational envrionment.

📒 Contents


Examples

All full examples are available in examples folder.

C

This example is using QRMI with Direct Access to IBM Quantum machines.

#include "qrmi.h"

int main(int argc, char *argv[]) {
    ...

    QrmiQuantumResource *qrmi = qrmi_resource_new(argv[1], QRMI_RESOURCE_TYPE_IBM_DIRECT_ACCESS);
    ...

    QrmiReturnCode rc = qrmi_resource_metadata(qrmi, &metadata);
    ...

    QrmiResourceMetadata *metadata = NULL;
    rc = qrmi_resource_acquire(qrmi, &acquisition_token);
    ...

    QrmiPayload payload;
    payload.tag = QRMI_PAYLOAD_QISKIT_PRIMITIVE;
    payload.QISKIT_PRIMITIVE.input = (char *)input;
    payload.QISKIT_PRIMITIVE.program_id = argv[3];
    ...

    char *job_id = NULL;
    rc = qrmi_resource_task_start(qrmi, &payload, &job_id);
    ...

    QrmiTaskStatus status;
    rc = qrmi_resource_task_status(qrmi, job_id, &status);
    ...

    qrmi_resource_task_stop(qrmi, job_id);
    qrmi_string_free(job_id);
    qrmi_resource_free(qrmi);

    return EXIT_SUCCESS;

error:
    qrmi_resource_free(qrmi);
    return EXIT_FAILURE;
}

Full example is available here.

See example of QRMI C working with IBM Qiskit Runtime Service or Pasqal Cloud.

All examples for QRMI C are available in this folder.

Python

This example is using QRMI with Direct Access to IBM Quantum machines.

from qrmi import QuantumResource, ResourceType, Payload, TaskStatus

# create resource handler
qrmi = QuantumResource("ibm_rensselaer", ResourceType.IBMDirectAccess)

# acquire resource
lock = qrmi.acquire()

# run task
payload = Payload.QiskitPrimitive(input=primitive_input, program_id=args.program_id)
job_id = qrmi.task_start(payload)

print(qrmi.task_result(job_id).value)

qrmi.task_stop(job_id)

# release resource
qrmi.release(lock)

Full example is available here.

Python QRMI can be used to implement Qiskit primitives (Sampler and Estimator). See example of Qiskit primitives here for IBM backends or for Pasqal machines.

See example of QRMI working with Pasqal Pulser.

Rust

This example is using QRMI with Direct Access to IBM Quantum machines.

use qrmi::{ibm::IBMDirectAccess, models::Payload, models::TaskStatus, QuantumResource};
...

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    ...
    let mut qrmi = IBMDirectAccess::new(&args.backend);

    let lock = qrmi.acquire().await?;
    ...

    let target = qrmi.target().await;
    ...

    let payload = Payload::QiskitPrimitive {
        input: contents,
        program_id: args.program_id,
    };

    let job_id = qrmi.task_start(payload).await?;
    println!("Job ID: {}", job_id);
    let one_sec = time::Duration::from_millis(1000);
    loop {
        let status = qrmi.task_status(&job_id).await?;
        println!("{:?}", status);
        if matches!(status, TaskStatus::Completed) {
            println!("{}", qrmi.task_result(&job_id).await?.value);
            break;
        } else if matches!(status, TaskStatus::Failed | TaskStatus::Cancelled) {
            break;
        }
        thread::sleep(one_sec);
    }
    let _ = qrmi.task_stop(&job_id).await;

    let _ = qrmi.release(&lock).await;
    Ok(())
}

Full example is available here.

See example of QRMI Rust working with IBM Qiskit Runtime Service or Pasqal Cloud.

All examples for QRMI C are available in this folder.

QRMI usage in Slurm plugin for quantum resources

One of example of usage of QRMI in compute infrastrcture project is Slurm plugin for quantum resources. QRMI is used in Slurm plugin to control quantum resources during lifetime of Slurm job.

See implementation and documentation of Slurm plugin for quantum resources here.


How to Give Feedback

We encourage your feedback! You can share your thoughts with us by:


How to Cite This Work

If you use the “Quantum Spank plugin” or "QRMI" in your research or projects, please consider citing the associated overview paper Quantum resources in resource management systems. This helps support the continued development and visibility of the repository. The BibTeX citation handle can be found in the CITATION.bib file.

Note that the overview paper is a work in progress, and we expect multiple versions to be released as the project evolves.


Contribution Guidelines

For information on how to contribute to this project, please take a look at our contribution guidelines.


References and Acknowledgements

  1. Quantum spank plugins for Slurm https://github.com/qiskit-community/spank-plugins
  2. Slurm documentation https://slurm.schedmd.com/
  3. Qiskit https://www.ibm.com/quantum/qiskit
  4. IBM Quantum https://www.ibm.com/quantum
  5. Pasqal https://pasqal.com
  6. STFC The Hartree Centre, https://www.hartree.stfc.ac.uk. This work was supported by the Hartree National Centre for Digital Innovation (HNCDI) programme.
  7. Rensselaer Polytechnic Institute, Center for Computational Innovation, http://cci.rpi.edu/

About

Thin and vendor agnostic layer to access, control and monitor underlying on-prem or cloud quantum computers

Topics

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors 6