103 lines
3.2 KiB
Plaintext
103 lines
3.2 KiB
Plaintext
---
|
|
title: Migrate from qiskit_ibm_provider to qiskit_ibm_runtime
|
|
description: How to migrate `backend.run()` from Qiskit IBM Provider to Qiskit IBM Runtime
|
|
---
|
|
|
|
# Migrate `backend.run()` from `qiskit_ibm_provider` to `qiskit_ibm_runtime`
|
|
|
|
The Qiskit Runtime interface includes two packages:
|
|
Qiskit IBM Provider (the [`qiskit_ibm_provider`](../qiskit-ibm-provider) package) and
|
|
Qiskit IBM Runtime (the [`qiskit_ibm_runtime`](../qiskit-ibm-runtime) package). Until now,
|
|
primitives (`Sampler` and `Estimator`)
|
|
were run in Runtime. Custom circuits that were manually transpiled and used `IBMBackend.run()`
|
|
were run in Provider.
|
|
|
|
In the `qiskit-ibm-runtime` 0.15 release, we added support for running custom circuits using `IBMBackend.run()` in Runtime,
|
|
so users can run all programs through Runtime.
|
|
|
|
This guide describes how to migrate code that implemented `IBMBackend.run()`
|
|
using Qiskit IBM Provider to use Qiskit IBM Runtime instead.
|
|
|
|
**Example 1: Straightforward execution of IBMBackend.run()**
|
|
|
|
```python
|
|
from qiskit import *
|
|
from qiskit.compiler import transpile, assemble
|
|
|
|
circuit = QuantumCircuit(2, 2)
|
|
circuit.h(0)
|
|
circuit.cx(0, 1)
|
|
circuit.measure_all()
|
|
```
|
|
|
|
In Provider, the code is:
|
|
|
|
```python
|
|
from qiskit_ibm_provider import IBMProvider
|
|
|
|
provider = IBMProvider()
|
|
backend = provider.get_backend("ibmq_qasm_simulator")
|
|
transpiled_circuit = transpile(circuit, backend=backend)
|
|
job = backend.run(transpiled_circuit)
|
|
print(job.result())
|
|
```
|
|
|
|
In Runtime, the code is:
|
|
|
|
```python
|
|
from qiskit_ibm_runtime import QiskitRuntimeService
|
|
|
|
service = QiskitRuntimeService(channel="ibm_quantum")
|
|
backend = service.backend("ibmq_qasm_simulator")
|
|
transpiled_circuit = transpile(circuit, backend=backend)
|
|
job = backend.run(transpiled_circuit)
|
|
print(job.result())
|
|
```
|
|
|
|
**Example 2: Execution of backend.run() within a session:**
|
|
|
|
This section of code is identical in Provider and in Runtime.
|
|
|
|
```python
|
|
with backend.open_session() as session:
|
|
job1 = backend.run(transpiled_circuit)
|
|
job2 = backend.run(transpiled_circuit)
|
|
print(job1.session_id)
|
|
print(job2.session_id)
|
|
backend.cancel_session()
|
|
```
|
|
|
|
Sessions are implemented differently in `IBMBackend` than when using primitives.
|
|
Therefore, we cannot run a primitive and use backend.run() within a single session. If you specify both, one will be run outside of the session.
|
|
|
|
**Example 3: Primitive session containing backend.run:**
|
|
|
|
In this example, `sampler` is run within session, but `backend` is run independently
|
|
of the session.
|
|
|
|
```python
|
|
from qiskit_ibm_runtime import Session, Sampler
|
|
|
|
with Session(backend=backend) as session:
|
|
sampler = Sampler(session=session)
|
|
job1 = sampler.run(transpiled_circuit)
|
|
job2 = backend.run(transpiled_circuit) # runs outside the session
|
|
print(job1.session_id)
|
|
print(job2.session_id) # is None
|
|
```
|
|
|
|
**Example 4: `Backend` session containing Sampler:**
|
|
|
|
In this example, `backend` is run within a session, but `sampler` is run independently
|
|
of the session.
|
|
|
|
```python
|
|
with backend.open_session() as session:
|
|
sampler = Sampler(backend=backend)
|
|
job1 = sampler.run(transpiled_circuit) # runs outside the session
|
|
job2 = backend.run(transpiled_circuit)
|
|
session_id = session.session_id
|
|
print(job1.session_id) # is None
|
|
print(job2.session_id)
|
|
```
|