Funcția IBM Circuit
- Qiskit Functions este o funcționalitate experimentală disponibilă doar utilizatorilor IBM Quantum® Premium Plan, Flex Plan și On-Prem (prin IBM Quantum Platform API) Plan. Se află în stare de previzualizare și poate fi supusă modificărilor.
Prezentare generală
Funcția IBM® Circuit primește PUB-uri abstracte ca intrări și returnează valori de așteptare atenuate ca ieșiri. Această funcție Circuit include un pipeline automatizat și personalizat pentru a le permite cercetătorilor să se concentreze pe descoperirea de algoritmi și aplicații.
Descriere
După ce trimiți PUB-ul tău, circuitele și observabilele abstracte sunt transpilate automat, executate pe hardware și post-procesate pentru a returna valori de așteptare atenuate. În acest scop, sunt combinate următoarele instrumente:
- Qiskit Transpiler Service, inclusiv selecția automată a paselor de transpilare bazate pe AI și euristice pentru a traduce circuitele abstracte în circuite ISA optimizate pentru hardware
- Suprimarea și atenuarea erorilor necesare pentru calculul la scară utilitară, inclusiv twirling-ul măsurătorilor și al porților, decuplarea dinamică, Twirled Readout Error eXtinction (TREX), Zero-Noise Extrapolation (ZNE) și Probabilistic Error Amplification (PEA)
- Qiskit Runtime Estimator, pentru a executa PUB-uri ISA pe hardware și a returna valori de așteptare atenuate
Începe
Autentifică-te folosind cheia ta API și selectează Qiskit Function după cum urmează. (Acest fragment de cod presupune că ți-ai salvat deja contul în mediul local.)
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime
from qiskit_ibm_catalog import QiskitFunctionsCatalog
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
function = catalog.load("ibm/circuit-function")
Exemplu
Pentru a începe, încearcă acest exemplu de bază:
from qiskit.circuit.random import random_circuit
from qiskit_ibm_runtime import QiskitRuntimeService
# You can skip this step if you have a target backend, e.g.
# backend_name = "ibm_brisbane"
# You'll need to specify the credentials when initializing QiskitRuntimeService, if they were not previously saved.
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
circuit = random_circuit(num_qubits=2, depth=2, seed=42)
observable = "Z" * circuit.num_qubits
pubs = [(circuit, observable)]
job = function.run(
# Use `backend_name=backend_name` if you didn't initialize a backend object
backend_name=backend.name,
pubs=pubs,
)
Verifică statusul workload-ului Qiskit Function sau returnează rezultatele după cum urmează:
print(job.status())
result = job.result()
QUEUED
Rezultatele au același format ca un rezultat Estimator:
print(f"The result of the submitted job had {len(result)} PUB\n")
print(
f"The associated PubResult of this job has the following DataBins:\n {result[0].data}\n"
)
print(f"And this DataBin has attributes: {result[0].data.keys()}")
print(
f"The expectation values measured from this PUB are: \n{result[0].data.evs}"
)
The result of the submitted job had 1 PUB
The associated PubResult of this job has the following DataBins:
DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>))
And this DataBin has attributes: dict_keys(['evs', 'stds', 'ensemble_standard_error'])
The expectation values measured from this PUB are:
1.02116704805492
Intrări
Consultă tabelul următor pentru toți parametrii de intrare acceptați de funcția IBM Circuit. Secțiunea Opțiuni de mai jos oferă mai multe detalii despre options disponibile.
| Nume | Tip | Descriere | Obligatoriu | Implicit | Exemplu |
|---|---|---|---|---|---|
| backend_name | str | Numele Backend-ului pentru care se face interogarea. | Da | N/A | ibm_fez |
| pubs | Iterable[EstimatorPubLike] | Un iterabil de obiecte PUB-like abstracte (primitive unified bloc), cum ar fi tupluri (circuit, observables) sau (circuit, observables, parameter_values). Vezi Prezentare generală a PUB-urilor pentru mai multe informații. Circuitele pot fi abstracte (non-ISA). | Da | N/A | (circuit, observables, parameter_values) |
| options | dict | Opțiuni de intrare. Vezi secțiunea Opțiuni pentru mai multe detalii. | Nu | Vezi secțiunea Opțiuni pentru detalii. | {"optimization_level": 3} |
| instance | str | Numele resursei cloud al instanței de utilizat în acel format. | Nu | Una este aleasă aleatoriu dacă contul tău are acces la mai multe instanțe. | CRN |
Opțiuni
Structură
Similar cu primitivele Qiskit Runtime, opțiunile pentru funcția IBM Circuit pot fi specificate ca un dicționar imbricat. Opțiunile frecvent utilizate, cum ar fi optimization_level și mitigation_level, se află la primul nivel. Alte opțiuni mai avansate sunt grupate în diferite categorii, cum ar fi resilience.
Valori implicite
Dacă nu specifici o valoare pentru o opțiune, se utilizează valoarea implicită specificată de serviciu.
Nivelul de atenuare
Funcția IBM Circuit suportă de asemenea mitigation_level. Nivelul de atenuare specifică cât de multă suprimare și atenuare a erorilor să se aplice jobului. Nivelurile mai ridicate generează rezultate mai precise, cu costul unor timpi de procesare mai lungi. Gradul de reducere a erorilor depinde de metoda aplicată. Nivelul de atenuare abstractizează alegerea detaliată a metodelor de atenuare și suprimare a erorilor pentru a permite utilizatorilor să raționeze despre compromisul cost/precizie potrivit aplicației lor. Tabelul următor arată metodele corespunzătoare pentru fiecare nivel.
Deși numele sunt similare, mitigation_level aplică tehnici diferite față de cele utilizate de resilience_level al Estimator.
Similar cu resilience_level în Qiskit Runtime Estimator, mitigation_level specifică un set de bază de opțiuni selectate. Orice opțiuni pe care le specifici manual în plus față de nivelul de atenuare sunt aplicate peste setul de bază de opțiuni definit de nivelul de atenuare. Prin urmare, în principiu, ai putea seta nivelul de atenuare la 1, dar apoi să dezactivezi atenuarea măsurătorilor, deși acest lucru nu este recomandat.
| Nivel de atenuare | Tehnică |
|---|---|
| 1 [Implicit] | Decuplare dinamică + twirling măsurători + TREX |
| 2 | Nivelul 1 + twirling porți + ZNE prin plierea porților |
| 3 | Nivelul 1 + twirling porți + ZNE prin PEA |
Exemplul următor demonstrează setarea nivelului de atenuare:
options = {"mitigation_level": 2}
job = function.run(backend_name=backend.name, pubs=pubs, options=options)
Toate opțiunile disponibile
Pe lângă mitigation_level, funcția IBM Circuit oferă și un număr selectat de opțiuni avansate care îți permit să reglezi fin compromisul cost/precizie. Tabelul următor arată toate opțiunile disponibile:
| Opțiune | Sub-opțiune | Sub-sub-opțiune | Descriere | Valori posibile | Implicit |
|---|---|---|---|---|---|
| default_precision | Precizia implicită de utilizat pentru orice PUB sau apel run()care nu specifică una. Fiecare PUB de intrare poate specifica propria precizie. Dacă metoda run() primește o precizie, atunci acea valoare este utilizată pentru toate PUB-urile din apelul run() care nu specifică propria precizie. | float > 0 | 0.015625 | ||
| max_execution_time | Timpul maxim de execuție în secunde, care se bazează pe utilizarea QPU (nu pe timpul de ceas). Utilizarea QPU reprezintă timpul în care QPU este dedicat procesării jobului tău. Dacă un job depășește această limită de timp, este anulat forțat. | Număr întreg de secunde în intervalul [1, 10800] | |||
| mitigation_level | Cât de multă suprimare și atenuare a erorilor să se aplice. Consultă secțiunea Nivelul de atenuare pentru mai multe informații despre metodele utilizate la fiecare nivel. | 1 / 2 / 3 | 1 | ||
| optimization_level | Cât de multă optimizare să se efectueze pe circuite. Nivelurile mai ridicate generează circuite mai optimizate, cu costul unui timp de transpilare mai lung. | 1 / 2 / 3 | 2 | ||
| dynamical_decoupling | enable | Dacă să se activeze decuplarea dinamică. Consultă Tehnici de suprimare și atenuare a erorilor pentru explicarea metodei. | True/False | True | |
| sequence_type | Ce secvență de decuplare dinamică să se utilizeze. * XX: utilizează secvența tau/2 - (+X) - tau - (+X) - tau/2* XpXm: utilizează secvența tau/2 - (+X) - tau - (-X) - tau/2* XY4: utilizează secvențatau/2 - (+X) - tau - (+Y) - tau (-X) - tau - (-Y) - tau/2 | 'XX'/'XpXm'/'XY4' | 'XX' | ||
| twirling | enable_gates | Dacă să se aplice twirling-ul porților Clifford cu 2 Qubiți. | True/False | False | |
| enable_measure | Dacă să se activeze twirling-ul măsurătorilor. | True/False | True | ||
| resilience | measure_mitigation | Dacă să se activeze metoda de atenuare a erorilor de măsurare TREX. Consultă Tehnici de suprimare și atenuare a erorilor pentru explicarea metodei. | True/False | True | |
| zne_mitigation | Dacă să se activeze metoda de atenuare a erorilor Zero Noise Extrapolation. Consultă Tehnici de suprimare și atenuare a erorilor pentru explicarea metodei. | True/False | False | ||
| zne | amplifier | Ce tehnică să se utilizeze pentru amplificarea zgomotului. Una dintre: - gate_folding (implicit) utilizează plierea porților cu 2 Qubiți pentru a amplifica zgomotul. Dacă factorul de zgomot necesită amplificarea doar a unui subset de porți, atunci aceste porți sunt alese aleatoriu.- gate_folding_front utilizează plierea porților cu 2 Qubiți pentru a amplifica zgomotul. Dacă factorul de zgomot necesită amplificarea doar a unui subset de porți, atunci aceste porți sunt selectate de la începutul circuitului DAG ordonat topologic.- gate_folding_back utilizează plierea porților cu 2 Qubiți pentru a amplifica zgomotul. Dacă factorul de zgomot necesită amplificarea doar a unui subset de porți, atunci aceste porți sunt selectate de la sfârșitul circuitului DAG ordonat topologic.- pea utilizează o tehnică numită Probabilistic error amplification (PEA) pentru a amplifica zgomotul. Consultă Tehnici de suprimare și atenuare a erorilor pentru explicarea metodei. | gate_folding / gate_folding_front / gate_folding_back / pea | gate_folding | |
| noise_factors | Factorii de zgomot de utilizat pentru amplificarea zgomotului. | listă de numere float; fiecare float >= 1 | (1, 1.5, 2) pentru PEA, și (1, 3, 5) în alte cazuri. | ||
| extrapolator | Factorii de zgomot la care se evaluează modelele de extrapolare. Această opțiune nu afectează în niciun fel execuția sau ajustarea modelului; determină doar punctele în care obiectele extrapolator sunt evaluate pentru a fi returnate în câmpurile de date numite evs_extrapolated și stds_extrapolated. | unul sau mai multe dintre exponential,linear, double_exponential,polynomial_degree_(1 <= k <= 7) | (exponential, linear) | ||
| pec_mitigation | Dacă să se activeze metoda de atenuare a erorilor Probabilistic Error Cancellation. Consultă Tehnici de suprimare și atenuare a erorilor pentru explicarea metodei. | True/False | False | ||
| pec | max_overhead | Supraîncărcarea maximă admisă la eșantionarea circuitelor, sau None pentru nicio limită maximă. | None/ integer >1 | 100 |
În exemplul următor, setarea nivelului de atenuare la 1 dezactivează inițial atenuarea ZNE, dar setarea zne_mitigation la True suprascrie configurarea relevantă din mitigation_level.
options = {"mitigation_level": 1, "resilience": {"zne_mitigation": True}}
Ieșiri
Ieșirea unei funcții Circuit este un PrimitiveResult, care conține două câmpuri:
-
Unul sau mai multe obiecte PubResult. Acestea pot fi indexate direct din
PrimitiveResult. -
Metadate la nivel de job.
Fiecare PubResult conține un câmp data și un câmp metadata.
-
Câmpul
dataconține cel puțin o serie de valori de așteptare (PubResult.data.evs) și o serie de erori standard (PubResult.data.stds). Poate conține de asemenea mai multe date, în funcție de opțiunile utilizate. -
Câmpul
metadataconține metadate la nivel de PUB (PubResult.metadata).
Fragmentul de cod următor descrie formatul PrimitiveResult (și PubResult asociat).
print(f"The result of the submitted job had {len(result)} PUB")
print(
f"The expectation values measured from this PUB are: \n{result[0].data.evs}"
)
print(f"And the associated metadata is: \n{result[0].metadata}")
The result of the submitted job had 1 PUB
The expectation values measured from this PUB are:
1.02116704805492
And the associated metadata is:
{'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}
Obținerea mesajelor de eroare
Dacă statusul workload-ului tău este ERROR, folosește job.result() pentru a obține mesajul de eroare care să te ajute la depanare, după cum urmează:
job = function.run(
backend_name="bad_backend_name", pubs=pubs, options=options
)
print(job.result())
Obține suport
Contactează suportul IBM Quantum și include următoarele informații:
- ID-ul jobului Qiskit Function (
qiskit-ibm-catalog),job.job_id - O descriere detaliată a problemei
- Orice mesaje sau coduri de eroare relevante
- Pași pentru reproducerea problemei
Pașii următori
- Încearcă tutorialul Atenuarea erorilor cu funcția IBM Circuit.