Übermitteln einer Verbindung mit Qiskit an Azure Quantum

Erfahren Sie, wie Sie mithilfe des azure-quantumPython Pakets eine Qiskit-Quantenschaltung übermitteln. Sie können Qiskit-Leitungen an Azure Quantum übermitteln, indem Sie das Azure Quantum-Notebook verwenden, das über azure-quantumPython ein integriertes Paket verfügt, oder von Ihrem lokalen Computer aus.

Weitere Informationen finden Sie unter Quantenschaltungen.

Hinweis

Das Microsoft Quantum Development Kit (Classic QDK) wird nach dem 30. Juni 2024 nicht mehr unterstützt. Wenn Sie bereits QDK-Entwickler sind, empfehlen wir Ihnen, auf das neue Azure Quantum Development Kit (Modern QDK) umzusteigen, um die Entwicklung von Quantenlösungen fortzusetzen. Weitere Informationen finden Sie unter Migrieren Ihres Q#-Codes zum modernen QDK.

Voraussetzungen

Installationsdetails finden Sie unter Installieren des modernen QDK in VS Code.

Erstellen eines neuen Jupyter-Notebooks

  1. Wählen Sie in VS Code Befehlspalette anzeigen > und dann Erstellen: Neue Jupyter Notebook aus.
  2. Rechts oben erkennt VS Code die Version und Python die virtuelle Python Umgebung, die für das Notebook ausgewählt wurde, und zeigt sie an. Wenn Sie über mehrere Python Umgebungen verfügen, müssen Sie möglicherweise einen Kernel mithilfe der Kernelauswahl oben rechts auswählen. Wenn keine Umgebung erkannt wurde, finden Sie unter Jupyter Notebooks in VS Code Setupinformationen.

Laden der erforderlichen Importe

Führen Sie in der ersten Zelle Ihres Notebooks den folgenden Code aus, um die erforderlichen Importe zu laden:

import azure.quantum
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from azure.quantum.qiskit import AzureQuantumProvider

Herstellen einer Verbindung mit dem Azure Quantum-Dienst

Zum Herstellen einer Verbindung mit dem Azure Quantum-Dienst benötigen Sie die Ressourcen-ID und den Speicherort Ihres Azure Quantum-Arbeitsbereichs. Melden Sie sich bei Ihrem Azure-Konto https://portal.azure.com an, navigieren Sie zu Ihrem Azure Quantum-Arbeitsbereich, und kopieren Sie die Werte aus dem Header.

Abrufen der Ressourcen-ID und des Speicherorts aus einem Azure Quantum-Arbeitsbereich

Fügen Sie eine neue Zelle hinzu, und verwenden Sie Ihre Kontoinformationen zum Erstellen Workspace von Objekten und AzureQuantumProvider zum Herstellen einer Verbindung mit Ihrem Azure Quantum-Arbeitsbereich.

workspace = Workspace(  
    resource_id = "", # Add the resourceID of your workspace
    location = "" # Add the location of your workspace (for example "westus")
    )

provider = AzureQuantumProvider(workspace)

Auflisten aller Back-Ends

Sie können jetzt alle Quantencomputing-Back-Ends ausgeben, die in Ihrem Arbeitsbereich verfügbar sind:

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.qpu.aria-1
- ionq.simulator
- microsoft.estimator
- quantinuum.hqs-lt-s1
- quantinuum.hqs-lt-s1-apival
- quantinuum.hqs-lt-s2
- quantinuum.hqs-lt-s2-apival
- quantinuum.hqs-lt-s1-sim
- quantinuum.hqs-lt-s2-sim
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2

Ausführen einer einfachen Schaltung

Erstellen Sie zunächst eine einfache Qiskit-Schaltung für die Ausführung.

# 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 

Wählen Sie ein aus target , um Ihr Programm auszuführen.

Ausführen im IonQ-Simulator

Bevor Sie auf echter Hardware ausgeführt werden, testen wir die Verbindung im Simulator. Verwenden Sie get_backend , um ein -Objekt zum Herstellen einer Backend Verbindung mit dem IonQ Simulator-Back-End zu erstellen:

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

IonQ-Back-Ends unterstützen Gates aus einem definierten Gateset, die für die optimale Ausführung auf der Hardware kompiliert werden. Wenn Ihre Verbindung Gates enthält, die nicht in dieser Liste enthalten sind, müssen Sie mithilfe der von Qiskit bereitgestellten Funktion in die transpile unterstützte gateset transpilieren:

from qiskit import transpile
circuit = transpile(circuit, simulator_backend)

Die Transpilefunktion gibt ein neues Leitungsobjekt zurück, bei dem Gates in Gates zerlegt werden, die im angegebenen Back-End unterstützt werden.

Sie können das Programm jetzt über den Azure Quantum-Dienst ausführen und das Ergebnis abrufen. Die folgende Zelle übermittelt einen Auftrag, der die Schaltung mit 100 Ausführungen durchläuft:

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

Führen Sie Folgendes aus, um zu warten, bis der Auftrag abgeschlossen ist, und die Ergebnisse zurückzugeben:

result = job.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'))])

Da es sich beim Ergebnis um ein für das Qiskit-Paket natives Objekt handelt, können Sie result.get_counts und plot_histogram von Quiskit verwenden, um die Ergebnisse zu visualisieren. Damit sichergestellt ist, dass alle möglichen Bitzeichenfolgen-Bezeichnungen dargestellt werden, fügen Sie sie zu counts hinzu.

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}

Ergebnis der Qiskit-Schaltung im IonQ-Simulator

Schätzen der Auftragskosten

Bevor Sie einen Auftrag auf der QPU ausführen, können Sie schätzen, wie viel die Ausführung kostet. Um die Kosten für die Ausführung eines Auftrags auf der QPU zu schätzen, können Sie die Methode estimate_cost verwenden:

backend = provider.get_backend("ionq.qpu")
cost = backend.estimate_cost(circuit, shots=1024)

print(f"Estimated cost: {cost.estimated_total}")

Dadurch werden die geschätzten Kosten in US-Dollar ausgegeben.

Die aktuellen Preisdetails finden Sie unter Preise. Suchen Sie alternativ nach Ihrem Arbeitsbereich, und zeigen Sie die Preisoptionen auf der Registerkarte „Anbieter“ Ihres Arbeitsbereichs über aka.ms/aq/myworkspaces an.

Ausführen auf der IonQ-QPU

Um eine Verbindung mit echter Hardware (einer Quantenprozessoreinheit (QPU) herzustellen, geben Sie einfach den Namen des für target"ionq.qpu" die get_backend -Methode an:

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

Übermitteln Sie die Verbindung für die Ausführung in Azure Quantum, rufen Sie die Ergebnisse ab, und führen Sie aus plot_histogram , um die Ergebnisse zu zeichnen.

Hinweis

Die zum Ausführen einer Schaltung auf der QPU erforderliche Zeit kann je nach aktueller Warteschlangenzeit variieren.

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

# Get the job results (this method 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='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}

Ergebnis der Qiskit-Schaltung auf der IonQ-QPU

Wichtig

Das Übermitteln mehrerer Schaltungen in einem einzelnen Auftrag wird derzeit nicht unterstützt. Sie können allerdings die Methode backend.run aufrufen, um die einzelnen Schaltungen asynchron zu übermitteln, und anschließend die Ergebnisse jedes Auftrags abrufen. Beispiel:

jobs = []
for circuit in circuits:
    jobs.append(backend.run(circuit, shots=N))

results = []
for job in jobs:
    results.append(job.result())

Voraussetzungen

Erstellen eines neuen Notebooks in Ihrem Arbeitsbereich

  1. Melden Sie sich beim Azure-Portal an, und wählen Sie den Arbeitsbereich aus, den Sie im vorherigen Schritt erstellt haben.
  2. Wählen Sie auf dem linken Blatt Notebooks aus.
  3. Klicken Sie auf Meine Notebooks und dann auf Neu hinzufügen.
  4. Geben Sie einen Namen für die Datei ein, z. B. Qiskit.ipynb, und klicken Sie auf Datei erstellen.

Wenn Ihr neues Notebook geöffnet wird, wird der Code für die erste Zelle automatisch auf der Grundlage Ihrer Abonnement- und Arbeitsbereichsinformationen erstellt.

from azure.quantum import Workspace
workspace = Workspace ( 
    resource_id = "", # Add your resource_id 
    location = ""  # Add your workspace location (for example, "westus") 
)

Hinweis

Sofern nicht anders angegeben, müssen Sie die einzelnen Zellen in der Reihenfolge ihrer Erstellung ausführen, um Kompilierungsprobleme zu vermeiden.

Klicken Sie links neben der Zelle auf das dreieckige Wiedergabesymbol, um den Code auszuführen.

Laden der erforderlichen Importe

Zunächst müssen Sie einige zusätzliche Module importieren.

Klicken Sie auf + Code, um eine neue Zelle hinzuzufügen, fügen Sie dann den folgenden Code hinzu, und führen Sie ihn aus:

from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from azure.quantum.qiskit import AzureQuantumProvider

Herstellen einer Verbindung mit dem Azure Quantum-Dienst

Erstellen Sie als Nächstes ein AzureQuantumProvider -Objekt mithilfe des Workspace -Objekts aus der vorherigen Zelle, um eine Verbindung mit Ihrem Azure Quantum-Arbeitsbereich herzustellen. Fügen Sie eine neue Zelle mit dem folgenden Code hinzu:

provider = AzureQuantumProvider(workspace)

Definieren einer einfachen Schaltung

Erstellen Sie in einer neuen Zelle ein circuit-Objekt. Dieses Beispiel ist ein einfacher Quanten-Zufallsbitgenerator. Fügen Sie den folgenden Code hinzu, um die Schaltung zu definieren und anzuzeigen:

# 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 

Alle auflisten targets

Sie können jetzt alle Quantencomputing-Back-Ends targetsanzeigen, die in Ihrem Arbeitsbereich verfügbar sind. Fügen Sie eine neue Zelle hinzu, und führen Sie die folgende Zeile aus:

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.simulator
- ionq.qpu.aria-1
- microsoft.estimator
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2

Wählen Sie ein aus target , um Ihr Programm auszuführen.

Um Ihren Code zu überprüfen, bevor Sie ihn auf der tatsächlichen Quantenhardware ausführen, können Sie den IonQ-Quantensimulator ionq.simulator verwenden.

Fügen Sie eine neue Zelle hinzu, und erstellen Sie ein Objekt zur Darstellung des IonQ-Quantensimulators target:

# Get IonQ quantum simulator target:
simulator_backend = provider.get_backend("ionq.simulator")

Ausführen im IonQ-Simulator

Fügen Sie den folgenden Code hinzu, um die Verbindung im Simulator auszuführen. In diesem Beispiel wird die run -Methode von target verwendet, um Ihren Auftrag zu übermitteln, und überwacht dann den Auftrag status.

# Submit the circuit to run on Azure Quantum
job = simulator_backend.run(circuit, shots=100)
job_id = job.id()
print("Job id", job_id)

Wenn der Auftrag erfolgreich ausgeführt wurde, rufen Sie die Auftragsergebnisse ab, und zeigen Sie sie an:

# Get the job results:
result = job.result()
print(result)
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='7d909574-98d4-11ec-b382-00155d957f5d', success=True, results=[ExperimentResult(shots=100, success=True, meas_level=2, data=ExperimentResultData(counts=defaultdict(<class 'int'>, {'000': 50, '111': 50}), probabilities=defaultdict(<class 'int'>, {'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'))])

Da es sich bei diesem result-Typ um ein für das Qiskit-Paket natives Objekt handelt, können Sie result.get_counts und plot_histogram von Quiskit verwenden, um die Ergebnisse zu visualisieren. Damit sichergestellt ist, dass alle möglichen Bitzeichenfolgen-Bezeichnungen dargestellt werden, fügen Sie sie zu counts hinzu.

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}

Ergebnis der Qiskit-Schaltung im IonQ-Simulator

Schätzen der Auftragskosten

Bevor Sie einen Auftrag auf tatsächlicher Quantenhardware oder einer Quantenverarbeitungseinheit (Quantum Processing Unit , QPU) ausführen, können Sie schätzen, wie viel die Ausführung kostet.

Rufen Sie zunächst erneut die Liste der verfügbaren Anbieter ab:

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.simulator
- ionq.qpu.aria-1
- microsoft.estimator
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2

Erstellen Sie als Nächstes ein Objekt, das den IonQ-Quantencomputer darstellt:

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

Um die Kosten für die Ausführung eines Auftrags auf der QPU zu schätzen, fügen Sie eine neue Zelle hinzu, und führen Sie sie mithilfe der estimate_cost -Methode von aus target:

cost = qpu_backend.estimate_cost(circuit, shots=100)

print(f"Estimated cost: {cost.estimated_total}")

Dadurch werden die geschätzten Kosten in US-Dollar angezeigt.

Die aktuellen Preisdetails finden Sie unter Preise. Suchen Sie alternativ nach Ihrem Arbeitsbereich, und zeigen Sie die Preisoptionen auf dem Blatt Anbieter Ihres Arbeitsbereichs an.

Ausführen auf der IonQ-QPU

Nachdem Sie Ihren Auftrag erfolgreich im IonQ-Simulator ausgeführt und die QPU-Kosten geschätzt haben, ist es an der Zeit, Die Leitung auf der Hardware auszuführen.

Hinweis

Die zum Ausführen einer Schaltung auf der QPU erforderliche Zeit variiert je nach aktueller Warteschlangenzeit. Sie können die durchschnittliche Warteschlangenzeit für ein target anzeigen, indem Sie das Blatt Anbieter Ihres Arbeitsbereichs auswählen.

Verwenden Sie die gleiche run-Methode und die gleichen Vorgänge, die Sie zuvor mit der API-Validierung verwendet haben, um Ihren Auftrag zu übermitteln und zu überwachen:

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

Wenn der Auftrag abgeschlossen ist, rufen Sie die Auftragsergebnisse wie zuvor ab, und zeigen Sie sie in einem Diagramm an:

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 910b5ac8-98cd-11ec-b3ba-00155d5528cf
Job Status: job has successfully run
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='Job id 54e8c740-98d9-11ec-b382-00155d957f5d', 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}

Ergebnis der Qiskit-Schaltung auf der IonQ-QPU

Wichtig

Das Übermitteln mehrerer Schaltungen in einem einzelnen Auftrag wird derzeit nicht unterstützt. Sie können allerdings die Methode backend.run aufrufen, um die einzelnen Schaltungen asynchron zu übermitteln, und anschließend die Ergebnisse jedes Auftrags abrufen. Beispiel:

jobs = []
for circuit in circuits:
    jobs.append(backend.run(circuit, shots=N))

results = []
for job in jobs:
    results.append(job.result())

Nächste Schritte