Запуск завдань у пакетному режимі
Package versions
Код на цій сторінці розроблено з урахуванням таких вимог. Ми рекомендуємо використовувати ці версії або новіші.
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
Використовуй batch mode для одночасного надсилання кількох примітивних завдань. Нижче наведені приклади роботи з пакетами.
Налаштування для використання пакетів
Перед запуском пакета потрібно налаштувати клієнт IBM Quantum Compute та ініціалізувати його як сервіс:
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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()
Відкриття пакета
Відкрити пакет середовища виконання можна за допомогою контекстного менеджера with Batch(...) або шляхом ініціалізації класу Batch. При запуску пакета потрібно вказати QPU, передавши об'єкт backend. Пакет запускається, коли починає виконуватися перше завдання.
Клас Batch
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()
Контекстний менеджер
Контекстний менеджер автоматично відкриває та закриває пакет.
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()
Тривалість пакета
Максимальний час існування пакета (TTL) можна визначити за допомогою параметра max_time. Це значення має перевищувати час виконання найдовшого завдання. Таймер запускається з початку пакета. Коли значення досягається, пакет закривається. Завдання, що виконуються, завершаться, але завдання в черзі — будуть скасовані.
with Batch(backend=backend, max_time="25m"):
...
Також є значення інтерактивного часу існування (interactive TTL), яке не можна налаштувати (1 хвилина для всіх тарифних планів). Якщо протягом цього вікна жодне завдання пакета не поставлено в чергу, пакет тимчасово деактивується.
Значення максимального TTL за замовчуванням:
| Тип екземпляра | Максимальний TTL за замовчуванням |
|---|---|
| Усі платні плани | 8 годин |
| Відкритий | 10 хвилин |
Щоб визначити максимальний TTL або інтерактивний TTL пакета, дотримуйся інструкцій у розділі Визначення деталей пакета і шукай значення max_time або interactive_timeout відповідно.
Закриття пакета
Пакет автоматично закривається після виходу з контекстного менеджера. Коли контекстний менеджер пакета завершується, пакет переходить у стан «Виконується, нові завдання не приймаються». Це означає, що пакет завершує обробку всіх запущених або поставлених у чергу завдань до досягнення максимального значення TTL. Після завершення всіх завдань пакет негайно закривається. Надсилати завдання до закритого пакета неможливо.
from qiskit.quantum_info import SparsePauliOp
from qiskit.circuit import QuantumCircuit, Parameter
from qiskit.transpiler import generate_preset_pass_manager
import numpy as np
# This cell is hidden from users
service = QiskitRuntimeService()
backend = service.least_busy()
# Define two circuits, each with one parameter with two parameters.
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
circuit.ry(Parameter("a"), 0)
circuit.cx(0, 1)
circuit.h(0)
circuit.measure_all()
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
transpiled_circuit = pm.run(circuit)
transpiled_circuit_sampler = transpiled_circuit
transpiled_circuit_sampler.measure_all()
params = np.random.uniform(size=(2, 3)).T
observables = [
[
SparsePauliOp(["XX", "IY"], [0.5, 0.5]).apply_layout(
transpiled_circuit.layout
)
],
[SparsePauliOp("XX").apply_layout(transpiled_circuit.layout)],
[SparsePauliOp("IY").apply_layout(transpiled_circuit.layout)],
]
sampler_pub = (transpiled_circuit_sampler, params)
estimator_pub = (transpiled_circuit_sampler, observables, params)
Наступний код вимагає, щоб ти надав власну інформацію, таку як PUB для Estimator та Sampler, а також 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()
Якщо ти не використовуєш контекстний менеджер, закрий пакет вручну. Якщо залишити пакет відкритим і надіслати до нього більше завдань пізніше, можливо, що максимальний TTL буде досягнуто до початку виконання наступних завдань, що призведе до їх скасування. Пакет можна закрити одразу після завершення надсилання завдань. Коли пакет закрито за допомогою batch.close(), він більше не приймає нові завдання, але вже надіслані завдання виконаються до кінця, і їхні результати можна буде отримати.
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()
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})
Визначення деталей пакета
Для повного огляду конфігурації та статусу пакета, включно з його інтерактивним та максимальним TTL, використовуй метод 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())
{'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}
Переналаштування завдань для паралельної обробки
Є кілька способів переналаштувати завдання для використання переваг паралельної обробки, яку надає пакетний режим. Наступний приклад показує, як можна розбити довгий список схем на кілька завдань і запустити їх як пакет для використання переваг паралельної обробки.
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)
Якщо ти задаєш backend=backend у примітиві, програма виконується в job mode, навіть якщо вона знаходиться всередині контексту пакета або сесії. Задання backend=backend є застарілим починаючи з Qiskit Runtime v0.24.0. Натомість використовуй параметр mode.
Наступні кроки
- Спробуй приклад у підручнику Combine error mitigation options with the estimator primitive.
- Переглянь довідник Batch API.
- Дізнайся про обмеження завдань при надсиланні завдання на QPU IBM.
- Переглянь поширені запитання про режими виконання.