Перейти до основного вмісту
Цей проєкт у бета-версії. Знайшов(-ла) помилку? Відкрити issue на GitHub. Є запитання чи ідея? Запитати в Discussions — будемо раді твоєму відгуку!
Яка якість перекладу на цій сторінці?

Запуск завдань у пакетному режимі

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.

Наступні кроки​

Recommendations