Zum Hauptinhalt springen

Deine erste Qiskit Serverless-Arbeitslast remote ausführen

Paketversionen

Der Code auf dieser Seite wurde mit den folgenden Anforderungen entwickelt. Wir empfehlen, diese Versionen oder neuere zu verwenden.

qiskit[all]~=1.4.0
qiskit-ibm-runtime~=0.36.1
qiskit-ibm-catalog~=0.4

Dieser Abschnitt zeigt, wie du qiskit-ibm-catalog verwendest, um in Qiskit Serverless verfügbare Programme aufzulisten, Eingaben an diese Programme zu übergeben, sie remote auszuführen, ihren Status zu prüfen sowie Ergebnisse und Logs abzurufen.

Stelle sicher, dass du dich bei Qiskit Serverless mit deinem API-Schlüssel authentifiziert hast (Anweisungen dazu findest du unter Auf IBM Quantum Platform deployen).

Verfügbare Programme auflisten

Du kannst QiskitServerless.list() verwenden, um eine Liste der verfügbaren Programme abzurufen, die du mit Qiskit Serverless ausführen kannst. Dazu gehört das zuvor hochgeladene transpile_remote_serverless.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime
from qiskit_ibm_catalog import QiskitServerless

serverless = QiskitServerless()
next(
program
for program in serverless.list()
if program.title == "transpile_remote_serverless"
)
QiskitFunction(transpile_remote_serverless)

Ein hochgeladenes Programm ausführen und Eingaben übergeben

Zuerst richtest du deine Eingaben ein. Dein Programm hat drei Eingaben: circuits, backend und optimization_level. Du kannst random_circuit verwenden, um 30 zufällige Circuits zu erstellen:

from qiskit.circuit.random import random_circuit

qc_random = [(random_circuit(4, 4, measure=True, seed=i)) for i in range(10)]
qc_random[0].draw(output="mpl", idle_wires=False)

Ausgabe der vorherigen Code-Zelle

Verwende anschließend QiskitRuntimeService und least_busy, um einen backend auszuwählen:

from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
print(backend.name)

Lege deinen Optimierungsgrad fest:

optimization_level = 3

Wähle dein Programm mit serverless.load('PROGRAM_NAME'):

transpile_remote_serverless = serverless.load("transpile_remote_serverless")

Übergib dann deine Eingaben und führe es auf pythonische Weise wie folgt aus:

job = transpile_remote_serverless.run(
circuits=qc_random,
backend=backend.name,
optimization_level=optimization_level,
)
job.job_id
'118256c5-bbb0-4ea8-9e9f-51aac2220aef'

Job-Status prüfen

Mit deiner Qiskit Serverless job_id kannst du den Status laufender Jobs prüfen. Dabei sind folgende Statuswerte möglich:

  • QUEUED: Das remote Programm befindet sich in der Qiskit Serverless-Warteschlange. Die Warteschlangenpriorität basiert derzeit darauf, wie viel du Qiskit Serverless bereits genutzt hast
  • INITIALIZING: Das remote Programm startet; dazu gehört das Einrichten der Remote-Umgebung und das Installieren von Abhängigkeiten
  • RUNNING: Das Programm wird ausgeführt. In dieser Phase kannst du, wenn dein Programm print()-Ausgaben enthält, Logs mit job.logs() abrufen
  • DONE: Das Programm ist abgeschlossen, und du kannst in save_result() gespeicherte Daten mit job.results() abrufen

Weitere detaillierte Job-Statuswerte kannst du unter Qiskit Serverless-Compute- und Datenressourcen verwalten festlegen.

job.status()
'QUEUED'
# This cell is hidden from users, it checks the job status
assert _ in ["QUEUED", "INITIALIZING", "RUNNING", "DONE"] # noqa: F821
tipp

Derzeit spiegelt die IBM Quantum-Arbeitslasttabelle nur Qiskit Runtime-Arbeitslasten wider. Verwende job.status(), um den aktuellen Status deiner Qiskit Serverless-Arbeitslast zu sehen.

Du hast dein erstes Qiskit Serverless-Programm erfolgreich ausgeführt!

Logs und Ergebnisse abrufen

Wie bereits erwähnt, kannst du, sobald ein Programm RUNNING ist, job.logs() verwenden, um Logs aus print()-Ausgaben abzurufen:

logs = job.logs()
print(logs)
No logs yet.

Du kannst einen Job auch jederzeit abbrechen:

job.stop()
'Job has been stopped.'

Sobald ein Programm DONE ist, kannst du job.results() verwenden, um das in save_result() gespeicherte Ergebnis abzurufen:

# We can't get results from a cancelled job, so we'll fetch a completed one instead
completed_job = next(
job for job in serverless.jobs() if job.status() == "DONE"
)
completed_job.result()
{'transpiled_circuits': [<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93eca64810>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5e5310>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5d5310>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec58b490>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec57d310>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec535950>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec523c90>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec60a990>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5527d0>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec4152d0>]}

Zuvor mit Qiskit Serverless ausgeführte Jobs auflisten

Du kannst jobs() verwenden, um alle an Qiskit Serverless gesendeten Jobs aufzulisten:

old_jobs = serverless.jobs()
old_jobs
[<Job | 118256c5-bbb0-4ea8-9e9f-51aac2220aef>,
<Job | e9a36469-7d6b-4f00-bf91-78709ebdbbff>,
<Job | 4efd601b-8f61-4c8e-b14a-0b8a9c649dc0>,
<Job | 87cd22c7-8eb9-4606-bdb4-befe946e9e9b>,
<Job | be9a6dfd-0830-4250-aa60-acdd05bb8818>,
<Job | 479513dd-6a76-4c3e-ba49-bb21351b9a05>,
<Job | f9c20c31-be46-41b3-97ac-99f7be61f89e>,
<Job | 37fa2489-4449-4bfb-974e-9d9a9ec3cc21>,
<Job | b754c4e8-6817-48db-9bb9-74c151d6349a>,
<Job | 78bc6744-b417-48cb-8e01-59bb63bcc2be>]

Nächste Schritte

Empfehlungen