Sari la conținutul principal

Performance Management: O funcție Qiskit de Q-CTRL Fire Opal

Consultă referința API

Notă

Funcțiile Qiskit sunt o funcționalitate experimentală disponibilă doar utilizatorilor IBM Quantum® cu plan Premium, plan Flex și plan On-Prem (prin IBM Quantum Platform API). Acestea se află în stadiu de previzualizare și pot suferi modificări.

Versiuni de pachete

Codul de pe această pagină a fost dezvoltat folosind următoarele cerințe. Recomandăm utilizarea acestor versiuni sau a unora mai noi.

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

Prezentare generală​

Fire Opal Performance Management simplifică obținerea de rezultate relevante de la calculatoarele cuantice la scară pentru oricine, fără a fi nevoie să fii expert în hardware cuantic. Când rulezi circuite cu Fire Opal Performance Management, tehnicile de suprimare a erorilor bazate pe inteligență artificială sunt aplicate automat, permițând scalarea unor probleme mai mari cu mai multe Gate-uri și Qubiți. Această abordare reduce numărul de shot-uri necesare pentru a obține răspunsul corect, fără costuri suplimentare — rezultând economii semnificative atât în timp de calcul, cât și în costuri.

Performance Management suprimă erorile și crește probabilitatea de a obține răspunsul corect pe hardware cu zgomot. Cu alte cuvinte, crește raportul semnal-zgomot. Imaginea următoare arată cum acuratețea sporită permisă de Performance Management poate reduce nevoia de shot-uri suplimentare în cazul unui algoritm Quantum Fourier Transform cu 10 Qubiți. Cu doar 30 de shot-uri, Q-CTRL atinge pragul de încredere de 99%, în timp ce metoda implicită (QiskitRuntime Sampler, optimization_level=3 și resilience_level=1, ibm_sherbrooke) necesită 170.000 de shot-uri. Obținând răspunsul corect mai repede, economisești timp de calcul semnificativ.

Vizualizarea timpului de rulare îmbunătățit

Funcția Performance Management poate fi folosită cu orice algoritm și o poți utiliza cu ușurință în locul primitivelor standard IBM Quantum. În culise, mai multe tehnici de suprimare a erorilor lucrează împreună pentru a preveni erorile în timpul execuției. Toate metodele din pipeline-ul Fire Opal sunt preconfigurate și independente de algoritm, ceea ce înseamnă că obții întotdeauna cea mai bună performanță din prima.

Pentru a obține acces la Performance Management, contactează Q-CTRL.

Descriere​

Fire Opal Performance Management are două opțiuni de execuție similare cu primitivele IBM Quantum, astfel încât poți înlocui cu ușurință Sampler-ul și Estimator-ul cu variantele Q-CTRL. Fluxul general de utilizare a funcției Performance Management este:

  1. Definește-ți Circuit-ul (și operatorii, în cazul Estimator-ului).
  2. Rulează Circuit-ul.
  3. Recuperează rezultatele.

Pentru a reduce zgomotul hardware, Fire Opal folosește o serie de tehnici de suprimare a erorilor bazate pe inteligență artificială, ilustrate în imaginea următoare. Cu Fire Opal, întregul pipeline este complet automatizat, fără nicio nevoie de configurare.

Pipeline-ul Fire Opal elimină nevoia de costuri suplimentare, cum ar fi creșterea timpului de rulare cuantic sau Qubiți fizici în plus. Rețineți că timpul de procesare clasică rămâne un factor (consultați secțiunea Benchmark-uri pentru estimări, unde „Timp total" reflectă atât procesarea clasică, cât și cea cuantică). Spre deosebire de atenuarea erorilor, care necesită costuri suplimentare sub formă de eșantionare, suprimarea erorilor din Fire Opal funcționează atât la nivel de poartă, cât și la nivel de puls pentru a aborda diverse surse de zgomot și a preveni probabilitatea producerii unei erori. Prin prevenirea erorilor, este eliminată nevoia de post-procesare costisitoare.

Imaginea următoare ilustrează metodele de suprimare a erorilor automatizate de Fire Opal Performance Management.

Vizualizarea pipeline-ului de suprimare a erorilor

Funcția oferă două primitive, Sampler și Estimator, iar intrările și ieșirile ambelor extind specificația implementată pentru primitivele IBM Quantum V2.

Benchmark-uri​

Rezultatele benchmark-urilor algoritmice publicate demonstrează o îmbunătățire semnificativă a performanței pentru diverși algoritmi, inclusiv Bernstein-Vazirani, transformata Fourier cuantică, căutarea Grover, algoritmul de optimizare aproximativă cuantică și eigensolver-ul variațional cuantic. Restul acestei secțiuni oferă mai multe detalii despre tipurile de algoritmi pe care îi poți rula, precum și performanța și timpii de rulare așteptați.

Următoarele studii independente demonstrează modul în care Performance Management de la Q-CTRL permite cercetarea algoritmică la scară record:

Următorul tabel oferă un ghid aproximativ privind acuratețea și timpii de rulare din benchmark-urile anterioare efectuate pe ibm_fez. Performanța pe alte dispozitive poate varia. Timpul de utilizare se bazează pe o presupunere de 10.000 de shot-uri per Circuit. „Numărul de Qubiți" indicat nu reprezintă o limitare strictă, ci praguri aproximative la care poți aștepta o acuratețe a soluției extrem de consistentă. Probleme de dimensiuni mai mari au fost rezolvate cu succes, iar testarea dincolo de aceste limite este încurajată.

ExempluNumăr de QubițiAcuratețeMăsura acuratețeiTimp total (s)Utilizare runtime (s)Primitivă (Mod)
Bernstein–Vazirani50Q100%Rată de succes (Procentul de rulări în care răspunsul corect este șirul de biți cu cel mai mare număr)108Sampler
Transformata Fourier Cuantică30Q100%Rată de succes (Procentul de rulări în care răspunsul corect este șirul de biți cu cel mai mare număr)108Sampler
Estimarea Fazei Cuantice30Q99,9998%Acuratețea unghiului găsit: 1- abs(real_angle - angle_found)/pi108Sampler
Simulare cuantică: modelul Ising (15 pași)20Q99,775%AA (definit mai jos)60 (per pas)15 (per pas)Estimator
Simulare cuantică 2: dinamica moleculară (20 puncte de timp)34Q96,78%AmeanA_{mean} (definit mai jos)10 (per punct de timp)6 (per punct de timp)Estimator

Definind acuratețea măsurătorii unei valori de așteptare - metrica AA este definită astfel:

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

unde ϵideal\epsilon^{ideal} = valoarea de așteptare ideală, ϵmeas\epsilon^{meas} = valoarea de așteptare măsurată, ϵmaxideal\epsilon^{ideal}_{max} = valoarea maximă ideală, și ϵminideal\epsilon^{ideal}_{min} = valoarea minimă ideală. AmeanA_{mean} este pur și simplu media valorii AA pentru mai multe măsurători.

Această metrică este folosită deoarece este invariantă la deplasări globale și la scalarea în intervalul valorilor posibile. Cu alte cuvinte, indiferent dacă deplasezi intervalul valorilor posibile de așteptare mai sus sau mai jos ori mărești distribuția, valoarea lui AA ar trebui să rămână consistentă.

Noțiuni de bază​

Fire Opal Performance Management folosește Qiskit v2.0.0, care este versiunea recomandată. Versiunile acceptate sunt Qiskit >=v2.0.0. Autentifică-te folosind cheia ta API IBM Quantum Platform și selectează funcția Qiskit după cum urmează. (Acest fragment de cod presupune că ți-ai salvat deja contul în mediul tău local.)

# 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")
Această funcție suportă toate Backend-urile IBM?

Dacă vrei să folosești un Backend pe care această funcție nu îl suportă în prezent, contactează Q-CTRL pentru a adăuga suport.

Primitiva Estimator​

Exemplu Estimator​

Folosește primitiva Estimator din Fire Opal Performance Management pentru a determina valoarea de așteptare a unei perechi circuit-observabil. Pe lângă pachetele qiskit-ibm-catalog și qiskit, vei folosi și pachetul numpy pentru a rula acest exemplu. Poți instala acest pachet decomentând celula de mai jos, dacă rulezi exemplul într-un notebook folosind kernel-ul IPython.

# %pip install numpy

1. Creează Circuit-ul

Ca exemplu, generează un operator Hermitian aleatoriu și un observabil pe care să le transmiți funcției 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. Rulează Circuit-ul

Rulează Circuit-ul și, opțional, definește Backend-ul și numărul de măsurători (shots).

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

Poți folosi API-urile familiare Qiskit Serverless pentru a verifica starea lucrării funcției tale Qiskit:

qctrl_estimator_job.status()
'QUEUED'

3. Recuperează rezultatul

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

Rezultatele au același format ca un rezultat 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

Primitiva Sampler​

Exemplu Sampler​

Folosește primitivul Sampler din Fire Opal Performance Management pentru a rula un circuit Bernstein–Vazirani. Acest algoritm, folosit pentru a găsi un șir ascuns din rezultatele unei funcții cutie neagră, este un algoritm comun de evaluare a performanței deoarece există un singur răspuns corect. 1. Creează Circuit-ul

Definește răspunsul corect al algoritmului, șirul de biți ascuns, și Circuit-ul Bernstein–Vazirani. Poți ajusta lățimea Circuit-ului schimbând pur și simplu 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. Rulează Circuit-ul

Rulează Circuit-ul și, opțional, definește Backend-ul și numărul de măsurători (shots).

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

Verifică starea sarcinii tale de lucru Qiskit Function sau returnează rezultatele după cum urmează:

# 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. Recuperează rezultatul

# 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. Reprezintă grafic cele mai frecvente șiruri de biți

Reprezintă grafic șirul de biți cu cele mai multe numărători pentru a vedea dacă șirul de biți ascuns a fost modul.

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

Șirul de biți ascuns este evidențiat cu mov și ar trebui să fie șirul de biți cu cel mai mare număr de numărători.

plot_top_bitstrings(counts, hidden_bitstring)

Output of the previous code cell

Jurnal de modificări​

  • 2026-02-20: Notificare de depreciere - câmpul de metadate provider_job_ids va fi depreciat în 30 de zile în versiunea 0.13.0. Utilizatorii pot accesa ID-ul jobului prin metoda job_id() a serviciului de rulare.

  • 2026-02-11: Am adăugat suport pentru ibm_miami și metadate de execuție în PubResult.

Obțineți asistență​

Pentru orice întrebări sau probleme, contactează Q-CTRL.

Pași următori​

Recomandări