Erste Schritte mit „ Qiskit Functions “
Nutzer der Tarife „Premium“, „Flex“ und „ On-Prem “ (über die „ IBM Quantum Platform “-API) können „ IBM “ unter Qiskit Functions kostenlos nutzen oder eine Lizenz bei einem der Partner erwerben, die eine Funktion zum Katalog beigesteuert haben.
Fordern Sie eine kostenlose Testversion für das Drittanbieter- Qiskit Functions an
Um eine kostenlose Testversion anzufordern, rufen Sie die Seite „ Qiskit Functions Catalog “ auf und sehen Sie sich den Detailbereich an. AccessGroupIdKlicken Sie auf Request a free trial und geben Sie die vom „Functions“-Partner angeforderten Informationen ein, einschließlich der „ IBM Cloud “:
- Rufen Sie die Seite „ IBM Cloud -IAM“ auf.
- Prüfen Sie die Anspruchsberechtigung.
- Wechseln Sie in der Menüleiste im Kopfbereich zu einem Konto mit folgendem Format:
XXXXXXX - [Organization Name] - Stellen Sie sicher, dass es sich um dieselbe Organisation handelt wie die, die mit Ihrem Premium-Konto verknüpft ist.
- Wenn „[Dein Name] “ als Kontobezeichnung angezeigt wird, nutzt du dein persönliches Konto, das keinen Anspruch auf Premium-Zugang hat.
- Wechseln Sie in der Menüleiste im Kopfbereich zu einem Konto mit folgendem Format:
- Ermitteln Sie Ihre Zugangsgruppen-ID.
- Klicken Sie auf einen Gruppennamen.
- Klicken Sie auf „Details “.
- Kopieren Sie die ID der Zugangsgruppe. Es sollte mit
AccessGroup-. beginnen.
Installieren Sie den „ Qiskit Functions Catalog “-Client
-
Um „ Qiskit Functions “ nutzen zu können, installieren Sie den „ IBM “-Client unter Qiskit Functions Catalog :
pip install qiskit-ibm-catalog -
Rufen Sie Ihren API-Schlüssel im IBM Quantum Platform Dashboard ab und aktivieren Sie Ihre virtuelle Python Umgebung. Lesen Sie die Installationsanleitung, falls Sie noch keine virtuelle Umgebung eingerichtet haben.
Wenn Sie in einer vertrauenswürdigen „ Python “-Umgebung arbeiten (z. B. auf einem privaten Laptop oder einer Workstation), verwenden Sie die
save_account()Methode, um Ihre Anmeldedaten lokal zu speichern. ( Fahren Sie mit dem nächsten Schritt fort, wenn Sie sich nicht in einer vertrauenswürdigen Umgebung – beispielsweise an einem gemeinsam genutzten oder öffentlichen Computer – bei IBM Quantum Platform anmelden.)Die Instanz, bei der Sie sich authentifizieren, muss über einen „ Qiskit Functions “-Zugriff verfügen. Informationen zur Konfiguration auf einer bestehenden Instanz finden Sie unter „ Qiskit Functions -Zugriff auf einer Instanz konfigurieren “.
save_account()Um das Programm zu verwenden, führen Siepythonin Ihrer Shell aus und geben Sie anschließend Folgendes ein:from qiskit_ibm_catalog import QiskitFunctionsCatalog QiskitFunctionsCatalog.save_account(channel="ibm_quantum_platform", token="<your-token>", instance="<instance-crn>")Typ
exit(). Wenn Sie sich künftig beim Dienst authentifizieren müssen, können Sie Ihre Anmeldedaten wie folgt laden:from qiskit_ibm_catalog import QiskitFunctionsCatalog catalog = QiskitFunctionsCatalog()Zum Beispiel:
# Load saved credentials
from qiskit_ibm_catalog import QiskitFunctionsCatalog
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")Vermeiden Sie die Ausführung von Code auf einem nicht vertrauenswürdigen Rechner oder in einer externen Cloud- Python -Umgebung, um Sicherheitsrisiken zu minimieren. Wenn Sie eine nicht vertrauenswürdige Umgebung nutzen müssen (z. B. auf einem öffentlichen Computer), ändern Sie Ihren API-Schlüssel nach jeder Nutzung, indem Sie ihn auf der IBM Cloud API- Schlüsselseite löschen, um das Risiko zu verringern. Weitere Informationen finden Sie im Abschnitt „Verwalten von API-Schlüsseln für Benutzer “. Um den Dienst in dieser Situation zu initialisieren, verwenden Sie folgenden Code:
from qiskit_ibm_catalog import QiskitFunctionsCatalog
# After using the following code, delete your API key on the
# IBM Quantum Platform home dashboard
catalog = QiskitFunctionsCatalog(token="<YOUR_API_KEY>") # Use the 44-character
# API_KEY you created and saved from the IBM Quantum Platform Home dashboardFügen Sie Ihren Schlüssel niemals in den Quellcode, in „ Python “-Skripte oder in Notebook-Dateien ein. Wenn Sie Code mit anderen teilen, achten Sie darauf, dass Ihr API-Schlüssel nicht direkt in das Skript „ Python “ eingebettet ist. Teilen Sie stattdessen das Skript ohne den Schlüssel und geben Sie Anweisungen zur sicheren Einrichtung.
Falls Sie Ihren Schlüssel versehentlich mit jemandem teilen oder ihn in eine Versionsverwaltung wie Git einbinden, widerrufen Sie Ihren Schlüssel umgehend, indem Sie ihn auf der IBM Cloud API- Schlüsselseite löschen, um das Risiko zu minimieren. Weitere Informationen finden Sie im Abschnitt „Verwalten von API-Schlüsseln für Benutzer “.
Listen Sie die Funktionen auf, auf die Sie zugreifen können
Nachdem Sie sich authentifiziert haben, können Sie die Funktionen aus dem „ Qiskit Functions Catalog “ auflisten, auf die Sie Zugriff haben:
catalog.list()Output:
[QiskitFunction(qunova/hivqe-chemistry),
QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),
QiskitFunction(algorithmiq/tem),
QiskitFunction(qedma/qesem),
QiskitFunction(multiverse/singularity),
QiskitFunction(ibm/circuit-function),
QiskitFunction(q-ctrl/optimization-solver),
QiskitFunction(colibritd/quick-pde),
QiskitFunction(q-ctrl/performance-management),
QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]
Aktivierte Funktionen ausführen
catalog.load("<provider/function-name>")Nachdem ein Katalogobjekt instanziiert wurde, können Sie eine Funktion wie folgt auswählen:
qesem_function = catalog.load("qedma/qesem")Jede Qiskit-Funktion verfügt über eigene Eingaben, Optionen und Ausgaben. Weitere Informationen finden Sie auf den jeweiligen Dokumentationsseiten zu der Funktion, die Sie ausführen möchten. Standardmäßig können alle Benutzer jeweils nur einen Funktionsjob ausführen:
from qiskit.quantum_info import SparsePauliOp
avg_magnetization = SparsePauliOp.from_sparse_list(
[("Z", [q], 1 / 5) for q in range(5)], num_qubits=5
)
job = qesem_function.run(
pubs=[(circuit, [avg_magnetization, observable])],
backend_name=backend_name, # example: "ibm_fez"
# options = {
# "estimate_time_only": "empirical",
# "default_precision": 0.2, # Default precision is applied to all pubs that don't have a precision specified, see API reference for more details
# "max_execution_time": 3600, # You can specify a maximum QPU time in seconds, see API reference for more details
# "transpilation_level": "standard", # "minimal_with_layout_opt" for minimal transpilation, see API reference for more details
# "parallel_execution": True, # True for parallel execution, see API reference for more details
# },
)
job.job_idOutput:
'7f08c9d5-471b-4da2-92e7-4f2cb94c23a8'
run() überprüft die verbleibende Kapazität und den Backend-Zugriff, bevor der Auftrag übermittelt wird. Wenn die Kapazität Ihrer Instanz erschöpft ist oder das von Ihnen angegebene Backend nicht erreichbar ist, run() wird sofort ein Fehler ausgelöst, anstatt den Auftrag in der Warteschlange scheitern zu lassen. Wenn die Kapazität niedrig ist, run() wird eine Warnung ausgegeben. Drücke suppress_low_usage_warning=True die Taste, um den Ton auszuschalten.
job = qesem_function.run(
pubs=[(circuit, [avg_magnetization, observable])],
backend_name=backend_name, # example: "ibm_fez"
suppress_low_usage_warning=True,
# options = {
# "estimate_time_only": "empirical",
# "default_precision": 0.2, # Default precision is applied to all pubs that don't have a precision specified, see API reference for more details
# "max_execution_time": 3600, # You can specify a maximum QPU time in seconds, see API reference for more details
# "transpilation_level": "standard", # "minimal_with_layout_opt" for minimal transpilation, see API reference for more details
# "parallel_execution": True, # True for parallel execution, see API reference for more details
# },
)Auftragsstatus prüfen
job_idMit Ihrer Qiskit-Funktion können Sie den Status laufender Jobs überprüfen. Dazu gehören die folgenden Status:
QUEUED: Das Remote-Programm befindet sich in der Qiskit-Funktionswarteschlange. Die Priorität in der Warteschlange richtet sich danach, wie oft Sie „ Qiskit Functions “ bereits genutzt haben.INITIALIZING: Das Remote-Programm wird gestartet; dies umfasst die Einrichtung der Remote-Umgebung und die Installation der erforderlichen Komponenten.RUNNING: Das Programm läuft. Dazu gehören auch einige detailliertere Statusangaben, sofern diese von bestimmten Funktionen unterstützt werden.RUNNING: MAPPING: Die Funktion ordnet derzeit Ihre klassischen Eingaben den Quanteneingaben zu.RUNNING: OPTIMIZING_FOR_HARDWARE: Die Funktion wird für die ausgewählte QPU optimiert. Dazu könnten beispielsweise die Transpilierung von Schaltkreisen, die Charakterisierung von QPUs, die Backpropagation anhand von Observablen und so weiter gehören.RUNNING: WAITING_FOR_QPU: Die Funktion hat einen Auftrag an den „ IBM Quantum “-Compute-Service übermittelt und wartet nun in der Warteschlange.RUNNING: EXECUTING_QPU: Die Funktion verfügt über einen aktiven Quantum-Compute-Auftrag.RUNNING: POST_PROCESSING: Die Funktion dient der Nachbearbeitung der Ergebnisse, wozu unter anderem die Fehlerminderung und die Abbildung von Quanten-Ergebnissen auf klassische Ergebnisse gehören können.
DONE: Das Programm ist fertig, und Sie können die Ergebnisdaten mitjob.result()… abrufen.ERROR: Das Programm wurde aufgrund eines Problems beendet. Verwendenjob.result()Sie, um die Fehlermeldung anzuzeigen.CANCELED: Das Programm wurde von einem Benutzer, dem Dienst oder dem Server abgebrochen.
job.status()Output:
'QUEUED'
Ergebnisse abrufen
Nachdem ein Programm ausgeführt wurde DONE, können Sie verwenden, job.result() um das Ergebnis abzurufen. Dieses Ausgabeformat variiert je nach Funktion. Befolgen Sie daher unbedingt die jeweilige Dokumentation:
result = job.result()
print(result)Output:
PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': True, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})
Sie können einen Auftrag auch jederzeit stornieren:
job.cancel()Output:
'Job has been stopped.'
Auf die zugehörigen Quantum-Compute-Jobs zugreifen
Eine Qiskit-Funktion kann während ihrer Ausführung einen oder mehrere Quantum-Compute-Jobs an eine QPU übermitteln. Um die IDs dieser Laufzeit-Jobs abzurufen, verwenden Sie job.runtime_jobs(). Mit diesen IDs können Sie die Laufzeit-Job-Objekte aus einer Instanz QiskitRuntimeService abrufen oder die Workloads im IBM Quantum® Platform -Dashboard anzeigen.
runtime_job_ids = job.runtime_jobs()
runtime_job_idsWenn eine Funktion ihre Laufzeitaufträge in Sitzungen oder Stapel gruppiert, verwenden Sie, job.runtime_sessions() um die Sitzungs-IDs aufzulisten. Übergeben Sie eine Sitzungs-ID an, um job.runtime_jobs() nur die laufenden Jobs dieser Sitzung anzuzeigen:
sessions = job.runtime_sessions()
if sessions:
session_runtime_jobs = job.runtime_jobs(runtime_session=sessions[0])
print(session_runtime_jobs)
else:
print("No runtime sessions for this job.")Die zurückgegebene Liste kann leer sein. Eine Funktion meldet ihre Laufzeit-Jobs nur dann, wenn sie diese über den Laufzeitdienst übermittelt, den die Funktion zur Laufzeit erhält; manche Funktionen übermitteln Laufzeit-Jobs jedoch nicht direkt.
Jobprotokolle anzeigen
Verwenden Sie, job.logs() um die Protokollausgabe abzurufen, die eine Funktion während ihrer Ausführung erzeugt. Protokolle sind nützlich, um den Fortschritt zu verfolgen und einen Job zu debuggen, der mit einem bestimmten Status ERROR endet.
print(job.logs().splitlines())Bei einem lang andauernden Job, der viele Protokollzeilen erzeugt, verwenden Sie, job.filtered_logs() um nur die gewünschten Zeilen auszugeben. Übergeben Sie einen regulären Ausdruck an, include um übereinstimmende Zeilen beizubehalten, oder an, exclude um übereinstimmende Zeilen zu verwerfen:
print(job.filtered_logs(include="iteration"))Liste der zuvor ausgeführten „ Qiskit Functions “-Jobs
Mit jobs() können Sie alle an Qiskit Functions übermittelten Aufträge auflisten:
old_jobs = catalog.jobs()
old_jobsOutput:
[<Job | f6c29f49-4d5f-4fff-aca6-2e9a115b9763>,
<Job | 7f08c9d5-471b-4da2-92e7-4f2cb94c23a8>,
<Job | 62fe9176-d1e5-467e-b2bd-7a3f3c7be4e5>,
<Job | af525b2e-16b1-45a1-80bb-dbd94ce30258>,
<Job | b95a7a57-c1ad-4958-b7ac-953e4e1ee824>,
<Job | 7bfa33da-0f17-4e67-84b6-f556f7eeb436>,
<Job | ca46c191-9eb9-4de6-bfa7-b60d7eb29b5e>,
<Job | 6ac0ba93-3831-43fb-9fb9-760da2225e06>,
<Job | f0e38071-060d-47e8-988d-9cc1f69358e3>,
<Job | 629cf110-e490-4675-8a07-f6d298d166b0>]
Um die Ergebnisse einzugrenzen, wenden Sie Filter an. Filtern Sie nach Funktion mit function, nach Status mit status und nach Einreichungsdatum mit created_after. Blättern Sie mit und limit durch die Ergebnisse offset:
recent_errors = catalog.jobs(
function=qesem_function,
status="ERROR",
created_after="2024-01-01T00:00:00Z",
limit=5,
)
recent_errorsWenn Sie die Job-ID für einen bestimmten Job bereits haben, können Sie den Job mit folgendem Befehl abrufen catalog.job():
# First, get the most recent job that has been executed.
latest_job = old_jobs[0]
# We can also get that same job with `catalog.job`
job_by_id = catalog.job(latest_job.job_id)
# Verify that the job is the same using both retrieval methods.
assert job_by_id.job_id == latest_job.job_id
# Print the job_id for this job.
print(job_by_id.job_id)Output:
f6c29f49-4d5f-4fff-aca6-2e9a115b9763
Fehlermeldungen abrufen
ERRORWenn der Status eines Programms lautet, rufen job.error_message() Sie die Fehlermeldung wie folgt mit ab:
job.error_message()Output:
qiskit.exceptions.QiskitError: 'Workflow execution failed -- https://docs.quantum.ibm.com/errors#9999'
Nächste Schritte
- Entdecken Sie Schaltkreisfunktionen, um neue Algorithmen und Anwendungen zu entwickeln, ohne sich um die Transpilation oder die Fehlerbehandlung kümmern zu müssen.
- Entdecken Sie Anwendungsfunktionen zur Lösung domänenspezifischer Aufgaben mit klassischen Ein- und Ausgabedaten.
- Weitere Informationen finden Sie in der API-Referenzdokumentation unter Qiskit Functions.
- Um praktische Erfahrungen zu sammeln, probieren Sie doch einige Tutorials aus, in denen „ Qiskit Functions “ vorgestellt wird.