Запуск завдань у сесії
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
scipy~=1.16.3
Користувачі тарифного плану Open не можуть надсилати завдання сесії. Робочі навантаження мають виконуватися в режимі завдань або пакетному режимі.
Використовуй сесії, коли потрібен виділений і ексклюзивний доступ до QPU.
Налаштування для використання сесій
Перед запуском сесії потрібно налаштувати Qiskit Runtime та ініціалізувати його як сервіс:
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime scipy
from qiskit_ibm_runtime import (
QiskitRuntimeService,
Session,
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
)
service = QiskitRuntimeService()
Відкриття сесії
Відкрити сесію середовища виконання можна за допомогою контекстного менеджера with Session(...) або шляхом ініціалізації класу Session. При запуску сесії потрібно вказати QPU, передавши об'єкт backend. Сесія запускається, коли починає виконуватися перше завдання.
Якщо ти відкриєш сесію, але не надішлеш до неї жодного завдання протягом 30 хвилин, сесія автоматично закриється.
Клас Session
Наступний блок коду поверне помилку для користувачів тарифного плану Open, оскільки використовує сесії. Робочі навантаження на тарифному плані Open можуть виконуватися лише в режимі завдань або пакетному режимі.
backend = service.least_busy(operational=True, simulator=False)
session = Session(backend=backend)
estimator = Estimator(mode=session)
sampler = Sampler(mode=session)
# Close the session because no context manager was used.
session.close()
Контекстний менеджер
Контекстний менеджер автоматично відкриває та закриває сесію.
Наступний блок коду поверне помилку для користувачів тарифного плану Open, оскільки використовує сесії. Робочі навантаження на тарифному плані Open можуть виконуватися лише в режимі завдань або пакетному режимі.
from qiskit_ibm_runtime import (
Session,
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
)
backend = service.least_busy(operational=True, simulator=False)
with Session(backend=backend):
estimator = Estimator()
sampler = Sampler()
Тривалість сесії
Максимальний час існування сесії (TTL) визначає, як довго вона може т ривати. Це значення можна задати за допомогою параметра max_time. Воно має перевищувати час виконання найдовшого завдання.
Таймер запускається з початку сесії. Коли значення досягається, сесія закривається. Завдання, що виконуються, завершаться, але завдання в черзі — будуть скасовані.
Наступний блок коду поверне помилку для користувачів тарифного плану Open, оскільки використовує сесії. Робочі навантаження на тарифному плані Open можуть виконуватися лише в режимі завдань або пакетному режимі.
with Session(backend=backend, max_time="25m"):
...
Також є значення інтерактивного часу існування (interactive TTL), яке не можна налаштувати. Якщо протягом цього вікна жодне завдання сесії не поставлено в чергу, сесія тимчасово деактивується.
Значення за замовчуванням:
| Тип екземпляра (Відкритий або Преміум план) | Інтерактивний TTL | Максимальний TTL |
|---|---|---|
| Преміум план | 60 сек* | 8 год* |
| * Певні екземпляри Преміум плану можуть бути налаштовані на інше значення. |
Щоб визначити максимальний TTL або інтерактивний TTL сесії, дотримуйся інструкцій у розділі Визначення деталей сесії і шукай значення max_time або interactive_timeout відповідно.
Завершення сесії
Сесія завершується за таких обставин:
- Досягнуто максимальне значення тайм-ауту (TTL), що призводить до скасування всіх завдань у черзі.
- Сесію скасовано вручну, що призводить до скасування всіх завдань у черзі.
- Сесію закрито вручну. Сесія перестає приймати нові завдання, але продовжує виконувати завдання в черзі з пріоритетом.
- Якщо ти використовуєш Session як контекстний менеджер, тобто
with Session(), сесія автоматично закривається після завершення контексту (така ж поведінка, як при використанніsession.close()).
Закриття сесії
Сесія автоматично закривається після виходу з контекстного менеджера. Коли контекстний менеджер сесії завершується, сесія переходить у стан «Виконується, нові завдання не приймаються». Це означає, що сесія завершує обробку всіх запущених або поставлених у чергу завдань до досягнення максимального значення тайм-ауту. Після завершення всіх завдань сесія негайно закривається. Це дозволяє планувальнику запустити наступне завдання без очікування інтерактивного тайм-ауту сесії, що скорочує середній час очікування завдань у черзі. Надсилати завдання до закритої сесії неможливо.
Наступний блок коду поверне помилку для користувачів тарифного плану Open, оскільки використовує сесії. Робочі навантаження на т арифному плані Open можуть виконуватися лише в режимі завдань або пакетному режимі.
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()
# Create parameters and mapped observables to submit
params = np.random.uniform(size=(2, 3)).T
observables = [
SparsePauliOp(["XX", "IY"], [0.5, 0.5]),
SparsePauliOp("XX"),
SparsePauliOp("IY"),
]
mapped_observables = [
[observable.apply_layout(transpiled_circuit.layout)]
for observable in observables
]
sampler_pub = (transpiled_circuit_sampler, params)
estimator_pub = (transpiled_circuit_sampler, mapped_observables, params)
with Session(backend=backend) as session:
estimator = Estimator()
sampler = Sampler()
job1 = estimator.run([estimator_pub])
job2 = sampler.run([sampler_pub])
# The session is no longer accepting jobs but the submitted job will run to completion.
result = job1.result()
result2 = job2.result()
Якщо ти не використовуєш контекстний менеджер, закрий сесію вручну, щоб уникнути небажаних витрат. Сесію можна закрити одразу після завершення надсилання завдань. Коли сесію закрито за допомогою session.close(), вона більше не приймає нові завдання, але вже надіслані завдання виконаються до кінця, і їхні результати можна буде отримати.
Наступний блок коду поверне помилку для користувачів тарифного плану Open, оскільки використовує сесії. Робочі навантаження на тарифному плані Open можуть виконуватися лише в режимі завдань або пакетному режимі.
session = Session(backend=backend)
# If using qiskit-ibm-runtime earlier than 0.24.0, change `mode=` to `session=`
estimator = Estimator(mode=session)
sampler = Sampler(mode=session)
job1 = estimator.run([estimator_pub])
job2 = sampler.run([sampler_pub])
print(f"Result1: {job1.result()}")
print(f"Result2: {job2.result()}")
# Manually close the session. Running and queued jobs will run to completion.
session.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:53:15', stop='2026-01-15 07:53:21', size=24576>)])}, 'version': 2})
Перевірка статусу сесії
Запитати статус сесії, щоб зрозуміти її поточний стан, можна за допомогою session.status() або переглянувши сторінку Робочі навантаження.
Статус сесії може бути одним із таких:
Pending: Сесію ще не розпочато або вона була деактивована. Наступне завдання сесії має чекати в черзі, як і інші завдання.In progress, accepting new jobs: Сесія активна і приймає нові завдання.In progress, not accepting new jobs: Сесія активна, але не приймає нові завдання. Надсилання завдань до сесії відхиляється, але наявні завдання сесії виконаються до кінця. Сесія автоматично закривається після завершення всіх завдань.Closed: Досягнуто максимальне значення тайм-ауту сесії або сесію було явно закрито.
Визначення деталей сесії
Для отримання повного огляду конфігурації та статусу сесії використовуй метод session.details().
Наступний блок коду поверне помилку для користувачів тарифного плану Open, оскільки використовує сесії. Робочі навантаження на тарифному плані Open можуть виконуватися лише в режимі завдань або пакетному режимі.
from qiskit_ibm_runtime import (
QiskitRuntimeService,
Session,
EstimatorV2 as Estimator,
)
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
with Session(backend=backend) as session:
print(session.details())
{'id': 'be84569d-86b5-4a7f-be5e-7d33e80dc220', 'backend_name': 'ibm_torino', 'interactive_timeout': 60, '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': 'dedicated', 'usage_time': None}
Патерни використання
Сесії особливо корисні для алгоритмів, що вимагають частої взаємодії між класичними та квантовими ресурсами.
Приклад: Запуск ітеративного робочого навантаження, що використовує класичний оптимізатор SciPy для мінімізації функції вартості. У цій моделі SciPy використовує вихід функції вартості для обчислення наступного вхідного значення.
Наступний блок коду поверне помилку для користувачів тарифного плану Open, оскільки використовує сесії. Робочі навантаження на тарифному плані Open можуть виконуватися лише в режимі завдань або пакетному режимі.
from scipy.optimize import minimize
from qiskit.circuit.library import efficient_su2
def cost_func(params, ansatz, hamiltonian, estimator):
# Return estimate of energy from estimator
energy = sum(
estimator.run([(ansatz, hamiltonian, params)]).result()[0].data.evs
)
return energy
hamiltonian = SparsePauliOp.from_list(
[("YZ", 0.3980), ("ZI", -0.3980), ("ZZ", -0.0113), ("XX", 0.1810)]
)
su2_ansatz = efficient_su2(hamiltonian.num_qubits)
pm = generate_preset_pass_manager(backend=backend, optimization_level=3)
ansatz = pm.run(su2_ansatz)
mapped_hamiltonian = [
operator.apply_layout(ansatz.layout) for operator in hamiltonian
]
num_params = ansatz.num_parameters
x0 = 2 * np.pi * np.random.random(num_params)
session = Session(backend=backend)
# If using qiskit-ibm-runtime earlier than 0.24.0, change `mode=` to `session=`
estimator = Estimator(mode=session, options={"default_shots": int(1e4)})
res = minimize(
cost_func,
x0,
args=(ansatz, mapped_hamiltonian, estimator),
method="cobyla",
options={"maxiter": 25},
)
# Close the session because no context manager was used.
session.close()
Запуск двох алгоритмів VQE в сесії за допомогою потоків
Можна отримати більше від сесії, запускаючи к ілька робочих навантажень одночасно. Наступний приклад показує, як можна запустити два алгоритми VQE, кожен з яким використовує різний класичний оптимізатор, одночасно в межах однієї сесії. Теги завдань також використовуються для розрізнення завдань з різних робочих навантажень.
Наступний блок коду поверне помилку для користувачів тарифного плану Open, оскільки використовує сесії. Робочі навантаження на тарифному плані Open можуть виконуватися лише в режимі завдань або пакетному режимі.
from concurrent.futures import ThreadPoolExecutor
from qiskit_ibm_runtime import EstimatorV2 as Estimator
def minimize_thread(estimator, method):
return minimize(
cost_func,
x0,
args=(ansatz, mapped_hamiltonian, estimator),
method=method,
options={"maxiter": 25},
)
with Session(backend=backend), ThreadPoolExecutor() as executor:
estimator1 = Estimator()
estimator2 = Estimator()
# Use different tags to differentiate the jobs.
estimator1.options.environment.job_tags = ["cobyla"]
estimator2.options.environment.job_tags = ["nelder-mead"]
# Submit the two workloads.
cobyla_future = executor.submit(minimize_thread, estimator1, "cobyla")
nelder_mead_future = executor.submit(
minimize_thread, estimator2, "nelder-mead"
)
# Get workload results.
cobyla_result = cobyla_future.result()
nelder_mead_result = nelder_mead_future.result()
Наступні кроки
- Спробуй приклад у підручнику Quantum approximate optimization algorithm (QAOA).
- Переглянь довідник Session API.
- Дізнайся про обмеження завдань при надсиланні завдання на QPU IBM®.
- Переглянь поширені запитання про режими виконання.