Ejecutar en backends cuánticos¶
Un backend representa un simulador o una computadora cuántica real y es responsable de ejecutar circuitos cuánticos, ejecutar planificadores de pulsos, y devolver resultados.
En qiskit-ibm-runtime, un backend está representado por una instancia de la clase IBMBackend
. Los atributos de esta clase proporcionan información sobre este backend. Por ejemplo:
name
: Nombre del backend.instructions
: Una lista de instrucciones que admite el backend.operation_names
: Una lista de nombres de instrucciones que admite el backend.num_qubits
: El número de qubits que tiene el backend.coupling_map
: Mapa de acoplamiento del backend.dt
: Resolución del tiempo del sistema de las señales de entrada.dtm
: Resolución del tiempo del sistema de las señales de salida.
Consulta la referencia de la API para obtener una lista completa de atributos y métodos.
Inicializar el servicio¶
Antes de llamar a IBMBackend
, inicializa el servicio:
from qiskit_ibm_runtime import QiskitRuntimeService
# Initialize the account first.
service = QiskitRuntimeService()
Lista de backends¶
Usa el método backends()
para listar todos los backends a los que tienes acceso. Este método devuelve una lista de instancias de IBMBackend
:
service.backends()
[<IBMBackend('ibmq_qasm_simulator')>,
<IBMBackend('simulator_stabilizer')>,
<IBMBackend('simulator_mps')>,
<IBMBackend('simulator_extended_stabilizer')>,
<IBMBackend('simulator_statevector')>]
El método backend()
(ten en cuenta que esto es singular: backend) toma el nombre del backend como parámetro de entrada y devuelve una instancia de IBMBackend
que representa ese backend en particular:
service.backend("ibmq_qasm_simulator")
<IBMBackend('ibmq_qasm_simulator')>
Filtrar backends¶
Opcionalmente, también puedes filtrar los backends establecidos, pasando argumentos que consultan la configuración, el estado o las propiedades del backend. Para filtros más generales, puedes hacer funciones avanzadas usando una función lambda. Consulta la documentación de la API para obtener más detalles.
Intentemos obtener sólo los backends que se ajusten a estos criterios:
Son dispositivos cuánticos reales (
simulator=False
)Están actualmente operativos (
operational=True
)Tienen al menos 5 qubits (
min_num_qubits=5
)
service.backends(simulator=False, operational=True, min_num_qubits=5)
Un método similar es least_busy()
, que toma los mismos filtros que backends()
, pero devuelve el backend que coincide con los filtros y tiene la menor cantidad de trabajos (jobs) pendientes en la fila:
service.least_busy(operational=True, min_num_qubits=5)
Determinar los atributos del backend¶
Como se mencionó anteriormente, los atributos de la clase IBMBackend
proporcionan información sobre el backend. Por ejemplo:
backend = service.backend("ibmq_qasm_simulator")
backend.name #returns the backend's name
backend.backend_version #returns the version number
backend.simulator #returns True or False, depending on whether it is a simulator
backend.num_qubits #returns the number of qubits the backend has
See the IBMBackend
class documentation for the full list of backend attributes.
Encontrar información del backend de otros canales¶
Para encontrar tus sistemas y simuladores disponibles en IBM Cloud, consulta la página de Recursos computacionales. Debes iniciar sesión para ver tus recursos computacionales disponibles. Se te muestra una fotografía de cada backend. Para ver los detalles completos, haz clic en el nombre del backend. También puedes buscar backends desde esta página.
Para encontrar tus sistemas y simuladores disponibles en IBM Quantum Platform, consulta la página de Recursos computacionales. Se te muestra una fotografía de cada backend. Para ver los detalles completos, haz clic en el nombre del backend. También puedes ordenar, filtrar y buscar desde esta página.
Especificar un backend al ejecutar un trabajo¶
Si estás utilizando una sesión de runtime, agrega la opción backend
al iniciar tu sesión. Para obtener detalles sobre cómo trabajar con sesiones, consulta Ejecutar una primitiva en una sesión.
from qiskit.circuit.random import random_circuit
from qiskit.quantum_info import SparsePauliOp
from qiskit_ibm_runtime import QiskitRuntimeService, Session, Estimator, Options
circuit = random_circuit(2, 2, seed=1).decompose(reps=1)
observable = SparsePauliOp("IY")
options = Options()
options.optimization_level = 2
options.resilience_level = 2
service = QiskitRuntimeService()
with Session(service=service, backend="ibmq_qasm_simulator") as session:
estimator = Estimator(session=session, options=options)
job = estimator.run(circuit, observable)
result = job.result()
# Close the session only if all jobs are finished, and you don't need to run more in the session
session.close() # Closes the session
display(circuit.draw("mpl"))
print(f" > Observable: {observable.paulis}")
print(f" > Expectation value: {result.values[0]}")
print(f" > Metadata: {result.metadata[0]}")
Si no estás utilizando una sesión de runtime, puedes pasar el backend al inicializar la clase primitiva.
from qiskit.circuit.random import random_circuit
from qiskit.quantum_info import SparsePauliOp
from qiskit_ibm_runtime import QiskitRuntimeService, Session, Estimator, Options
circuit = random_circuit(2, 2, seed=1).decompose(reps=1)
observable = SparsePauliOp("IY")
options = Options()
options.optimization_level = 2
options.resilience_level = 2
service = QiskitRuntimeService()
backend = service.backend("ibmq_qasm_simulator")
estimator = Estimator(backend, options=options)
job = estimator.run(circuit, observable)
result = job.result()
display(circuit.draw("mpl"))
print(f" > Observable: {observable.paulis}")
print(f" > Expectation value: {result.values[0]}")
print(f" > Metadata: {result.metadata[0]}")