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

Запуск завдань у сесії

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
Note

Користувачі тарифного плану 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()

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

Recommendations