Integration Scenarios Analysis¶
This page compares the ways an HPC center or downstream project can integrate IQM quantum computers (QCs) through QDMI-on-IQM. Each scenario links to the guide that covers its mechanics; this page focuses on when to pick it, what it costs to set up, and what isolation and multi-tenancy properties it gives you. A recommendation matrix at the end maps site profiles to scenarios.
Note
Scenarios 1-6 describe integration paths this repository implements today. Scenario 7 is forward-looking: it discusses schedulers this repository does not yet support, to help sites evaluating IQM integration outside Slurm.
1. Direct C++ QDMI Device Usage¶
Link a downstream C++ application directly against the QDMI device library and drive a session yourself — see the Usage Guide. No scheduler is involved: the calling process owns the session lifecycle, authentication, and calibration/job queries end to end.
Setup complexity: low — link the library, call the C API.
Isolation: whatever the host process provides; QDMI-on-IQM itself enforces no isolation between callers.
Multi-tenancy: none built in. Concurrent callers targeting the same QC contend at the IQM service’s own queue, with no cluster-side arbitration.
Resource brokering: none — the QC’s own queue is the only broker.
2. Direct Python/Qiskit Usage¶
Use IQMBackend directly from a Python process, as
shown in Qiskit Integration. Same properties as Scenario 1, but at
the Qiskit/Python layer: no scheduler, no cluster-side isolation, transpilation
handled by Qiskit’s standard tools before the circuit reaches the QC.
Setup complexity: low —
uv pip install iqm-qdmi[qiskit].Isolation / multi-tenancy / resource brokering: same as Scenario 1.
Fits: single-researcher workstations, notebooks with direct network access to the IQM service, CI jobs that don’t run on a cluster.
3. Slurm + SPANK Env-Injection with Synchronous srun Offloading¶
The production integration path today: the SPANK plugin
injects IQM_* environment variables into job steps, and the
offloader module (see
Python Package)
submits srun iqm-sampler/srun iqm-estimator jobs from a login-node process
such as a Jupyter notebook.
Setup complexity: moderate — compile and deploy the SPANK plugin on login and compute nodes, configure
plugstack.conf, provision aquantumpartition (see the Administrator Guide).Isolation: partition-gated — the plugin only activates on administrator-listed partitions, and per-node launch-time validation rejects a job step before any task starts if the target QC or credentials are invalid.
Multi-tenancy: Slurm’s own scheduler arbitrates access to the
quantumpartition; optionally, administrators can additionally model each QC as a Slurm license (see Limiting Concurrent Access with Slurm Licenses) so Slurm itself caps concurrent QC access ahead of the QC’s own queue — most useful for on-premise, effectively single-tenant hardware.Resource brokering: deliberately shallow. The plugin injects environment variables and validates reachability; it does not lock or schedule the QC itself. Precedence when the same setting is given multiple ways:
sruncommand-line flags override user-set environment variables, which overrideplugstack.confadministrator defaults.
4. Spack-Based Install¶
Layer a Spack package definition (see the Spack Guide) on top of any of the above scenarios as the install mechanism, instead of a manual CMake build.
Setup complexity: low once a package repository exists; concretization and reproducible pinning (via commit SHA) are handled by Spack.
Fits: HPC centers that already manage their software stack through Spack environments/modules rather than ad hoc builds.
Does not change the isolation, multi-tenancy, or resource-brokering properties of the underlying scenario (3 or 1) — it only changes how the binaries get onto the cluster.
5. Docker-Based Test/Dev Topology vs. Bare-Metal Production Deployment¶
The SPANK plugin’s test suite runs inside Docker (spank/Dockerfile,
.github/workflows/spank-tests.yml) without requiring a real Slurm installation
or credentials, as described in
Testing with Docker.
Production deployment instead installs the compiled plugin directly onto real
login and compute nodes running slurmd/slurmstepd.
Fits: use the Docker topology for plugin development and CI; use the bare-metal topology for any environment where jobs actually reach IQM hardware, since the plugin is tied to the target cluster’s Slurm daemon ABI and must be rebuilt against it (see Compatibility and Requirements).
These two topologies are not alternatives for the same purpose — treat Docker as a pre-production verification step, not a deployment option.
7. Forward-Looking: Non-Slurm Schedulers (Not Implemented)¶
QDMI-on-IQM only supports Slurm today. Sites running other schedulers would need an equivalent env-injection mechanism, and the SPANK plugin’s “shallow, no resource brokering” design is itself Slurm-specific — it would not port to another scheduler unchanged:
PBS/OpenPBS: would need a PBS hook (
qmgrserver/queue hooks) written against PBS’s own hook API to injectIQM_*variables into the job environment at launch — a different lifecycle and API from SPANK’s.LSF: would need an
esub/eexecjob submission wrapper or an LSF external scheduler plugin; LSF has no direct SPANK equivalent, so environment injection and any launch-time validation would need to be reimplemented against LSF’s job-control hooks.Grid Engine: would need a prolog/epilog script pair (or a JSV — Job Submission Verifier — script) configured cluster-wide to inject
IQM_*variables before the job starts, since Grid Engine has no SPANK-equivalent plugin API; partition gating’s closest analogue is queue-based access control viaqconf.Kubernetes (CRD-based): would look structurally different from all of the above — a Custom Resource Definition (e.g. an
IQMJobCRD) reconciled by a custom controller/operator, which injectsIQM_*variables into the pod spec it creates, rather than a mutating admission webhook intercepting arbitrary pods; Kubernetes has no per-job-step CLI flag-parsing hook comparable to SPANK, and partition gating’s closest analogue would be namespace- orResourceQuota-scoped access.Flux: would need a Flux plugin against its job execution API (e.g. a
flux-shellplugin or jobtap plugin) to injectIQM_*variables at job shell launch — architecturally closer to SPANK’s shell-launch hook than the others here, but a distinct plugin API and ABI that would need its own implementation.
None of these are implemented in this repository. Treat this section as scoping input for a site evaluating IQM integration outside Slurm, not as supported functionality.
Recommendation Matrix¶
Site profile |
Recommended scenario |
|---|---|
Single researcher, workstation or notebook, direct network access to the IQM service |
1 (C++) or 2 (Python/Qiskit) |
Shared academic HPC center, multiple users/groups, on-premise or capacity-limited QC |
3 (Slurm + SPANK), with Slurm licenses enabled |
Dedicated production cluster, single tenant, still scheduler-managed |
3 (Slurm + SPANK), partition gating optional, licenses optional |
Site already standardized on Spack for software management |
4, layered on top of 1-3 |
Plugin development or CI, no access to real Slurm |
5’s Docker topology only — not a deployment target |
Site running PBS, LSF, Grid Engine, Kubernetes (CRD-based), or Flux instead of Slurm |
7 — no supported path today; would require new integration work |