Przejdź do głównej treści

Performance Management: funkcja Qiskit dostarczana przez Q-CTRL Fire Opal

Zobacz dokumentację API

Uwaga

Funkcje Qiskit to funkcja eksperymentalna dostępna wyłącznie dla użytkowników planów IBM Quantum® Premium Plan, Flex Plan oraz On-Prem (za pośrednictwem IBM Quantum Platform API). Są one w fazie wstępnej wersji (preview) i mogą ulec zmianie.

Wersje pakietów

Kod na tej stronie został opracowany z wykorzystaniem poniższych wymagań. Zalecamy użycie tych wersji lub nowszych.

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

Przegląd​

Fire Opal Performance Management sprawia, że każdy może uzyskiwać znaczące wyniki z komputerów kwantowych na dużą skalę, bez konieczności bycia ekspertem od sprzętu kwantowego. Podczas uruchamiania obwodów z Fire Opal Performance Management automatycznie stosowane są oparte na AI techniki tłumienia błędów, umożliwiając skalowanie większych problemów z większą liczbą bramek i qubit. Takie podejście zmniejsza liczbę shotów potrzebnych do uzyskania prawidłowej odpowiedzi, bez żadnych dodatkowych kosztów — co przekłada się na znaczne oszczędności zarówno czasu obliczeniowego, jak i kosztów.

Performance Management tłumi błędy i zwiększa prawdopodobieństwo uzyskania właściwej odpowiedzi na zaszumionym sprzęcie. Innymi słowy, zwiększa stosunek sygnału do szumu. Poniższy rysunek pokazuje, jak zwiększona dokładność dzięki Performance Management może zmniejszyć potrzebę dodatkowych shotów w przypadku algorytmu kwantowej transformaty Fouriera na 10 qubit. Przy zaledwie 30 shotach Q-CTRL osiąga próg pewności 99%, podczas gdy konfiguracja domyślna (QiskitRuntime Sampler, optimization_level=3 i resilience_level=1, ibm_sherbrooke) wymaga 170 000 shotów. Uzyskując właściwą odpowiedź szybciej, oszczędzasz znaczny czas obliczeniowy.

Wizualizacja poprawionego czasu wykonania

Funkcja Performance Management może być używana z dowolnym algorytmem, a jej zastosowanie zamiast standardowych prymitywów IBM Quantum jest proste. Za kulisami wiele technik tłumienia błędów współpracuje ze sobą, aby zapobiegać błędom w trakcie wykonywania. Wszystkie metody potoku Fire Opal są wstępnie skonfigurowane i niezależne od algorytmu, co oznacza, że zawsze uzyskujesz najlepszą wydajność bez żadnej konfiguracji.

Aby uzyskać dostęp do Performance Management, skontaktuj się z Q-CTRL.

Opis​

Fire Opal Performance Management oferuje dwie opcje wykonania podobne do prymitywów IBM Quantum, dzięki czemu możesz łatwo zamienić je na Q-CTRL Sampler i Estimator. Ogólny przepływ pracy przy użyciu funkcji Performance Management jest następujący:

  1. Zdefiniuj swój obwód (oraz operatory w przypadku Estimator).
  2. Uruchom obwód.
  3. Pobierz wyniki.

Aby zredukować szum sprzętowy, Fire Opal stosuje szereg opartych na AI technik tłumienia błędów przedstawionych na poniższym rysunku. Dzięki Fire Opal cały potok jest w pełni zautomatyzowany i nie wymaga żadnej konfiguracji.

Potok Fire Opal eliminuje potrzebę ponoszenia dodatkowych kosztów, takich jak zwiększony czas wykonywania na sprzęcie kwantowym czy dodatkowe fizyczne qubit. Należy pamiętać, że klasyczny czas przetwarzania nadal jest czynnikiem (więcej szacunków znajdziesz w sekcji Benchmarki, gdzie „Łączny czas" obejmuje zarówno klasyczne, jak i kwantowe przetwarzanie). W przeciwieństwie do łagodzenia błędów, które wymaga dodatkowych kosztów w postaci próbkowania, tłumienie błędów Fire Opal działa zarówno na poziomie bramki, jak i pulsu, aby adresować różne źródła szumu i zapobiegać wystąpieniu błędów. Zapobiegając błędom, eliminuje się potrzebę kosztownego przetwarzania końcowego.

Poniższy rysunek przedstawia metody tłumienia błędów zautomatyzowane przez Fire Opal Performance Management.

Wizualizacja potoku tłumienia błędów

Funkcja oferuje dwa prymitywy, Sampler i Estimator, a wejścia i wyjścia obu rozszerzają zaimplementowaną specyfikację dla prymitywów IBM Quantum V2.

Benchmarki​

Opublikowane wyniki benchmarkowania algorytmicznego wykazują znaczącą poprawę wydajności w różnych algorytmach, w tym Bernstein-Vazirani, kwantowej transformacie Fouriera, wyszukiwaniu Grovera, kwantowym algorytmie optymalizacji przybliżonej oraz variational quantum eigensolver. W dalszej części tej sekcji znajdują się szczegółowe informacje o typach algorytmów, które możesz uruchamiać, a także o oczekiwanej wydajności i czasach wykonywania.

Poniższe niezależne badania pokazują, jak Performance Management Q-CTRL umożliwia prowadzenie badań algorytmicznych na rekordową skalę:

Poniższa tabela stanowi przybliżony przewodnik po dokładności i czasach wykonywania z poprzednich uruchomień benchmarkowych na ibm_fez. Wydajność na innych urządzeniach może się różnić. Czas użytkowania oparty jest na założeniu 10 000 shotów na obwód. Wskazana „Liczba qubit" nie jest twardym ograniczeniem, lecz reprezentuje przybliżone progi, przy których można oczekiwać bardzo spójnej dokładności rozwiązania. Większe problemy zostały z powodzeniem rozwiązane i zachęcamy do testowania powyżej tych limitów.

PrzykładLiczba qubitDokładnośćMiara dokładnościŁączny czas (s)Czas użytkowania runtime (s)Prymityw (tryb)
Bernstein–Vazirani50Q100%Wskaźnik sukcesu (odsetek uruchomień, w których właściwa odpowiedź ma największą liczbę zliczeń)108Sampler
Kwantowa transformata Fouriera30Q100%Wskaźnik sukcesu (odsetek uruchomień, w których właściwa odpowiedź ma największą liczbę zliczeń)108Sampler
Kwantowe szacowanie fazy30Q99,9998%Dokładność znalezionego kąta: 1- abs(real_angle - angle_found)/pi108Sampler
Symulacja kwantowa: model Isinga (15 kroków)20Q99,775%AA (zdefiniowane poniżej)60 (na krok)15 (na krok)Estimator
Symulacja kwantowa 2: dynamika molekularna (20 punktów czasowych)34Q96,78%AmeanA_{mean} (zdefiniowane poniżej)10 (na punkt czasowy)6 (na punkt czasowy)Estimator

Definiując dokładność pomiaru wartości oczekiwanej – metryka AA jest zdefiniowana następująco:

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

gdzie ϵideal\epsilon^{ideal} = idealna wartość oczekiwana, ϵmeas\epsilon^{meas} = zmierzona wartość oczekiwana, ϵmaxideal\epsilon^{ideal}_{max} = idealna wartość maksymalna, a ϵminideal\epsilon^{ideal}_{min} = idealna wartość minimalna. AmeanA_{mean} jest po prostu średnią wartości AA z wielu pomiarów.

Metryka ta jest używana, ponieważ jest niezmiennicza względem globalnych przesunięć i skalowania zakresu osiągalnych wartości. Innymi słowy, niezależnie od tego, czy przesuniesz zakres możliwych wartości oczekiwanych w górę lub w dół, lub zwiększysz rozpiętość, wartość AA powinna pozostać spójna.

Pierwsze kroki​

Fire Opal Performance Management używa Qiskit w wersji v2.0.0, która jest wersją zalecaną. Obsługiwane wersje to Qiskit >=v2.0.0. Uwierzytelnij się przy użyciu swojego klucza API IBM Quantum Platform i wybierz funkcję Qiskit w następujący sposób. (Ten fragment kodu zakłada, że masz już zapisane konto w lokalnym środowisku.)

# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-ibm-catalog qiskit-ibm-runtime
# 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")
Czy ta funkcja obsługuje wszystkie Backendy IBM?

Jeśli chcesz użyć Backendu, który ta funkcja aktualnie nie obsługuje, skontaktuj się z Q-CTRL, aby dodać obsługę.

Prymityw Estimator​

Przykład użycia Estimator​

Użyj prymitywu Estimator w Fire Opal Performance Management, aby określić wartość oczekiwaną pojedynczej pary obwód–obserwowalny. Oprócz pakietów qiskit-ibm-catalog i qiskit będziesz także używać pakietu numpy do uruchomienia tego przykładu. Możesz zainstalować ten pakiet, odkomentowując poniższą komórkę, jeśli uruchamiasz ten przykład w notatniku korzystającym z jądra IPython.

# %pip install numpy

1. Utwórz obwód

Jako przykład wygeneruj losowy operator Hermitowski i obserwowalny do przekazania do funkcji 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. Uruchom obwód

Uruchom obwód i opcjonalnie zdefiniuj Backend oraz liczbę shotów.

# 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,
)

Możesz użyć znanych interfejsów API Qiskit Serverless, aby sprawdzić status zadania funkcji Qiskit:

qctrl_estimator_job.status()
'QUEUED'

3. Pobierz wynik

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

Wyniki mają taki sam format jak wynik 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

Prymityw Sampler​

Przykład użycia Samplera​

Użyj prymitywu Sampler z Fire Opal Performance Management, aby uruchomić obwód Bernsteina–Vazirania. Algorytm ten, służący do znalezienia ukrytego ciągu znaków na podstawie wyników czarnej skrzynki, jest popularnym algorytmem do testów porównawczych, ponieważ istnieje tylko jedna poprawna odpowiedź. 1. Utwórz obwód

Zdefiniuj poprawną odpowiedź algorytmu — ukryty ciąg bitów — oraz obwód Bernsteina–Vazirania. Szerokość obwodu możesz łatwo zmieniać, modyfikując wartość 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. Uruchom obwód

Uruchom obwód i opcjonalnie zdefiniuj Backend oraz liczbę shotów.

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

Sprawdź status obciążenia swojej Funkcji Qiskit lub pobierz wyniki w następujący sposób:

# 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. Pobierz wynik

# 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. Wykreśl najlepsze ciągi bitów

Wykreśl ciąg bitów o najwyższej liczbie zliczeń, aby zobaczyć, czy ukryty ciąg bitów był dominantą.

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

Wykreśl ciąg bitów o najwyższej liczbie wystąpień, aby sprawdzić, czy ukryty ciąg bitów był dominantą.

plot_top_bitstrings(counts, hidden_bitstring)

Output of the previous code cell

Changelog​

  • 2026-02-20: Powiadomienie o wycofaniu — pole metadanych provider_job_ids zostanie wycofane za 30 dni w wersji 0.13.0. Użytkownicy mogą uzyskać dostęp do identyfikatora zadania za pomocą metody job_id() usługi runtime.

  • 2026-02-11: Dodano obsługę ibm_miami oraz metadane wykonania do PubResult.

Uzyskaj wsparcie​

W razie pytań lub problemów skontaktuj się z Q-CTRL.

Następne kroki​

Zalecenia