Přeskočit na hlavní obsah
Tento projekt je v betě. Našel jsi chybu? Otevřít issue na GitHubu. Máš otázku nebo nápad? Zeptej se v Discussions — rádi si poslechneme tvou zpětnou vazbu!
Jaká je kvalita překladu na této stránce?

Spouštění úloh v Session

Verze balíčků

Kód na této stránce byl vyvinut s použitím následujících požadavků. Doporučujeme použít tyto verze nebo novější.

qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
scipy~=1.17.1
Poznámka

Uživatelé Open Planu nemohou odesílat úlohy v Session. Workloady musí být spuštěny v job mode nebo batch mode.

Session používej tehdy, když potřebuješ vyhrazený a exkluzivní přístup k QPU.

Nastavení pro použití Session​

Před spuštěním Session musíš nastavit klienta IBM Quantum Compute a inicializovat ho jako službu:

# 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", "scipy": "scipy"}
_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, Session, 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()

Otevření Session​

Session můžeš otevřít pomocí context manageru with Session(...) nebo inicializací třídy Session. Při spuštění Session musíš zadat QPU předáním objektu backend. Session se spustí, jakmile začne provádět svou první úlohu.

poznámka

Pokud otevřeš Session, ale po dobu 30 minut do ní neodesleš žádnou úlohu, Session se automaticky zavře.

Třída Session

pozor

Následující blok kódu vrátí chybu uživatelům Open Planu, protože používá Session. Workloady na Open Planu mohou běžet pouze v job mode nebo batch mode.

backend = service.least_busy(operational=True, simulator=False)
session = Session(backend=backend)
estimator = Estimator(mode=session)
sampler = Sampler(mode=session)
executor = Executor(mode=session)
# Close the session because no context manager was used.
session.close()

Context manager

Context manager automaticky otevře a zavře Session.

pozor

Následující blok kódu vrátí chybu uživatelům Open Planu, protože používá Session. Workloady na Open Planu mohou běžet pouze v job mode nebo batch mode.

from qiskit_ibm_runtime import Session, 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 Session(backend=backend):
estimator = Estimator()
sampler = Sampler()
executor = Executor()

Délka Session​

Maximální doba životnosti Session (TTL) určuje, jak dlouho může Session běžet. Tuto hodnotu můžeš nastavit pomocí parametru max_time. Měla by překračovat dobu provádění nejdelší úlohy.

Tento časovač se spustí při zahájení Session. Po dosažení hodnoty se Session zavře. Všechny právě běžící úlohy budou dokončeny, ale úlohy stále ve frontě selžou.

pozor

Následující blok kódu vrátí chybu uživatelům Open Planu, protože používá Session. Workloady na Open Planu mohou běžet pouze v job mode nebo batch mode.

with Session(backend=backend, max_time="25m"):
...

Existuje také hodnota interaktivní doby životnosti (interactive TTL), kterou nelze konfigurovat. Pokud v tomto časovém okně nejsou ve frontě žádné úlohy Session, Session se dočasně deaktivuje.

Výchozí hodnoty:

Typ instance (Open nebo Premium Plan)Interaktivní TTLMaximální TTL
Premium Plan60 sec*8 h*

* Některé instance Premium Planu mohou být nakonfigurovány na jinou hodnotu.

Chceš-li zjistit maximální TTL nebo interaktivní TTL Session, postupuj podle pokynů v části Zjištění podrobností Session a hledej hodnotu max_time, respektive interactive_timeout.

Ukončení Session​

Session se ukončí v těchto situacích:

  • Je dosažena maximální hodnota časového limitu (TTL), což způsobí zrušení všech úloh ve frontě.

  • Session je ručně zrušena, což způsobí zrušení všech úloh ve frontě.

  • Session je ručně zavřena. Session přestane přijímat nové úlohy, ale úlohy ve frontě nadále spouští s prioritou.

  • Pokud použiješ Session jako context manager, tedy with Session(), Session se automaticky zavře po skončení kontextu (stejné chování jako při použití session.close()).

Zavření Session​

Session se automaticky zavře, jakmile opustí context manager. Když je ukončen context manager Session, Session přejde do stavu „Probíhá, nepřijímá nové úlohy". To znamená, že Session dokončí zpracování všech běžících nebo zařazených úloh, dokud nedosáhne maximální hodnoty časového limitu. Po dokončení všech úloh se Session okamžitě zavře. To umožňuje plánovači spustit další úlohu bez čekání na interaktivní časový limit Session, čímž se zkrátí průměrná doba čekání úloh ve frontě. Do zavřené Session nelze odesílat úlohy.

pozor

Následující blok kódu vrátí chybu uživatelům Open Planu, protože používá Session. Workloady na Open Planu mohou běžet pouze v job mode nebo batch mode.

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()
tip

Pokud nepoužíváš context manager, Session ručně zavři, aby nevznikaly nežádoucí náklady. Session můžeš zavřít ihned poté, co do ní dokončíš odesílání úloh. Když je Session zavřena pomocí session.close(), již nepřijímá nové úlohy, ale již odeslané úlohy budou stále dokončeny a jejich výsledky můžeš načíst.

pozor

Následující blok kódu vrátí chybu uživatelům Open Planu, protože používá Session. Workloady na Open Planu mohou běžet pouze v job mode nebo batch mode.

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=156>), shape=(3, 2)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2026-09-01 08:34:17', stop='2026-09-01 08:34:24', size=24576>)])}, 'version': 2})

Kontrola stavu Session​

Stav Session můžeš zjistit pomocí session.status() nebo zobrazením stránky Workloads.

Stav Session může být jeden z následujících:

  • Pending: Session nebyla spuštěna nebo byla deaktivována. Další úloha Session musí čekat ve frontě jako ostatní úlohy.

  • In progress, accepting new jobs: Session je aktivní a přijímá nové úlohy.

  • In progress, not accepting new jobs: Session je aktivní, ale nepřijímá nové úlohy. Odesílání úloh do Session je odmítnuto, ale stávající úlohy Session budou dokončeny. Session se automaticky zavře, jakmile jsou všechny úlohy dokončeny.

  • Closed: Byla dosažena maximální hodnota časového limitu Session nebo byla Session explicitně zavřena.

Zjištění podrobností Session​

Pro komplexní přehled o konfiguraci a stavu Session použij session.details() method.

pozor

Následující blok kódu vrátí chybu uživatelům Open Planu, protože používá Session. Workloady na Open Planu mohou běžet pouze v job mode nebo batch mode.

from qiskit_ibm_runtime import QiskitRuntimeService, Session

# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Estimator

# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_estimator import Estimator

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

with Session(backend=backend) as session:
print(session.details())
{'id': 'ff7977a5-ae7b-4509-9c84-bd1d7ff9f619', 'backend_name': 'ibm_marrakesh', '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}

Vzory použití​

Session jsou zvláště užitečné pro algoritmy, které vyžadují častou komunikaci mezi klasickými a kvantovými prostředky.

Příklad: Spusť iterativní workload, který používá klasický SciPy optimalizátor k minimalizaci nákladové funkce. V tomto modelu SciPy využívá výstup nákladové funkce k výpočtu svého dalšího vstupu.

pozor

Následující blok kódu vrátí chybu uživatelům Open Planu, protože používá Session. Workloady na Open Planu mohou běžet pouze v job mode nebo batch mode.

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()

Spuštění dvou algoritmů VQE v Session pomocí vláken​

Ze Session vytěžíš více, když spustíš více workloadů současně. Následující příklad ukazuje, jak můžeš současně spustit dva algoritmy VQE, každý s jiným klasickým optimalizátorem, uvnitř jediné Session. K rozlišení úloh z různých workloadů se používají také tagy úloh.

pozor

Následující blok kódu vrátí chybu uživatelům Open Planu, protože používá Session. Workloady na Open Planu mohou běžet pouze v job mode nebo batch mode.

from concurrent.futures import ThreadPoolExecutor

# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Estimator

# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_estimator import 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()

Další kroky​

Doporučení