Schreiben Sie Ihr erstes Programm „ Qiskit Serverless “
Der Code auf dieser Seite wurde unter Berücksichtigung der folgenden Anforderungen entwickelt. Wir empfehlen die Verwendung dieser oder neuerer Versionen.
qiskit[all]~=1.3.1 qiskit-ibm-runtime~=0.34.0 qiskit-aer~=0.15.1 qiskit-serverless~=0.27.0 qiskit-ibm-catalog~=0.2 qiskit-addon-sqd~=0.8.1 qiskit-addon-utils~=0.1.0 qiskit-addon-mpf~=0.2.0 qiskit-addon-aqc-tensor~=0.1.2 qiskit-addon-obp~=0.1.0 scipy~=1.15.0 pyscf~=2.8.0
Qiskit Serverless wird aktualisiert, und seine Funktionen ändern sich schnell. Während dieser Entwicklungsphase finden Sie Release Notes und die aktuellste Dokumentation auf der Seite „ Qiskit Serverless “ () unter GitHub.
Dieses Beispiel zeigt, wie Sie mithilfe qiskit-serverless von Tools ein Programm zur parallelen Transpilierung erstellen und dieses anschließend auf IBM Quantum Platform hochladen können, um qiskit-ibm-catalog es als wiederverwendbaren Remote-Dienst zu nutzen.
Übersicht über den Arbeitsablauf
- Erstelle ein lokales Verzeichnis und leere die Programmdatei (
./source_files/transpile_remote.py) - Füge deinem Programm Code hinzu, der beim Hochladen auf Qiskit Serverless eine Schaltung transpiliert
- Verwenden Sie
qiskit-ibm-catalogzur Authentifizierung bei Qiskit Serverless - Laden Sie das Programm auf Qiskit Serverless hoch
Nachdem Sie Ihr Programm hochgeladen haben, können Sie es ausführen, um die Schaltung zu transpilieren, indem Sie der Anleitung „Run your first Qiskit Serverless workload remotely“ folgen.
Beispiel: Remote-Transpilation mit Qiskit Serverless
Dieses Beispiel führt Sie durch die Erstellung und Ergänzung einer Programmdatei, die, sobald Sie sie auf Qiskit Serverless hochladen, ein circuit gegenüber einem vorgegebenen backend und einer Zielplattform optimization_leveltranspiliert.
Qiskit Serverless erfordert das Einrichten der .py Dateien Ihrer Workloads in einem speziellen Verzeichnis. Die folgende Struktur ist ein Beispiel für eine gute Praxis:
serverless_program
├── program_uploader.ipynb
└── source_files
├── transpile_remote.py
└── *.pyServerless lädt den Inhalt eines bestimmten Verzeichnisses (in diesem Beispiel das source_files Verzeichnis) hoch, um es remote auszuführen. Sobald diese eingerichtet sind, können Sie die Einstellungen anpassen, transpile_remote.py um Eingaben abzurufen und Ausgaben zurückzugeben.
Erstellen Sie das Verzeichnis und eine leere Programmdatei
Erstellen Sie zunächst ein Verzeichnis mit dem Namen source_files, und legen Sie dann eine Programmdatei in diesem Verzeichnis an, sodass ihr Pfad lautet ./source_files/transpile_remote.py. Dies ist die Datei, die Sie auf Qiskit Serverless hochladen werden.
Füge Code zu deiner Programmdatei hinzu
Fügen Sie den folgenden Code in Ihre Programmdatei ein und speichern Sie sie anschließend.
Wenn Sie die Codezellen lokal in einem Notizbuch ausführen, wird der %%writefile magische Befehl angezeigt. Wenn man Zellen mit diesem magischen Befehl ausführt, werden sie auf der Festplatte gespeichert, anstatt ausgeführt zu werden.
# This cell is hidden from users, it creates a new folder
from pathlib import Path
Path("./source_files").mkdir(exist_ok=True)# If you include the preceding `%%writefile` command (visible only when you read this
# locally in a notebook), running this cell saves to disk rather than executing the code.
from qiskit.transpiler import generate_preset_pass_manager
def transpile_remote(circuit, optimization_level, backend):
"""Transpiles an abstract circuit into an ISA circuit for a given backend."""
pass_manager = generate_preset_pass_manager(
optimization_level=optimization_level,
backend=backend
)
isa_circuit = pass_manager.run(circuit)
return isa_circuitCode hinzufügen, um Programmargumente abzurufen
Füge nun den folgenden Code in deine Programmdatei ein, der die Programmargumente einrichtet.
Ihr ursprüngliches transpile_remote.py hat drei Eingänge: circuits, backend_name, und optimization_level. Serverless ist derzeit darauf beschränkt, nur serialisierbare Ein- und Ausgaben zu akzeptieren. Aus diesem Grund können Sie backend nicht direkt eingeben, sondern müssen stattdessen backend_name als String verwenden.
# If you include the preceding `%%writefile` command (visible only when you read this
# locally in a notebook), running this cell saves to disk rather than executing the code.
from qiskit_serverless import get_arguments, save_result, distribute_task, get
# Get program arguments
arguments = get_arguments()
circuits = arguments.get("circuits")
backend_name = arguments.get("backend_name")
optimization_level = arguments.get("optimization_level")Füge Code hinzu, der das Backend aufruft
Fügen Sie den folgenden Code in Ihre Programmdatei ein. Dieser ruft einen Laufzeitservice ab und nutzt ihn zur Auswahl Ihres Backends.
Erstellen Sie im Code, der auf Qiskit Serverless ausgeführt wird, Ihren Laufzeitdienst mit get_runtime_service() (importiert aus qiskit_serverless) anstelle einer direkten QiskitRuntimeService() Instanziierung von.
get_runtime_service() Gibt einen Drop-in-Wrapper zurück, der QiskitRuntimeService jeden von IBM Quantum gestarteten Primitivjob und jede Sitzung beim übergeordneten Job Qiskit Serverless registriert. Über diese Verknüpfung kann die Plattform einen serverlosen Job mit den von ihm erzeugten QPU-Jobs und -Sitzungen verknüpfen, um den Status zu verfolgen, Protokolle zu erstellen sowie die Nutzung und Abrechnung zu erfassen. Ein „bare“ übermittelt QiskitRuntimeService Aufträge, die die Plattform niemals mit Ihrem Serverless-Auftrag verknüpft, sodass diese Verknüpfung verloren geht.
Alle Argumente sind optional. Im Programmquellcode wird die Form get_runtime_service() ohne Argumente empfohlen, da dabei Ihre Authentifizierungsdaten aus der Umgebung abgerufen werden. Sie akzeptiert dieselben optionalen Argumente url channel, token, instance, und wie QiskitRuntimeService.
Der folgende Code geht davon aus, dass Sie die Anweisungen zum Speichern Ihrer Anmeldedaten bereits befolgt haben und lädt Ihr standardmäßig gespeichertes Konto QiskitRuntimeService.save_account, sofern Sie nichts anderes angeben. Weitere Informationen finden Sie unter „Speichern Sie Ihre Anmeldedaten“ und „Initialisieren Sie Ihr IBM Quantum Compute Service-Konto “.
# If you include the preceding `%%writefile` command (visible only when you read this
# locally in a notebook), running this cell saves to disk rather than executing the code.
from qiskit_serverless import get_runtime_service
service = get_runtime_service()
backend = service.backend(backend_name)Code zum Transpilen hinzufügen
Fügen Sie abschließend den folgenden Code in Ihre Programmdatei ein. Dieser Code durchläuft alle circuits``transpile_remote() übergebenen Werte und gibt das transpiled_circuits Ergebnis zurück:
# If you include the preceding `%%writefile` command (visible only when you read this
# locally in a notebook), running this cell saves to disk rather than executing the code.
# Each circuit is being transpiled and will populate the array
results = [
transpile_remote(circuit, 1, backend)
for circuit in circuits
]
save_result({
"transpiled_circuits": results
})Bei Qiskit Serverless anmelden
Verwenden Sie qiskit-ibm-catalog , um sich bei QiskitServerless mit Ihrem API-Schlüssel anzumelden (Sie können Ihren QiskitRuntimeService API-Schlüssel verwenden oder einen neuen API-Schlüssel im IBM Quantum Platform -Dashboard erstellen).
from qiskit_ibm_catalog import QiskitServerless, QiskitFunction
# Authenticate to the remote cluster and submit the pattern for remote execution
serverless = QiskitServerless()Code zum Hochladen ausführen
Führe den folgenden Code aus, um das Programm hochzuladen. Qiskit Serverless komprimiert den Inhalt von working_dir (in diesem Fall ) source_files in eine tar, die hochgeladen und anschließend bereinigt wird. Die entrypoint gibt die ausführbare Hauptdatei an, die von „ Qiskit Serverless “ ausgeführt werden soll.
transpile_remote_demo = QiskitFunction(
title="transpile_remote_serverless",
entrypoint="transpile_remote.py",
working_dir="./source_files/",
)serverless.upload(transpile_remote_demo)Output:
QiskitFunction(transpile_remote_serverless)
Upload überprüfen
Um zu überprüfen, ob der Upload erfolgreich war, verwenden Sie serverless.list(), wie im folgenden Code gezeigt:
# Get program from serverless.list() that matches the title of the one we uploaded
next(
program
for program in serverless.list()
if program.title == "transpile_remote_serverless"
)Output:
QiskitFunction(transpile_remote_serverless)
Nächste Schritte
- Erfahren Sie im Abschnitt „Erste „ Qiskit Serverless “-Workload remote ausführen“, wie Sie Eingaben übergeben und Ihr Programm remote ausführen können.