Qiskit Serverless -Rechen- und Datenressourcen verwalten
Der Code auf dieser Seite wurde unter Berücksichtigung der folgenden Anforderungen entwickelt. Wir empfehlen die Verwendung dieser oder neuerer Versionen.
qiskit[all]~=2.0.0 qiskit-ibm-runtime~=0.37.0 qiskit-serverless~=0.27.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.
Mit Qiskit Serverless können Sie Berechnungen und Daten über Ihr Qiskit-Muster hinweg verwalten, einschließlich CPUs, QPUs und anderen Rechenbeschleunigern.
Detaillierte Status festlegen
Serverlose Workloads haben mehrere Phasen innerhalb eines Workflows. Standardmäßig sind die folgenden Status mit job.status() einsehbar:
QUEUED: die Arbeitslast steht in der Warteschlange für klassische RessourcenINITIALIZING: die Arbeitsbelastung ist festgelegtRUNNING: die Arbeitslast läuft derzeit auf klassischen RessourcenDONE: die Arbeitslast wurde erfolgreich abgeschlossen
Sie können auch benutzerdefinierte Status festlegen, die die jeweilige Phase des Workflows näher beschreiben, und zwar wie folgt.
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.
# 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 update_status, Job
# # If your function has a mapping stage, particularly application functions, you can set the status
# to "RUNNING: MAPPING" as follows:
update_status(Job.MAPPING)
# # While handling transpilation, error suppression, and so forth, you can set the status to
# "RUNNING: OPTIMIZING_FOR_HARDWARE":
update_status(Job.OPTIMIZING_HARDWARE)
# # After you submit jobs to IBM Quantum Compute Service, the underlying quantum job will be queued. You can set
# status to "RUNNING: WAITING_FOR_QPU":
update_status(Job.WAITING_QPU)
# # When the Quantum Compute job starts running on the QPU, set the following status
# "RUNNING: EXECUTING_QPU":
update_status(Job.EXECUTING_QPU)
## Once QPU is completed and post-processing has begun, set the status "RUNNING: POST_PROCESSING":
update_status(Job.POST_PROCESSING)Nach erfolgreicher Beendigung dieses Arbeitsaufwands (mit save_result()) wird dieser Status automatisch auf DONE aktualisiert.
Parallele Arbeitsabläufe
Verwenden Sie bei klassischen Aufgaben, die parallelisiert werden können, den @distribute_task Decorator, um die für die Ausführung einer Aufgabe erforderlichen Rechenressourcen zu definieren. Rufen Sie zunächst das transpile_remote.py Beispiel aus dem Abschnitt „Schreiben Sie Ihr erstes Programm für Qiskit Serverless “ mit dem folgenden Code in Erinnerung.
Für den folgenden Code müssen Sie Ihre Anmeldedaten bereits gespeichert haben. Wie in diesem Beispiel wird der Laufzeitservice get_runtime_service() so erstellt, dass alle von ihm gestarteten „ Qiskit Runtime “-Jobs und -Sitzungen dem übergeordneten „ Qiskit Serverless “-Job zugeordnet werden. Weitere Informationen finden Sie unter „Schreiben Sie Ihr erstes Programm unter Qiskit Serverless “.
# 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
from qiskit_serverless import distribute_task, get_runtime_service
service = get_runtime_service()
@distribute_task(target={"cpu": 1})
def transpile_remote(circuit, optimization_level, backend):
"""
Transpiles an abstract circuit (or list of circuits)
into an ISA circuit for a given backend.
"""
pass_manager = generate_preset_pass_manager(
optimization_level=optimization_level,
backend=service.backend(backend)
)
isa_circuit = pass_manager.run(circuit)
return isa_circuitIn diesem Beispiel haben Sie die Funktion transpile_remote() mit @distribute_task(target={"cpu": 1}) dekoriert. Bei der Ausführung wird eine asynchrone parallele Arbeitsaufgabe mit einem einzigen CPU-Kern erstellt und mit einem Verweis zur Verfolgung der Arbeitsaufgabe zurückgegeben. Um das Ergebnis abzurufen, übergeben Sie den Verweis an die Funktion get() . Auf diese Weise können wir mehrere Aufgaben parallel ausführen:
# 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 time import time
from qiskit_serverless import get, get_arguments, save_result, update_status, Job
# Get arguments
arguments = get_arguments()
circuit = arguments.get("circuit")
optimization_level = arguments.get("optimization_level")
backend = arguments.get("backend")# 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.
# Start distributed transpilation
update_status(Job.OPTIMIZING_HARDWARE)
start_time = time()
transpile_worker_references = [
transpile_remote(circuit, optimization_level, backend)
for circuit in arguments.get("circuit_list")
]
transpiled_circuits = get(transpile_worker_references)
end_time = time()# 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.
# Save result, with metadata
result = {
"circuits": transpiled_circuits,
"metadata": {
"resource_usage": {
"RUNNING: OPTIMIZING_FOR_HARDWARE": {
"CPU_TIME": end_time - start_time,
"QPU_TIME": 0,
},
}
},
}
save_result(result)Untersuchen Sie verschiedene Aufgabenkonfigurationen
Über @distribute_task() können Sie CPU, GPU und Speicher für Ihre Aufgaben flexibel zuweisen. Für Qiskit Serverless auf IBM Quantum® Platform ist jedes Programm mit 16 CPU-Kernen und 32 GB RAM ausgestattet, die je nach Bedarf dynamisch zugewiesen werden können.
CPU-Kerne können als ganze CPU-Kerne oder sogar als Bruchteile davon zugewiesen werden, wie im Folgenden gezeigt wird.
Der Speicher wird in der Anzahl der Bytes zugewiesen. Ein Kilobyte besteht aus 1024 Bytes, ein Megabyte aus 1024 Kilobytes und ein Gigabyte aus 1024 Megabytes. Um 2 GB Speicher für Ihren Worker zuzuweisen, müssen Sie "mem": 2 * 1024 * 1024 * 1024 zuweisen.
# 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.
@distribute_task(target={
"cpu": 16,
"mem": 2 * 1024 * 1024 * 1024
})
def transpile_remote(circuit, optimization_level, backend):
return NoneVerwalten Sie Daten in Ihrem gesamten Programm
Qiskit Serverless ermöglicht Ihnen die Verwaltung von Dateien im Verzeichnis /data über alle Ihre Programme hinweg. Dies beinhaltet mehrere Einschränkungen:
- Derzeit werden nur die Dateien
tarundh5unterstützt - Dies ist nur ein flacher
/dataSpeicher, und kann keine/data/folder/Unterverzeichnisse haben
Im Folgenden wird gezeigt, wie Sie Dateien hochladen können. Stellen Sie sicher, dass Sie sich mit Ihrem IBM Quantum -Konto bei Qiskit Serverless authentifiziert haben (Anweisungen finden Sie unter „Hochladen auf Qiskit Serverless “).
import tarfile
from qiskit_serverless import IBMServerlessClient
# Create a tar
filename = "transpile_demo.tar"
file = tarfile.open(filename, "w")
file.add("./source_files/transpile_remote.py")
file.close()
# Get a reference to a QiskitFunction
serverless = IBMServerlessClient()
transpile_remote_demo = next(
program
for program in serverless.list()
if program.title == "transpile_remote_serverless"
)
# Upload the tar to Serverless data directory
serverless.file_upload(file=filename, function=transpile_remote_demo)Output:
'{"message":"/usr/src/app/media/5e1f442128cdf60018496a04/transpile_demo.tar"}'
Als nächstes können Sie alle Dateien in Ihrem Verzeichnis data auflisten. Diese Daten sind für alle Programme zugänglich.
serverless.files(function=transpile_remote_demo)Output:
['classifier_name.pkl.tar', 'output.json.tar', 'transpile_demo.tar']
Dies kann von einem Programm aus geschehen, indem man file_download() verwendet, um die Datei in die Programmumgebung herunterzuladen und die tar zu dekomprimieren.
# 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.
import tarfile
from qiskit_serverless import IBMServerlessClient
# For `token`, use the 44-character API_KEY you created
# and saved from the IBM Quantum Platform Home dashboard
serverless = IBMServerlessClient(token="<YOUR_API_KEY>")
files = serverless.files()
demo_file = files[0]
downloaded_tar = serverless.file_download(demo_file)
with tarfile.open(downloaded_tar, 'r') as tar:
tar.extractall()An diesem Punkt kann Ihr Programm mit den Dateien interagieren, wie Sie es bei einem lokalen Experiment tun würden. file_upload() die Dateien file_download() und file_delete() können von Ihrem lokalen Experiment oder Ihrem hochgeladenen Programm aufgerufen werden, um eine einheitliche und flexible Datenverwaltung zu gewährleisten.
Nächste Schritte
- Sehen Sie sich ein vollständiges Beispiel an, in dem bestehender Code auf „ Qiskit Serverless “ portiert wird.
- Lesen Sie einen Artikel, in dem Forscher Qiskit Serverless und quantenzentriertes Supercomputing zur Erforschung der Quantenchemie einsetzen.