Перейти до основного вмісту

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

Package versions

The code on this page was developed using the following requirements. We recommend using these versions or newer.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

Використовуй пакетний режим для одночасного надсилання кількох примітивних завдань. Нижче наведені приклади роботи з пакетами.

Налаштування для використання пакетів

Перед запуском пакета потрібно налаштувати Qiskit Runtime та ініціалізувати його як сервіс:

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
from qiskit_ibm_runtime import (
QiskitRuntimeService,
Batch,
SamplerV2 as Sampler,
EstimatorV2 as 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)
# Close the batch because no context manager was used.
batch.close()

Контекстний менеджер

Контекстний менеджер автоматично відкриває та закриває пакет.

from qiskit_ibm_runtime import (
Batch,
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
)

backend = service.least_busy(operational=True, simulator=False)
with Batch(backend=backend):
estimator = Estimator()
sampler = Sampler()

Тривалість пакета

Максимальний час існування пакета (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)
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=133>), shape=(3, 2)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2026-01-15 07:47:58', stop='2026-01-15 07:48:05', size=24576>)])}, 'version': 2})

Визначення деталей пакета

Для отримання повного огляду конфігурації та статусу пакета, включно з інтерактивним і максимальним TTL, використовуй метод batch.details().

from qiskit_ibm_runtime import (
QiskitRuntimeService,
batch,
SamplerV2 as Sampler,
)

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

with Batch(backend=backend) as batch:
print(batch.details())
{'id': 'ce8cf08d-b18e-4d56-ab51-eaff0b8190f4', 'backend_name': 'ibm_torino', '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_ibm_runtime import SamplerV2 as Sampler, Batch
from qiskit.circuit.random import random_circuit

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 у примітиві, програма виконується в режимі завдань, навіть якщо вона знаходиться всередині контексту пакета або сесії. Задання backend=backend є застарілим починаючи з Qiskit Runtime v0.24.0. Натомість використовуй параметр mode.

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

Recommendations