Lumaktaw sa pangunahing nilalaman
Ang proyektong ito ay nasa beta. Nakakita ng bug? Mag-bukas ng GitHub issue. May tanong o ideya? Magtanong sa Discussions — gusto naming marinig ang iyong feedback!
Gaano kaganda ang kalidad ng pagsasalin sa pahinang ito?

Performance Management: Isang Qiskit Function ng Q-CTRL Fire Opal

Tingnan ang API reference

Tandaan

Ang Qiskit Functions ay isang experimental na feature na available lamang sa mga gumagamit ng IBM Quantum® Premium Plan, Flex Plan, at On-Prem (sa pamamagitan ng IBM Quantum Platform API) Plan. Nasa preview release status ang mga ito at maaaring magbago.

Package versions

Ang code sa pahinang ito ay binuo gamit ang mga sumusunod na kinakailangan. Inirerekomenda naming gamitin ang mga bersyon na ito o mas bago.

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

Pangkalahatang-ideya​

Ginagawa ng Fire Opal Performance Management na simple para sa sinuman na makamit ang makabuluhang resulta mula sa mga quantum computer sa malaking sukat nang hindi kailangang maging eksperto sa quantum hardware. Kapag nagpapatakbo ng mga circuit gamit ang Fire Opal Performance Management, awtomatikong inilalapat ang mga AI-driven na teknik ng error suppression, na nagbibigay-daan sa pag-scale ng mas malalaking problema na may mas maraming gate at qubit. Binabawasan ng approach na ito ang bilang ng mga shot na kailangan para makamit ang tamang sagot, nang walang dagdag na overhead — na nagresulta sa malaking tipid sa oras ng computation at gastos.

Sinusupress ng Performance Management ang mga error at pinapataas ang posibilidad na makuha ang tamang sagot sa maingay na hardware. Sa madaling salita, pinapataas nito ang signal-to-noise ratio. Ipinapakita ng sumusunod na larawan kung paano maaaring bawasan ng mas mataas na katumpakan na pinapagana ng Performance Management ang pangangailangan para sa karagdagang mga shot sa kaso ng isang 10-qubit Quantum Fourier Transform algorithm. Sa 30 shot lamang, naabot ng Q-CTRL ang 99% confidence threshold, samantalang ang default (QiskitRuntime Sampler, optimization_level=3 at resilience_level=1, ibm_sherbrooke) ay nangangailangan ng 170,000 shot. Sa pamamagitan ng pagkuha ng tamang sagot nang mas mabilis, makakatipid ka ng malaking oras ng computation.

Visualization ng pinahusay na runtime

Maaaring gamitin ang Performance Management function sa anumang algorithm, at madali mo itong magagamit bilang kapalit ng mga standard na IBM Quantum primitives. Sa likod ng eksena, maraming teknik ng error suppression ang nagtatrabaho nang sabay-sabay upang maiwasan ang mga error sa runtime. Lahat ng Fire Opal pipeline method ay pre-configured at algorithm-agnostic, ibig sabihin palagi kang makakakuha ng pinakamahusay na performance nang walang karagdagang configuration.

Para makakuha ng access sa Performance Management, makipag-ugnayan sa Q-CTRL.

Paglalarawan​

Ang Fire Opal Performance Management ay may dalawang opsyon para sa pagpapatakbo na katulad ng mga IBM Quantum primitives, kaya madali mong mapapalitan ng Q-CTRL Sampler at Estimator. Ang pangkalahatang workflow para sa paggamit ng Performance Management function ay:

  1. Tukuyin ang iyong circuit (at mga operator sa kaso ng Estimator).
  2. Patakbuhin ang circuit.
  3. Kunin ang mga resulta.

Para bawasan ang ingay ng hardware, gumagamit ang Fire Opal ng iba't ibang AI-driven na teknik ng error suppression na ipinapakita sa sumusunod na larawan. Sa Fire Opal, ang buong pipeline ay ganap na automated nang walang pangangailangan para sa configuration.

Inaalis ng pipeline ng Fire Opal ang pangangailangan para sa karagdagang overhead, tulad ng karagdagang quantum runtime o dagdag na pisikal na qubit. Tandaan na ang classical processing time ay nananatiling isang salik (sumangguni sa seksyon ng Mga Benchmark para sa mga pagtatantya, kung saan ang "Total time" ay sumasalamin sa parehong classical at quantum processing). Kumpara sa error mitigation, na nangangailangan ng overhead sa anyo ng sampling, ang error suppression ng Fire Opal ay gumagana sa parehong gate at pulse na antas upang tugunan ang iba't ibang pinagkukunan ng ingay at upang maiwasan ang posibilidad ng paglitaw ng error. Sa pamamagitan ng pag-iwas sa mga error, naaalis ang pangangailangan para sa mahal na post-processing.

Ipinapakita ng sumusunod na larawan ang mga paraan ng error suppression na na-automate ng Fire Opal Performance Management.

Visualization ng error suppression pipeline

Nag-aalok ang function ng dalawang primitive, Sampler at Estimator, at ang mga input at output ng pareho ay nagpapalawak ng implemented spec para sa IBM Quantum V2 primitives.

Mga Benchmark​

Ang mga resulta ng nai-publish na algorithmic benchmarking ay nagpapakita ng makabuluhang pagpapabuti ng performance sa iba't ibang algorithm, kabilang ang Bernstein-Vazirani, quantum Fourier transform, Grover's search, quantum approximate optimization algorithm, at variational quantum eigensolver. Ang natitirang bahagi ng seksyong ito ay nagbibigay ng karagdagang detalye tungkol sa mga uri ng algorithm na maaari mong patakbuhin, pati na rin ang inaasahang performance at mga runtime.

Ang mga sumusunod na independyenteng pag-aaral ay nagpapakita kung paano pinapagana ng Performance Management ng Q-CTRL ang algorithmic na pananaliksik sa record-breaking na sukat:

Ang sumusunod na talahanayan ay nagbibigay ng magaspang na gabay sa katumpakan at mga runtime mula sa mga nakaraang benchmarking run sa ibm_fez. Ang performance sa ibang device ay maaaring magkaiba. Ang oras ng paggamit ay batay sa assumption na 10,000 shot bawat circuit. Ang "Bilang ng mga qubit" na ipinahiwatig ay hindi isang mahigpit na limitasyon kundi kumakatawan sa tantiyang mga threshold kung saan maaari kang umasa ng napaka-consistent na katumpakan ng solusyon. Matagumpay na nalutas ang mas malalaking sukat ng problema, at hinihikayat ang pagsubok na higit pa sa mga limitasyong ito.

HalimbawaBilang ng qubitKatumpakanSukatan ng katumpakanKabuuang oras (s)Paggamit ng runtime (s)Primitive (Mode)
Bernstein–Vazirani50Q100%Success Rate (Porsyento ng mga run kung saan ang tamang sagot ang bitstring na may pinakamataas na bilang)108Sampler
Quantum Fourier Transform30Q100%Success Rate (Porsyento ng mga run kung saan ang tamang sagot ang bitstring na may pinakamataas na bilang)108Sampler
Quantum Phase Estimation30Q99.9998%Katumpakan ng nahanap na anggulo: 1- abs(real_angle - angle_found)/pi108Sampler
Quantum simulation: Ising model (15 hakbang)20Q99.775%AA (tinukoy sa ibaba)60 (bawat hakbang)15 (bawat hakbang)Estimator
Quantum simulation 2: molecular dynamics (20 time point)34Q96.78%AmeanA_{mean} (tinukoy sa ibaba)10 (bawat time point)6 (bawat time point)Estimator

Pagtukoy ng katumpakan ng pagsukat ng expectation value — ang metric na AA ay tinukoy tulad ng sumusunod:

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

kung saan ang ϵideal\epsilon^{ideal} = ideal na expectation value, ϵmeas\epsilon^{meas} = nasukat na expectation value, ϵmaxideal\epsilon^{ideal}_{max} = ideal na maximum value, at ϵminideal\epsilon^{ideal}_{min} = ideal na minimum value. Ang AmeanA_{mean} ay simpleng average ng halaga ng AA sa maraming pagsukat.

Ginagamit ang metric na ito dahil ito ay invariant sa mga global shift at scaling sa hanay ng mga maaabot na halaga. Sa madaling salita, anuman ang itaas o ibaba mo ang hanay ng mga posibleng expectation value o palawakin ang pagkakalat, dapat manatiling consistent ang halaga ng AA.

Magsimula​

Gumagamit ang Fire Opal Performance Management ng Qiskit v2.0.0, na siyang inirerekomendang bersyon. Ang mga sinusuportahang bersyon ay Qiskit >=v2.0.0. Mag-authenticate gamit ang iyong IBM Quantum Platform API key, at piliin ang Qiskit Function tulad ng sumusunod. (Ipinapalagay ng snippet na ito na na-save mo na ang iyong account sa iyong lokal na kapaligiran.)

# 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")
Sinusuportahan ba ng function na ito ang lahat ng IBM backends?

Kung gusto mong gumamit ng backend na hindi pa sinusuportahan ng function na ito, makipag-ugnayan sa Q-CTRL para magdagdag ng suporta.

Primitive na Estimator​

Halimbawa ng Estimator​

Gamitin ang Estimator primitive ng Fire Opal Performance Management para matukoy ang expectation value ng isang circuit-observable pair. Bukod sa mga package na qiskit-ibm-catalog at qiskit, gagamitin mo rin ang numpy package para patakbuhin ang halimbawang ito. Maaari mong i-install ang package na ito sa pamamagitan ng pag-uncomment ng sumusunod na cell kung pinapatakbo mo ang halimbawang ito sa isang notebook gamit ang IPython kernel.

# %pip install numpy

1. Gumawa ng circuit

Bilang halimbawa, gumawa ng random na Hermitian operator at isang observable para i-input sa Performance Management function.

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. Patakbuhin ang circuit

Patakbuhin ang circuit at opsyonal na tukuyin ang backend at bilang ng mga shot.

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

Maaari mong gamitin ang mga pamilyar na Qiskit Serverless APIs para suriin ang status ng iyong Qiskit Function workload:

qctrl_estimator_job.status()
'QUEUED'

3. Kunin ang resulta

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

Ang mga resulta ay may parehong format tulad ng isang Estimator result:

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

Primitive na Sampler​

Halimbawa ng Sampler​

Gamitin ang primitive na Sampler ng Fire Opal Performance Management para patakbuhin ang isang Bernstein–Vazirani circuit. Ang algorithm na ito, na ginagamit para hanapin ang isang nakatagong string mula sa mga output ng isang black box function, ay isang karaniwang benchmarking algorithm dahil iisa lamang ang tamang sagot nito. 1. Gumawa ng circuit

Tukuyin ang tamang sagot sa algorithm, ang nakatagong bitstring, at ang Bernstein–Vazirani circuit. Maaari mong ayusin ang lapad ng circuit sa pamamagitan lamang ng pagbabago ng 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. Patakbuhin ang circuit

Patakbuhin ang circuit at opsyonal na tukuyin ang backend at bilang ng mga shot.

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

Suriin ang status ng iyong Qiskit Function workload o kunin ang mga resulta tulad ng sumusunod:

# 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. Kunin ang resulta

# 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. I-plot ang mga nangungunang bitstring

I-plot ang bitstring na may pinakamataas na bilang para makita kung ang nakatagong bitstring ang mode.

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

Ang nakatagong bitstring ay naka-highlight sa kulay lila, at dapat itong ang bitstring na may pinakamataas na bilang ng counts.

plot_top_bitstrings(counts, hidden_bitstring)

Output of the previous code cell

Talaan ng mga Pagbabago​

  • 2026-02-20: Abiso ng Deprecation - ang provider_job_ids metadata field ay magiging deprecated sa loob ng 30 araw sa bersyon 0.13.0. Maaaring ma-access ng mga gumagamit ang job ID sa pamamagitan ng job_id() method ng runtime service.

  • 2026-02-11: Mayroon na kaming suporta para sa ibm_miami, at idinagdag ang execution metadata sa PubResult.

Makakuha ng suporta​

Para sa anumang tanong o isyu, makipag-ugnayan sa Q-CTRL.

Mga susunod na hakbang​

Mga Rekomendasyon