Inicio rápido: Envío de un circuito con Qiskit a Azure Quantum

Aprenda a usar el paquete azure-quantum Python para enviar circuitos cuánticos de Qiskit a un destino de computación cuántica de IonQ o Honeywell mediante el servicio Azure Quantum. Para más información, consulte Circuitos cuánticos.

Prerrequisitos

  • Para trabajar en Azure Quantum, necesita una suscripción de Azure. Si no tiene una suscripción a Azure, cree una cuenta gratuita.
  • Cree un área de trabajo de Azure Quantum y habilite su proveedor preferido, Honeywell o IonQ (o ambos), para este escenario. Para más información, consulte Creación de un área de trabajo de Azure Quantum.

Instalación del paquete azure-quantum de Python

El paquete de Python azure-quantum contiene la funcionalidad necesaria para conectarse al área de trabajo de Azure Quantum y enviar circuitos cuánticos a destinos de computación cuántica, como IonQ y Honeywell.

  1. Instale Python 3.6 o posterior en caso de que aún no lo haya hecho.

  2. Instale PIP y asegúrese de que tiene la versión 19.2 o posterior.

    Si usa Miniconda o Anaconda, también puede crear un nuevo entorno; para ello, descargue el archivo environment.yml y ejecute lo siguiente:

    conda env create -f environment.yml
    

    Esto crea un nuevo entorno de Conda que puede activar con lo siguiente:

    conda activate azurequantum
    
  3. Instale el paquete azure-quantum con pip: Use la marca --upgrade para asegurarse de obtener la última versión.

    pip install --upgrade azure-quantum[qiskit]
    
  4. Inicie su editor de código preferido o una herramienta de Python interactiva, como VS Code, Jupyter o iPython.

Carga de las importaciones necesarias

En primer lugar, ejecute la siguiente celda para cargar las importaciones necesarias:

from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit.tools.monitor import job_monitor
from azure.quantum.qiskit import AzureQuantumProvider

Conexión al servicio Azure Quantum

Para conectarse al servicio Azure Quantum, el programa necesitará el identificador de recurso y la ubicación del área de trabajo de Azure Quantum. Inicie sesión en su cuenta de Azure, https://portal.azure.com, vaya al área de trabajo de Azure Quantum y copie los valores del encabezado.

Cómo recuperar el identificador de recurso y la ubicación de un área de trabajo de Azure Quantum

Pegue los valores en el constructor AzureQuantumProvider siguiente para crear un objeto provider que se conecte al área de trabajo de Azure Quantum.

provider = AzureQuantumProvider(
  resource_id="",
  location=""
)

Enumeración de todos los back-end

Ahora puede imprimir todos los back-end de computación cuántica que están disponibles en el área de trabajo:

print([backend.name() for backend in provider.backends()])
['ionq.qpu', 'ionq.simulator', 'honeywell.hqs-lt-s1', 'honeywell.hqs-lt-s1-apival', 'honeywell.hqs-lt-s2', 'honeywell.hqs-lt-s2-apival', 'honeywell.hqs-lt-s1-sim']

Ejecución de un circuito simple

En primer lugar, cree un circuito de Qiskit simple para ejecutarlo.

# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0,1,2], [0, 1, 2])

# Print out the circuit
circuit.draw()
     ┌───┐          ┌─┐      
q_0: ┤ H ├──■───────┤M├──────
     └───┘┌─┴─┐     └╥┘┌─┐   
q_1: ─────┤ X ├──■───╫─┤M├───
          └───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
               └───┘ ║  ║ └╥┘
c: 3/════════════════╩══╩══╩═
                     0  1  2 

Para obtener un resultado rápidamente, use provider.get_backend para crear un objeto Backend para conectarse al back-end del simulador de IonQ:

simulator_backend = provider.get_backend("ionq.simulator")

Ahora puede ejecutar el programa a través del servicio Azure Quantum y obtener el resultado. La celda siguiente envía un trabajo que ejecuta el circuito con 100 tomas:

job = simulator_backend.run(circuit, shots=100)
job_id = job.id()
print("Job id", job_id)
Job id 00000000-0000-0000-0000-000000000000

Para supervisar el progreso del trabajo, puede usar el objeto job_monitor de Qiskit importado anteriormente para hacer un seguimiento del estado del trabajo. Tenga en cuenta que esta llamada producirá un bloqueo hasta que se complete el trabajo:

job_monitor(job)
Job Status: job has successfully run

Para esperar hasta que se complete el trabajo y devolver los resultados, ejecute:

result = job.result()

Esto devuelve un objeto qiskit.Result.

type(result)
qiskit.result.result.Result
print(result)
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=100, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 50, '111': 50}, probabilities={'000': 0.5, '111': 0.5}), header=QobjExperimentHeader(meas_map='[0, 1, 2]', name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])

Dado que se trata de un objeto nativo del paquete Qiskit, puede usar los objetos result.get_counts y plot_histogram de Qiskit y para visualizar los resultados. Para asegurarse de que se representan todas las etiquetas de cadena de bits posibles, agréguelas a counts.

counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
{'000': 50, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 50}

Resultado del circuito de Qiskit en el simulador de IonQ

Ejecución en la QPU de IonQ

Para conectarte a un hardware real, una unidad de procesamiento cuántico (QPU), basta con proporcionar el nombre del "ionq.qpu" de destino al método provider.get_backend:

qpu_backend = provider.get_backend("ionq.qpu")

Envíe el circuito para que se ejecute en Azure Quantum.

Nota

El tiempo necesario para ejecutar un circuito en la QPU puede variar en función de los tiempos de cola actuales.

Como antes, use job_monitor para hacer un seguimiento del estado del trabajo, y plot_histogram para trazar los resultados.

# Submit the circuit to run on Azure Quantum
qpu_job = qpu_backend.run(circuit, shots=1024)
job_id = qpu_job.id()
print("Job id", job_id)

# Monitor job progress and wait until complete:
job_monitor(qpu_job)

# Get the job results (this method also waits for the Job to complete):
result = qpu_job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 00000000-0000-0000-0000-000000000000
Job Status: job has successfully run
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'0': 505, '1': 6, '2': 1, '3': 1, '4': 1, '5': 10, '6': 11, '7': 488}, probabilities={'0': 0.4932, '1': 0.0059, '2': 0.001, '3': 0.001, '4': 0.001, '5': 0.0098, '6': 0.0117, '7': 0.4766}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
{'000': 505, '001': 6, '010': 1, '011': 1, '100': 1, '101': 10, '110': 11, '111': 488}

Resultado del circuito de Qiskit en la QPU de IonQ

Instalación del paquete azure-quantum de Python

El paquete de Python azure-quantum contiene la funcionalidad necesaria para conectarse al área de trabajo de Azure Quantum y enviar circuitos cuánticos a destinos de computación cuántica, como IonQ y Honeywell.

  1. Instale Python 3.6 o posterior en caso de que aún no lo haya hecho.

  2. Instale PIP y asegúrese de que tiene la versión 19.2 o posterior.

    Si usa Miniconda o Anaconda, también puede crear un nuevo entorno; para ello, descargue el archivo environment.yml y ejecute lo siguiente:

    conda env create -f environment.yml
    

    Esto crea un nuevo entorno de Conda que puede activar con lo siguiente:

    conda activate azurequantum
    
  3. Instale el paquete azure-quantum con pip: Use la marca --upgrade para asegurarse de obtener la última versión.

    pip install --upgrade azure-quantum[qiskit]
    
  4. Inicie su editor de código preferido o una herramienta de Python interactiva, como VS Code, Jupyter o iPython.

Carga de las importaciones necesarias

En primer lugar, ejecute la siguiente celda para cargar las importaciones necesarias:

from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit.tools.monitor import job_monitor
from azure.quantum.qiskit import AzureQuantumProvider

Conexión al servicio Azure Quantum

Para conectarse al servicio Azure Quantum, el programa necesitará el identificador de recurso y la ubicación del área de trabajo de Azure Quantum. Inicie sesión en su cuenta de Azure, https://portal.azure.com, vaya al área de trabajo de Azure Quantum y copie los valores del encabezado.

Cómo recuperar el identificador de recurso y la ubicación de un área de trabajo de Azure Quantum

Pegue los valores en el constructor AzureQuantumProvider siguiente para crear un objeto provider que se conecte al área de trabajo de Azure Quantum.

provider = AzureQuantumProvider(
  resource_id="",
  location=""
)

Enumeración de todos los back-end

Ahora puede imprimir todos los back-end de computación cuántica que están disponibles en el área de trabajo:

print([backend.name() for backend in provider.backends()])
    ['ionq.simulator', 'ionq.qpu', 'honeywell.hqs-lt-s1', 'honeywell.hqs-lt-s1-apival', 'honeywell.hqs-lt-s1-sim']

Ejecución en el validador de API

Nota

El back-end del validador de API de Honeywell siempre devolverá 0 en la medición.

# Get Honeywell's API validator backend:
apival_backend = provider.get_backend("honeywell.hqs-lt-s1-apival")
# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0,1,2], [0, 1, 2])

# Print out the circuit
circuit.draw()
     ┌───┐          ┌─┐      
q_0: ┤ H ├──■───────┤M├──────
     └───┘┌─┴─┐     └╥┘┌─┐   
q_1: ─────┤ X ├──■───╫─┤M├───
          └───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
               └───┘ ║  ║ └╥┘
c: 3/════════════════╩══╩══╩═
                     0  1  2 
# Submit the circuit to run on Azure Quantum
job = apival_backend.run(circuit, count=1024)
job_id = job.id()
print("Job id", job_id)

# Monitor job progress and wait until complete:
job_monitor(job)

# Get the job results (this method also waits for the Job to complete):
result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 00000000-0000-0000-0000-000000000000
Job Status: job has successfully run
Result(backend_name='honeywell.hqs-lt-s1-apival', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 1024}, probabilities={'000': 1.0}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit'))])
{'000': 1024, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 0}

Resultado del circuito Qiskit en el validador de API de Honeywell

Ejecución en una QPU de Honeywell

Después de una ejecución correcta en el validador de API, puede ejecutar el trabajo en uno de los procesadores de hardware de Honeywell, una unidad de procesador cuántico (QPU).

Nota

El tiempo necesario para ejecutar un circuito en la QPU puede variar en función de los tiempos de cola actuales.

# Get Honeywell's QPU backend:
qpu_backend = provider.get_backend("honeywell.hqs-lt-s1")
# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, count=500)
job_id = job.id()
print("Job id", job_id)

# Monitor job progress and wait until complete:
job_monitor(job)
Job id 00000000-0000-0000-0000-000000000000
Job Status: job has successfully run
# Get the job results (this method also waits for the Job to complete):
result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Result(backend_name='honeywell.hqs-lt-s1-apival', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'011': 16, '010': 5, '001': 1, '000': 500, '111': 471, '101': 6, '100': 17, '110': 8}, probabilities={'011': 0.015625, '010': 0.0048828125, '001': 0.0009765625, '000': 0.48828125, '111': 0.4599609375, '101': 0.005859375, '100': 0.0166015625, '110': 0.0078125}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit'))])
{'000': 500, '001': 1, '010': 5, '011': 16, '100': 17, '101': 6, '110': 8, '111': 471}

Resultado del circuito Qiskit en la QPU de Honeywell