Übermitteln einer Verbindung mit Qiskit an Azure Quantum
Erfahren Sie, wie Sie mithilfe des azure-quantum
Python Pakets eine Qiskit-Quantenschaltung übermitteln. Sie können Qiskit-Leitungen an Azure Quantum übermitteln, indem Sie das Azure Quantum-Notebook verwenden, das über azure-quantum
Python 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.
Ein Azure Quantum-Arbeitsbereich in Ihrem Azure-Abonnement. Informationen zum Erstellen eines Arbeitsbereichs finden Sie unter Erstellen von Azure Quantum-Arbeitsbereichen mit dem Azure-Portal.
Eine Python Umgebung, in derPython und Pip installiert ist.
VS Code mit installierten Erweiterungen Azure Quantum Development Kit, Pythonund Jupyter .
Das Azure Quantum-Paket
azure-quantum
mit dem Tag [qiskit] und denqsharp
Paketen undipykernel
.python -m pip install --upgrade azure-quantum[qiskit] qsharp ipykernel
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 Befehlspalette anzeigen > und dann Erstellen: Neue Jupyter Notebook aus.
- 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.
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}
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}
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
- Ein Azure-Konto mit einem aktiven Abonnement. Wenn Sie kein Azure-Konto besitzen, registrieren Sie sich kostenlos, und registrieren Sie sich für ein Abonnement mit nutzungsbasierter Bezahlung.
- 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-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}
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}
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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für