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

Управління продуктивністю: функція Qiskit від Q-CTRL Fire Opal

Дивись довідник API

Примітка

Qiskit Functions — це експериментальна можливість, доступна лише користувачам IBM Quantum® Premium Plan, Flex Plan і On-Prem (через API IBM Quantum Platform). Вони перебувають у статусі попереднього релізу та можуть змінюватись.

Package versions

Код на цій сторінці розроблено з використанням таких вимог. Ми рекомендуємо використовувати ці версії або новіші.

qiskit[all]~=2.3.1
qiskit-ibm-runtime~=0.45.1

Огляд​

Fire Opal Performance Management дозволяє будь-кому легко отримувати значущі результати від квантових комп'ютерів у масштабі, не будучи експертом з квантового заліза. Під час запуску схем із Fire Opal Performance Management автоматично застосовуються методи придушення помилок на основі ШІ, що дає змогу масштабувати більші задачі з більшою кількістю гейтів і кубітів. Такий підхід зменшує кількість вимірювань (shots), необхідних для отримання правильної відповіді, без жодних додаткових накладних витрат — що суттєво економить і час обчислень, і кошти.

Performance Management придушує помилки та підвищує ймовірність отримання правильної відповіді на зашумленому залізі. Іншими словами, він збільшує відношення сигнал/шум. На зображенні нижче показано, як підвищена точність завдяки Performance Management може зменшити потребу в додаткових вимірюваннях на прикладі 10-кубітного алгоритму Квантового перетворення Фур'є. Маючи лише 30 вимірювань, Q-CTRL досягає порогу впевненості 99%, тоді як налаштування за замовчуванням (QiskitRuntime Sampler, optimization_level=3 та resilience_level=1, ibm_sherbrooke) вимагають 170 000 вимірювань. Отримуючи правильну відповідь швидше, ти суттєво економиш обчислювальний час.

Візуалізація покращеного часу виконання

Функцію Performance Management можна використовувати з будь-яким алгоритмом, і нею легко замінити стандартні примітиви IBM Quantum. За лаштунками кілька методів придушення помилок працюють разом, запобігаючи виникненню помилок під час виконання. Усі методи конвеєра Fire Opal попередньо налаштовані та не залежать від алгоритму — ти завжди отримуєш найкращу продуктивність «з коробки».

Щоб отримати доступ до Performance Management, звернись до Q-CTRL.

Опис​

Fire Opal Performance Management має два варіанти виконання, схожих на примітиви IBM Quantum, тому ти можеш легко замінити їх Q-CTRL Sampler і Estimator. Загальний робочий процес використання функції Performance Management такий:

  1. Визнач свою схему (і оператори у випадку Estimator).
  2. Запусти схему.
  3. Отримай результати.

Щоб зменшити апаратний шум, Fire Opal використовує низку методів придушення помилок на основі ШІ, зображених на малюнку нижче. У Fire Opal весь конвеєр повністю автоматизований і не потребує жодного налаштування.

Конвеєр Fire Opal усуває потребу в додаткових накладних витратах, таких як збільшений квантовий час виконання або додаткові фізичні кубіти. Зверни увагу, що класичний час обробки залишається чинником (орієнтовні значення наведено в розділі Бенчмарки, де «Загальний час» відображає як класичну, так і квантову обробку). На відміну від пом'якшення помилок, яке вимагає накладних витрат у формі вибірки, придушення помилок Fire Opal працює як на рівні гейтів, так і на рівні імпульсів, щоб усунути різні джерела шуму та запобігти виникненню помилок. Завдяки запобіганню помилкам усувається потреба в дорогій постобробці.

На зображенні нижче показані методи придушення помилок, автоматизовані Fire Opal Performance Management.

Візуалізація конвеєра придушення помилок

Функція пропонує два примітиви — Sampler і Estimator, — а їхні вхідні та вихідні дані розширюють реалізовану специфікацію примітивів IBM Quantum V2.

Бенчмарки​

Опубліковані результати алгоритмічних бенчмарків демонструють значне покращення продуктивності для різних алгоритмів, зокрема Бернштейна–Вазірані, квантового перетворення Фур'є, пошуку Гровера, квантового алгоритму апроксимаційної оптимізації та варіаційного квантового eigensolver. У решті цього розділу наведено докладнішу інформацію про типи алгоритмів, які можна запускати, а також про очікувану продуктивність і час виконання.

Наступні незалежні дослідження демонструють, як Performance Management від Q-CTRL дає змогу проводити алгоритмічні дослідження рекордного масштабу:

У таблиці нижче наведено приблизний орієнтир щодо точності та часу виконання за попередніми бенчмарками на ibm_fez. Продуктивність на інших пристроях може відрізнятися. Час використання розраховано виходячи з припущення про 10 000 вимірювань на схему. Зазначена «Кількість кубітів» — це не жорстке обмеження, а приблизні пороги, за яких можна очікувати надзвичайно стабільної точності розв'язку. Задачі більшого розміру також були успішно розв'язані, і тестування за цими межами заохочується.

ПрикладКількість кубітівТочністьМіра точностіЗагальний час (с)Час використання (с)Примітив (Режим)
Bernstein–Vazirani50Q100%Відсоток успіху (частка запусків, у яких правильна відповідь є бітрядком із найбільшою кількістю підрахунків)108Sampler
Квантове перетворення Фур'є30Q100%Відсоток успіху (частка запусків, у яких правильна відповідь є бітрядком із найбільшою кількістю підрахунків)108Sampler
Квантова оцінка фази30Q99.9998%Точність знайденого кута: 1- abs(real_angle - angle_found)/pi108Sampler
Квантова симуляція: модель Ізінга (15 кроків)20Q99.775%AA (визначено нижче)60 (на крок)15 (на крок)Estimator
Квантова симуляція 2: молекулярна динаміка (20 часових точок)34Q96.78%AmeanA_{mean} (визначено нижче)10 (на часову точку)6 (на часову точку)Estimator

Визначення точності вимірювання значення математичного сподівання — метрика AA визначається так:

A=1−∣ϵideal−ϵmeas∣ϵmaxideal−ϵminideal,A = 1 - \frac{|\epsilon^{ideal} - \epsilon^{meas}|}{\epsilon^{ideal}_{max} - \epsilon^{ideal}_{min}},

де ϵideal\epsilon^{ideal} = ідеальне значення математичного сподівання, ϵmeas\epsilon^{meas} = виміряне значення математичного сподівання, ϵmaxideal\epsilon^{ideal}_{max} = ідеальне максимальне значення, а ϵminideal\epsilon^{ideal}_{min} = ідеальне мінімальне значення. AmeanA_{mean} — це просто середнє значення AA за кількома вимірюваннями.

Ця метрика використовується тому, що вона інваріантна до глобальних зсувів і масштабування діапазону досяжних значень. Іншими словами, незалежно від того, чи зміщуєш ти діапазон можливих значень математичного сподівання вгору чи вниз, або збільшуєш розкид, значення AA залишається стабільним.

Початок роботи​

Fire Opal Performance Management використовує Qiskit v2.0.0, яка є рекомендованою версією. Підтримувані версії: Qiskit >=v2.0.0. Автентифікуйся за допомогою свого API-ключа IBM Quantum Platform та вибери функцію Qiskit так. (Цей фрагмент коду припускає, що ти вже зберіг свій обліковий запис у локальному середовищі.)

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"matplotlib": "matplotlib", "numpy": "numpy", "qiskit": "qiskit", "qiskit_ibm_catalog": "qiskit-ibm-catalog", "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")
# This cell is hidden from users. It hides the "...You have imported samplomatic..." warning.
import warnings

warnings.filterwarnings("ignore", message=".*You have imported samplomatic*")
from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

# verify that you have access to the function
catalog.list()
[QiskitFunction(qunova/hivqe-chemistry),
QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),
QiskitFunction(algorithmiq/tem),
QiskitFunction(qedma/qesem),
QiskitFunction(multiverse/singularity),
QiskitFunction(ibm/circuit-function),
QiskitFunction(q-ctrl/optimization-solver),
QiskitFunction(colibritd/quick-pde),
QiskitFunction(q-ctrl/performance-management),
QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]
# Access Function
perf_mgmt = catalog.load("q-ctrl/performance-management")
Чи підтримує ця функція всі бекенди IBM?

Якщо ти хочеш використати бекенд, який ця функція наразі не підтримує, звернись до Q-CTRL, щоб додати підтримку.

Примітив Estimator​

Приклад Estimator​

Використовуй примітив Estimator з Fire Opal Performance Management, щоб визначити значення математичного сподівання для пари схема–спостережувана. Крім пакетів qiskit-ibm-catalog і qiskit, для цього прикладу також потрібен пакет numpy. Якщо ти запускаєш цей приклад у ноутбуці з ядром IPython, можеш встановити цей пакет, розкоментувавши наступну комірку.

# %pip install numpy

1. Створи схему

Як приклад, згенеруй випадковий ермітовий оператор і спостережувану величину для передачі до функції Performance Management.

import numpy as np
from qiskit.circuit.library import iqp
from qiskit.quantum_info import random_hermitian, SparsePauliOp

n_qubits = 50

# Generate a random circuit
mat = np.real(random_hermitian(n_qubits, seed=1234))
circuit = iqp(mat)
circuit.measure_all()

# Define observables as a string
observable = SparsePauliOp("Z" * n_qubits)
# Create PUB tuple
estimator_pubs = [(circuit, observable)]

2. Запусти схему

Запусти схему та за бажанням визнач бекенд і кількість вимірювань.

# This cell is hidden from users
from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend_name = service.least_busy().name
# Run the circuit using Estimator
qctrl_estimator_job = perf_mgmt.run(
primitive="estimator",
pubs=estimator_pubs,
backend_name=backend_name,
)

Ти можеш використовувати знайомі API Qiskit Serverless, щоб перевірити статус свого робочого навантаження функції Qiskit:

qctrl_estimator_job.status()
'QUEUED'

3. Отримай результат

# Retrieve the counts from the result list
result = qctrl_estimator_job.result()

Результати мають той самий формат, що й результат Estimator:

import numpy

result_str = str(result)

with numpy.printoptions(threshold=200):
print(
f"The result of the submitted job had {len(result)} PUB "
f"and has a value:\n {result[0]}\n"
)

print("The associated PubResult of this job has the following DataBins:")
print(f"{result[0].data}\n")

print(f"And this DataBin has attributes: {result[0].data.keys()}")

print("The expectation values measured from this PUB are:")
print(f"{result[0].data.evs}")
The result of the submitted job had 1 PUB
The result of the submitted job had 1 PUB and has a value:
PubResult(data=DataBin(evs=0.0195, stds=0.9998098569228051), metadata={'precision': None})

The associated PubResult of this job has the following DataBins:
DataBin(evs=0.0195, stds=0.9998098569228051)

And this DataBin has attributes: dict_keys(['evs', 'stds'])
The expectation values measured from this PUB are:
0.0195

Примітив Sampler​

Приклад Sampler​

Використовуй примітив Sampler з Fire Opal Performance Management для запуску схеми Бернштейна–Вазірані. Цей алгоритм, що використовується для знаходження прихованого рядка з виходів функції «чорного ящика», є поширеним алгоритмом для бенчмаркінгу, оскільки має єдину правильну відповідь. 1. Створи схему

Визнач правильну відповідь алгоритму — прихований бітрядок — і схему Бернштейна–Вазірані. Ти можеш регулювати ширину схеми, просто змінивши circuit_width.

import qiskit

circuit_width = 35
hidden_bitstring = "1" * circuit_width

# Create circuit, reserving one qubit for BV oracle
bv_circuit = qiskit.QuantumCircuit(circuit_width + 1, circuit_width)
bv_circuit.x(circuit_width)
bv_circuit.h(range(circuit_width + 1))
for input_qubit, bit in enumerate(reversed(hidden_bitstring)):
if bit == "1":
bv_circuit.cx(input_qubit, circuit_width)
bv_circuit.barrier()
bv_circuit.h(range(circuit_width + 1))
bv_circuit.barrier()
for input_qubit in range(circuit_width):
bv_circuit.measure(input_qubit, input_qubit)

# Create PUB tuple
sampler_pubs = [(bv_circuit,)]

2. Запусти схему

Запусти схему та за бажанням визнач бекенд і кількість вимірювань.

# Run the circuit using Sampler
qctrl_sampler_job = perf_mgmt.run(
primitive="sampler",
pubs=sampler_pubs,
backend_name=backend_name,
)

Перевір статус свого робочого навантаження функції Qiskit або отримай результати так:

# Print the ID so you can use it later, if necessary
print(qctrl_sampler_job.job_id)

qctrl_sampler_job.status()
60fe2fa1-a860-43e4-8615-c6ac4180f93b
'QUEUED'

3. Отримай результат

# Retrieve the job results
sampler_result = qctrl_sampler_job.result()
# Get results for the first (and only) PUB
pub_result = sampler_result[0]
counts = pub_result.data.c.get_counts()

print("Counts for the meas output register (limited to 30 results):")
for i, (bitstring, count) in enumerate(counts.items()):
if i >= 50:
print(f" ... ({len(counts) - 30} more items)")
break
print(f" {bitstring}: {count}")
Counts for the meas output register (limited to 30 results):
11111111111111111111111111111111111: 1661
11111111111111111111111111110111111: 60
11111111111111111111111111111101111: 54
11111111111111111111111111111110111: 54
11111111111111011111111111111111111: 46
11111111111111111110111111111111111: 44
11111111111111111111111101111111111: 42
11111111111111111111111110111111111: 42
11111111111111110111111111111111111: 41
11111111111111111111111111111111101: 39
11111111111111111111101111111111111: 38
11111111111111111111110111111111111: 38
11111111111111111111111111101111111: 37
11111111111111111111111111111111110: 36
11111111111110111111111111111111111: 35
11111111111111111111111111111011111: 32
11111111111111101111111111111111111: 32
01111111111111111111111111111111111: 27
11111111111111111011111111111111111: 23
11111111101111111111111111111111111: 22
11111111111111111111111111111111011: 21
11111111011111111111111111111111111: 20
00000000000000011111111111111111111: 18
11111111111111111111110101111111111: 18
00000001111111111111111111111111111: 17
11111111001111111111111111111111111: 16
11101111111111111111111111111111111: 16
11111111111101111111111111111111111: 16
00000101111111111111111111111111111: 13
11111111111111111111111011111111111: 13
11111111111111111111111110101111111: 13
11111111111111111101111111111111111: 12
10111111111111111111111111111111111: 12
11111111111111111111111110001111111: 12
00000000000000000011111111111111111: 11
11111111111111111111111111111110110: 10
00000000000000000000000001111111111: 10
11111111111011111111111111111111111: 9
11111111111111101011111111111111111: 9
00000000011111111111111111111111111: 8
10101111111111111111111111111111111: 8
00000000000000000000000001011111111: 8
11111111111111111111111111111111001: 8
00000111111111111111111111111111111: 7
11111111111111111111111111111101110: 7
11111111110111111111111111111111111: 7
00000000000001011111111111111111111: 6
00000000000000001111111111111111111: 6
00000000000000000001011111111111111: 6
11111111111111111111111111011111111: 6
... (1050 more items)

3. Побудуй графік найкращих бітрядків

Побудуй графік бітрядка з найбільшою кількістю підрахунків, щоб перевірити, чи є прихований бітрядок модою.

import matplotlib.pyplot as plt

def plot_top_bitstrings(counts_dict, hidden_bitstring=None):
# Sort and take the top 100 bitstrings
top_100 = sorted(counts_dict.items(), key=lambda x: x[1], reverse=True)[
:100
]
if not top_100:
print("No bitstrings found in the input dictionary.")
return

# Unzip the bitstrings and their counts
bitstrings, counts = zip(*top_100)

# Assign colors: purple if the bitstring matches hidden_bitstring,
# otherwise gray
colors = [
"#680CE9" if bit == hidden_bitstring else "gray" for bit in bitstrings
]

# Create the bar plot
plt.figure(figsize=(15, 8))
plt.bar(
range(len(bitstrings)), counts, tick_label=bitstrings, color=colors
)

# Rotate the bitstrings for better readability
plt.xticks(rotation=90, fontsize=8)
plt.xlabel("Bitstrings")
plt.ylabel("Counts")
plt.title("Top 100 Bitstrings by Counts")

# Show the plot
plt.tight_layout()
plt.show()

Прихований бітрядок виділено фіолетовим, і він має бути бітрядком із найбільшою кількістю підрахунків.

plot_top_bitstrings(counts, hidden_bitstring)

Output of the previous code cell

Журнал змін​

  • 2026-02-20: Deprecation Notice - поле метаданих provider_job_ids буде застаріле через 30 днів у версії 0.13.0. Користувачі можуть отримати ідентифікатор завдання через метод job_id() сервісу виконання.

  • 2026-02-11: Ми тепер підтримуємо ibm_miami і додали метадані виконання до PubResult.

Отримати підтримку​

З будь-якими питаннями або проблемами звернись до Q-CTRL.

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

Рекомендації