So übermitteln Sie einen Schaltkreis mit Qiskit an Azure Quantum
Erfahren Sie, wie Sie mithilfe des azure-quantum
Python Pakets eine Qiskit-Quantenschaltung übermitteln. Sie können Qiskit-Schaltkreise mithilfe eines Azure Quantum-Notizbuchs azure-quantum
Python , das über ein integriertes Paket verfügt, oder von Ihrem lokalen Computer an Azure Quantum übermitteln. Sie können Ihre Schaltkreise auch mit dem lokalen Sparsesimulator testen.
Weitere Informationen finden Sie unter Quantenschaltungen.
Voraussetzungen
Installationsdetails finden Sie unter Installieren des QDK unter VS Code.
Ein Azure Quantum-Arbeitsbereich in Ihrem Azure-Abonnement. Zur Erstellung eines Arbeitsbereichs, siehe bitte Erstellen eines Azure Quantum Arbeitsbereichs.
Eine Python Umgebung mit Python installierter Pip .
VS Code mit installierten Azure Quantum Development Kit- Pythonund Jupyter-Erweiterungen .
Das Azure Quantum-Paket
azure-quantum
Python mit dem [qiskit]-Tag.python -m pip install --upgrade azure-quantum[qiskit] qsharp ipykernel
Wichtig
Stellen Sie sicher, dass Sie über die neueste Version von Qiskit verfügen. Weitere Informationen finden Sie unter Aktualisieren des Azure-Quantum-PaketsPython.
Hinweis
Wenn der Jupyter-Kernel Python
ipykernel
nicht erkannt wird, werden Sie von VS Code aufgefordert, ihn zu installieren.
Erstellen eines neuen Jupyter Notebooks
- Wählen Sie in VS Code die Optionen Ansicht > Befehlspalette und dann Erstellen aus: Verwenden von Jupyter Notebook.
- In der oberen rechten Ecke erkennt und zeigt VS Code die Version und Python die virtuelle Python Umgebung an, die für das Notizbuch ausgewählt wurde. Wenn Sie über mehrere Python Umgebungen verfügen, müssen Sie möglicherweise einen Kernel mit der Kernelauswahl oben rechts auswählen. Wenn keine Umgebung erkannt wurde, finden Sie Informationen zum Einrichten unter Jupyter-Notizbücher in VS Code .
Laden der erforderlichen Importe
Führen Sie in der ersten Zelle Ihres Notizbuchs den folgenden Code aus, um die erforderlichen Importe zu laden:
import azure.quantum
from azure.quantum import Workspace
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from azure.quantum.qiskit import AzureQuantumProvider
Herstellen einer Verbindung mit dem Azure Quantum-Dienst
Um eine Verbindung mit dem Azure Quantum-Dienst herzustellen, benötigen Sie die Ressourcen-ID und den Standort Ihres Azure Quantum-Arbeitsbereichs.
Melden Sie sich bei Ihrem Azure-Konto an, https://portal.azure.com
Wählen Sie Ihren Azure Quantum-Arbeitsbereich aus, und navigieren Sie zu "Übersicht".
Kopieren Sie die Parameter in den Feldern.
Fügen Sie eine neue Zelle in Ihrem Notizbuch hinzu, und verwenden Sie Ihre Kontoinformationen, um eine Workspace
Verbindung mit Ihrem Azure Quantum-Arbeitsbereich herzustellen.AzureQuantumProvider
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
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 target , um Ihr Programm auszuführen.
Ausführen im IonQ-Simulator
Bevor wir auf echter Hardware laufen, testen wir den Schaltkreis im Simulator. Dient get_backend
zum Erstellen eines Objekts zum Herstellen einer Backend
Verbindung mit dem IonQ Simulator-Back-End:
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 Ihr Schaltkreis Tore enthält, die nicht in dieser Liste enthalten sind, müssen Sie die unterstützte gateset
Funktion mithilfe der transpile
von Qiskit bereitgestellten Funktion transpilieren:
from qiskit import transpile
circuit = transpile(circuit, simulator_backend)
Die Transpile-Funktion gibt ein neues Schaltkreisobjekt zurück, bei dem Gates in Tore 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=8)
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=8, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 4, '111': 4}, memory=['000', '000', '000', '000', '111', '111', '111', '111'], probabilities={'000': 0.5, '111': 0.5}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits=3, metadata={}), status=JobStatus.DONE, name='Qiskit Sample - 3-qubit GHZ circuit')], date=None, status=None, header=None, error_data=None)
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': 4, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 4}
Sie können die get_memory()
Funktion auch verwenden, um einzelne Aufnahmedaten aus dem Auftrag anzuzeigen.
result.get_memory(circuit)
['000', '000', '000', '000', '111', '111', '111', '111']
Hinweis
Wenn Sie auf IonQ targetseinen Auftrag mit einer ungeraden Anzahl von Aufnahmen einreichen, werden die Ergebnisse auf die nächste gerade Zahl aufgerundet. Wenn Sie beispielsweise 9 Aufnahmen angeben, werden in den Ergebnissen Daten für 8 Aufnahmen angezeigt.
Schätzen der Auftragskosten
Bevor Sie einen Auftrag auf der QPU ausführen, sollten Sie abschätzen, wie viel es kostet.
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 herzustellen (eine Quantum Processor Unit (QPU)), geben Sie einfach den Namen der target"ionq.qpu.aria-1"
Methode get_backend
an:
qpu_backend = provider.get_backend("ionq.qpu.aria-1")
Übermitteln Sie den Schaltkreis für die Ausführung auf Azure Quantum, rufen Sie die Ergebnisse ab und führen Sie plot_histogram
aus, 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=100)
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.qpu.aria-1', 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}
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. Zum Beispiel:
jobs = []
for circuit in circuits:
jobs.append(backend.run(circuit, shots=N))
results = []
for job in jobs:
results.append(job.result())
Voraussetzungen
- Ein Azure-Konto mit einem aktiven Abonnement. Wenn Sie nicht über ein Azure-Konto verfügen, registrieren Sie sich kostenlos, und registrieren Sie sich für ein Kostenpflichtiges Abonnement.
- Azure Quantum-Arbeitsbereich Weitere Informationen finden Sie unter Erstellen eines Azure Quantum-Arbeitsbereichs.
Erstellen eines neuen Notebooks in Ihrem Arbeitsbereich
- Melden Sie sich beim Azure-Portal an, und wählen Sie den Arbeitsbereich aus, den Sie im vorherigen Schritt erstellt haben.
- Wählen Sie auf dem linken Blatt Notebooks aus.
- Klicken Sie auf Meine Notebooks und dann auf Neu hinzufügen.
- 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 targets- oder Back-End-Dateien anzeigen, 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.simulator
- ionq.qpu.aria-1
- microsoft.estimator
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
Wählen Sie ein 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, um den IonQ-Quantensimulator targetdarzustellen:
# Get IonQ quantum simulator target:
simulator_backend = provider.get_backend("ionq.simulator")
Ausführen im IonQ-Simulator
Um den Schaltkreis auf dem Simulator auszuführen, fügen Sie den folgenden Code hinzu. In diesem Beispiel wird die run
Methode verwendet target , um Ihren Auftrag zu übermitteln, und anschließend wird der Auftragsstatus überwacht.
# Submit the circuit to run on Azure Quantum
job = simulator_backend.run(circuit, shots=8)
job_id = job.id()
print("Job id", job_id)
Wenn der Auftrag erfolgreich ausgeführt wird, 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='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=8, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 4, '111': 4}, memory=['000', '000', '000', '000', '111', '111', '111', '111'], probabilities={'000': 0.5, '111': 0.5}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits=3, metadata={}), status=JobStatus.DONE, name='Qiskit Sample - 3-qubit GHZ circuit')], date=None, status=None, header=None, error_data=None)
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': 4, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 4}
Sie können die get_memory()
Funktion auch verwenden, um einzelne Aufnahmedaten aus dem Auftrag anzuzeigen.
result.get_memory(circuit)
['000', '000', '000', '000', '111', '111', '111', '111']
Hinweis
Wenn Sie auf IonQ targetseinen Auftrag mit einer ungeraden Anzahl von Aufnahmen einreichen, werden die Ergebnisse auf die nächste gerade Zahl aufgerundet. Wenn Sie beispielsweise 9 Aufnahmen angeben, werden in den Ergebnissen Daten für 8 Aufnahmen angezeigt.
Schätzen der Auftragskosten
Bevor Sie einen Auftrag auf der tatsächlichen Quantenhardware oder einer Quantenverarbeitungseinheit (Quantum Processing Unit , QPU) ausführen, sollten Sie abschätzen, wie viel es kostet.
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 auf dem IonQ-Simulator ausgeführt und die QPU-Kosten geschätzt haben, ist es an der Zeit, Ihren Schaltkreis 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 Objekt 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=100)
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}
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. Zum Beispiel:
jobs = []
for circuit in circuits:
jobs.append(backend.run(circuit, shots=N))
results = []
for job in jobs:
results.append(job.result())
Voraussetzungen
Installationsdetails finden Sie unter Installing the Quantum Development Kit on VS Code.
Eine Python Umgebung mit Python installierter Pip .
VS Code mit installiertem Azure Quantum Development Kit und Python Erweiterungen.
Das Azure Quantum-Paket
qsharp
Python mit denqiskit
Tags.widget
python pip install "qsharp[qiskit,widgets]>=1.9"
Wichtig
Stellen Sie sicher, dass Sie über die neueste Version von Qiskit verfügen. Weitere Informationen finden Sie unter Aktualisieren des Azure-Quantum-PaketsPython.
Ausführen einer Basisschaltung
Öffnen Sie in VS Code eine neue Python Datei, um eine einfache Schaltung mithilfe des integrierten Sparsesimulators im Qsharp-Paket zu definieren und auszuführen.
# load the required imports
from qiskit.circuit.random import random_circuit
from qsharp.interop.qiskit import QSharpBackend
# define and display the circuit
circuit = random_circuit(2, 2, measure=True)
print(circuit)
# run the circuit using the built-in sparse simulator
backend = QSharpBackend()
job = backend.run(circuit)
counts = job.result().get_counts()
print(counts)
Um das Programm auszuführen, wählen Sie oben rechts das Symbol "Ausführen" und dann "Datei ausführen" Python aus. Die Ausgabe wird in einem neuen Terminalfenster angezeigt.
┌─────────────────────────┐┌─┐
q_0: ─■───────────┤0 ├┤M├───
│P(0.79983) │ (XX-YY)(1.9337,1.7385) │└╥┘┌─┐
q_1: ─■───────────┤1 ├─╫─┤M├
└─────────────────────────┘ ║ └╥┘
c: 2/═════════════════════════════════════════╩══╩═
0 1
{'11': 680, '00': 344}