Hello, I am trying to train a variational quantum algorithm on ibm’s hardware. To avoid huge delays, it would be most useful to be able to exploit the new QiskitRuntimeService
feature that allows you to temporarily block a QPU by creating an interactive session. I tried to do it in a couple of different ways via the pennylane-qiskit
plugin but did not succeed.
Any help in this regard would be much appreciated. Let me explain what I tried and how it failed.
Naive way
If you instantiate a qiskit.remote
device in pennylane and submit jobs in the usual way (by means of creating a qnode), then each job will create its own session.
from qiskit_ibm_runtime import QiskitRuntimeService, Session
import numpy as np
import pennylane as qml
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
dev = qml.device('qiskit.remote', wires=127, backend=backend)
@qml.qnode(dev)
def circuit(input):
qml.templates.AmplitudeEmbedding(features=input, wires=range(6),pad_with=0.0,normalize=True)
return qml.expval(qml.PauliZ(0))
# run circuit
inputs = np.random.ramdom((2,2**6))
results = []
for i in range(2):
results.append(circuit(inputs[i]))
Less naive way
Apparently, when instantiating a qiskit.remote
device, one can provide a previously created session as a keyword argument. This creates a session that remains open until one submits the first job, once this job is completed, the session automatically closes and no more circuits can be submitted.
# same as before but we change the line where we instantiate the device
session = Session(backend=backend)
dev = qml.device('qiskit.remote', wires=127, backend=backend,session=session)
Third way
According to this tutorial, there is a qiskit_session
class within pennylane_qiskit
. However, I can’t import it (I tried with versions 0.37 and 0.38 for pennylane_qiskit
):
from pennylane_qiskit import qiskit_session
Error:
----> 1 from pennylane_qiskit import qiskit_session
ImportError: cannot import name 'qiskit_session' from 'pennylane_qiskit' (path_to_env\venv\Lib\site-packages\pennylane_qiskit\__init__.py)
Fourth way
Naturally, one possibility would be to transform each QuantumTape generated in pennylane to a Qiskit
’s QuantumCircuit
and then submit all that within a session.
However, I would like to keep this as a last resort, since then I would lose pennylane
’s automatic differentiation capabilities.
Conclusion
Is there a way in which I can submit several jobs to the same QiskitRuntimeService
session from pennylane?
Thanks in advance for your help!
qml.about
Name: PennyLane
Version: 0.37.0
Summary: PennyLane is a cross-platform Python library for quantum computing, quantum machine learning, and quantum chemistry. Train a quantum computer the same way as a neural network.
Home-page: https://github.com/PennyLaneAI/pennylane
Author:
Author-email:
License: Apache License 2.0
Location:
Requires: appdirs, autograd, autoray, cachetools, networkx, numpy, packaging, pennylane-lightning, requests, rustworkx, scipy, semantic-version, toml, typing-extensions
Required-by: PennyLane-qiskit, PennyLane_Lightning
Platform info: Windows-11-10.0.22621-SP0
Python version: 3.12.6
Numpy version: 1.26.4
Scipy version: 1.14.1
Installed devices:
- default.clifford (PennyLane-0.37.0)
- default.gaussian (PennyLane-0.37.0)
- default.mixed (PennyLane-0.37.0)
- default.qubit (PennyLane-0.37.0)
- default.qubit.autograd (PennyLane-0.37.0)
- default.qubit.jax (PennyLane-0.37.0)
- default.qubit.legacy (PennyLane-0.37.0)
- default.qubit.tf (PennyLane-0.37.0)
- default.qubit.torch (PennyLane-0.37.0)
- default.qutrit (PennyLane-0.37.0)
- default.qutrit.mixed (PennyLane-0.37.0)
- default.tensor (PennyLane-0.37.0)
- null.qubit (PennyLane-0.37.0)
- lightning.qubit (PennyLane_Lightning-0.38.0)
- qiskit.aer (PennyLane-qiskit-0.37.0)
- qiskit.basicaer (PennyLane-qiskit-0.37.0)
- qiskit.basicsim (PennyLane-qiskit-0.37.0)
- qiskit.ibmq (PennyLane-qiskit-0.37.0)
- qiskit.ibmq.circuit_runner (PennyLane-qiskit-0.37.0)
- qiskit.ibmq.sampler (PennyLane-qiskit-0.37.0)
- qiskit.remote (PennyLane-qiskit-0.37.0)