Jobs in einem Stapel ausführen
Der Code auf dieser Seite wurde unter Berücksichtigung der folgenden Anforderungen entwickelt. Wir empfehlen die Verwendung dieser oder neuerer Versionen.
qiskit[all]~=2.5.2 qiskit-ibm-runtime~=0.47.0
Verwenden Sie den Batch-Modus, um mehrere primitive Aufträge gleichzeitig zu übermitteln. Im Folgenden finden Sie Beispiele für die Arbeit mit Chargen.
Einrichten für die Verwendung von Stapeln
Bevor Sie einen Batch starten, müssen Sie den „ IBM Quantum “-Compute-Client einrichten und als Dienst initialisieren:
from qiskit_ibm_runtime import QiskitRuntimeService, Batch, Executor
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Sampler, Estimator
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
from qiskit_ibm_runtime.executor_estimator import Estimator
service = QiskitRuntimeService()Eine Charge öffnen
Sie können einen Laufzeitstapel mit Hilfe des Kontextmanagers with Batch(...) oder durch Initialisierung der Batch klasse. Wenn Sie einen Stapel starten, müssen Sie eine QPU angeben, indem Sie ein backend Objekt übergeben. Der Stapel beginnt, wenn der erste Auftrag ausgeführt wird.
Batch-Klasse
backend = service.least_busy(operational=True, simulator=False)
batch = Batch(backend=backend)
estimator = Estimator(mode=batch)
sampler = Sampler(mode=batch)
executor = Executor(mode=batch)
# Close the batch because no context manager was used.
batch.close()Kontext-Manager
Der Kontextmanager öffnet und schließt den Stapel automatisch.
from qiskit_ibm_runtime import Batch, Executor
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Sampler, Estimator
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
from qiskit_ibm_runtime.executor_estimator import Estimator
backend = service.least_busy(operational=True, simulator=False)
with Batch(backend=backend):
estimator = Estimator()
sampler = Sampler()
executor = Executor()Batch-Länge
Sie können die maximale Lebensdauer (TTL) der Charge mit dem Parameter max_time festlegen. Diese sollte die längste Ausführungszeit des Auftrags übersteigen. Dieser Timer startet, wenn die Charge beginnt. Wenn der Wert erreicht ist, wird die Charge geschlossen. Laufende Aufträge werden beendet, aber Aufträge, die noch in der Warteschlange stehen, werden nicht ausgeführt.
with Batch(backend=backend, max_time="25m"):
...Es gibt auch einen interaktiven TTL-Wert (Time to Live), der nicht konfiguriert werden kann (1 Minute für alle Pläne). Wenn innerhalb dieses Fensters keine Batch-Aufträge in die Warteschlange gestellt werden, wird der Batch vorübergehend deaktiviert.
Standardmäßige maximale TTL-Werte:
Instanztyp | Standard Maximale TTL |
|---|---|
| Alle bezahlten Pläne | 8 Stunden |
| Offen | 10 Minuten |
Um die maximale TTL oder die interaktive TTL einer Charge zu ermitteln, folgen Sie den Anweisungen unter Chargendetails ermitteln und suchen Sie den Wert max_time bzw. interactive_timeout .
Eine Charge schließen
Ein Stapel wird automatisch geschlossen, wenn er den Kontextmanager verlässt. Wenn der Batch-Kontextmanager verlassen wird, wird der Batch in den Status "In Bearbeitung, keine neuen Aufträge" versetzt. Dies bedeutet, dass der Stapel alle laufenden oder in der Warteschlange befindlichen Aufträge bis zum Erreichen des maximalen TTL-Werts abschließt. Wenn alle Aufträge erledigt sind, wird der Stapel sofort geschlossen. Sie können keine Aufträge an einen geschlossenen Stapel übermitteln.
Für den folgenden Code müssen Sie eigene Angaben machen, wie z. B. die PUBs für den Schätzer und den Sampler sowie ein Backend.
with Batch(backend=backend) as batch:
estimator = Estimator()
sampler = Sampler()
job1 = estimator.run([estimator_pub])
job2 = sampler.run([sampler_pub])
# The batch is no longer accepting jobs but the submitted job will run to completion.
result = job1.result()
result2 = job2.result()Wenn Sie keinen Kontextmanager verwenden, schließen Sie den Stapel manuell. Wenn Sie den Stapel offen lassen und später weitere Aufträge an ihn übermitteln, ist es möglich, dass die maximale TTL erreicht wird, bevor die nachfolgenden Aufträge ausgeführt werden, was dazu führt, dass sie abgebrochen werden. Sie können einen Stapel schließen, sobald Sie keine Aufträge mehr an ihn übermitteln. Wenn ein Stapel mit batch.close() geschlossen wird, nimmt er keine neuen Aufträge mehr an, aber die bereits eingereichten Aufträge laufen noch bis zum Abschluss und ihre Ergebnisse können abgerufen werden.
batch = Batch(backend=backend)
# If using qiskit-ibm-runtime earlier than 0.24.0, change `mode=` to `batch=`
estimator = Estimator(mode=batch)
sampler = Sampler(mode=batch)
job1 = estimator.run([estimator_pub])
job2 = sampler.run([sampler_pub])
print(f"Result1: {job1.result()}")
print(f"Result2: {job2.result()}")
# Manually close the batch. Running and queued jobs will run to completion.
batch.close()Output:
Result1: PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(3, 2), dtype=float64>), stds=np.ndarray(<shape=(3, 2), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(3, 2), dtype=float64>), shape=(3, 2)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': False, '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})
Result2: PrimitiveResult([SamplerPubResult(data=DataBin(meas=BitArray(<shape=(3, 2), num_shots=4096, num_bits=2>), meas0=BitArray(<shape=(3, 2), num_shots=4096, num_bits=156>), shape=(3, 2)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2026-09-01 07:46:49', stop='2026-09-01 07:46:56', size=24576>)])}, 'version': 2})
Batch-Details festlegen
Einen umfassenden Überblick über die Konfiguration und den Status einer Charge, einschließlich ihrer interaktiven und maximalen TTL, erhalten Sie unter batch.details() method.
from qiskit_ibm_runtime import QiskitRuntimeService, Batch
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
with Batch(backend=backend) as batch:
print(batch.details())Output:
{'id': '947aa097-9055-42d4-9e58-ad1c2cdd9d5a', 'backend_name': 'ibm_marrakesh', 'interactive_timeout': 1, 'max_time': 28800, 'active_timeout': 28800, 'state': 'open', 'accepting_jobs': True, 'last_job_started': None, 'last_job_completed': None, 'started_at': None, 'closed_at': None, 'activated_at': None, 'mode': 'batch', 'usage_time': None}
Jobs für die parallele Verarbeitung neu konfigurieren
Es gibt mehrere Möglichkeiten, wie Sie Ihre Aufträge neu konfigurieren können, um die Vorteile der parallelen Verarbeitung durch die Stapelverarbeitung zu nutzen. Das folgende Beispiel zeigt, wie Sie eine lange Liste von Schaltkreisen in mehrere Aufträge aufteilen und diese als Stapel ausführen können, um die Vorteile der Parallelverarbeitung zu nutzen.
from qiskit.circuit.random import random_circuit
from qiskit_ibm_runtime import Batch
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Sampler
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
max_circuits = 100
circuits = [pm.run(random_circuit(5, 5)) for _ in range(5 * max_circuits)]
for circuit in circuits:
circuit.measure_active()
all_partitioned_circuits = []
for i in range(0, len(circuits), max_circuits):
all_partitioned_circuits.append(circuits[i : i + max_circuits])
jobs = []
start_idx = 0
with Batch(backend=backend):
sampler = Sampler()
for partitioned_circuits in all_partitioned_circuits:
job = sampler.run(partitioned_circuits)
jobs.append(job)Wenn Sie in einer backend=backend Primitive setzen, wird das Programm im Job-Modus ausgeführt, auch wenn es sich innerhalb eines Batch- oder Sitzungskontexts befindet. Die Einstellung backend=backend ist seit Qiskit Runtime v0.24.0 veraltet. Verwenden Sie stattdessen den mode Parameter.
Nächste Schritte
- Probieren Sie ein Beispiel im Tutorial „Kombinieren von Optionen zur Fehlerbehebung mit der Estimator-Primitive“ aus.
- Lesen Sie die Batch-API-Referenz.
- Beachten Sie die Auftragsbeschränkungen, wenn Sie einen Auftrag an eine QPU von IBM® senden.
- Häufig gestellte Fragen zu Ausführungsmodi überprüfen.