IBM Circuit function
- Qiskit Functions adalah fitur eksperimental yang hanya tersedia untuk pengguna IBM Quantum® Premium Plan, Flex Plan, dan On-Prem (via IBM Quantum Platform API) Plan. Fitur ini masih dalam status preview release dan dapat berubah sewaktu-waktu.
Ikhtisar​
IBM® Circuit function menerima abstract PUBs sebagai input, dan mengembalikan nilai ekspektasi yang telah dimitigasi sebagai output. Circuit function ini mencakup pipeline otomatis dan tersesuaikan untuk membantu para peneliti fokus pada penemuan algoritma dan aplikasi.
Deskripsi​
Setelah kamu mengirimkan PUB, sirkuit abstrak dan observable-mu akan ditranspilasi secara otomatis, dieksekusi pada hardware, dan diproses pasca-eksekusi untuk mengembalikan nilai ekspektasi yang telah dimitigasi. Untuk melakukannya, ini menggabungkan alat-alat berikut:
- Qiskit Transpiler Service, termasuk pemilihan otomatis transpilasi berbasis AI dan heuristik untuk menerjemahkan sirkuit abstrakmu ke sirkuit ISA yang dioptimalkan untuk hardware
- Suppression dan mitigasi error yang diperlukan untuk komputasi skala utilitas, termasuk measurement dan gate twirling, dynamical decoupling, Twirled Readout Error eXtinction (TREX), Zero-Noise Extrapolation (ZNE), dan Probabilistic Error Amplification (PEA)
- Qiskit Runtime Estimator, untuk mengeksekusi ISA PUBs pada hardware dan mengembalikan nilai ekspektasi yang telah dimitigasi
Mulai​
Autentikasi menggunakan API key-mu dan pilih Qiskit Function sebagai berikut. (Snippet ini mengasumsikan kamu sudah menyimpan akunmu ke lingkungan lokalmu.)
# 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")
Contoh​
Untuk memulai, coba contoh dasar ini:
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,
)
Periksa status workload Qiskit Function-mu atau ambil hasil sebagai berikut:
print(job.status())
result = job.result()
QUEUED
Hasilnya memiliki format yang sama dengan hasil 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
Input​
Lihat tabel berikut untuk semua parameter input yang diterima IBM Circuit function. Bagian Options berikutnya menjelaskan lebih detail tentang options yang tersedia.
| Nama | Tipe | Deskripsi | Wajib | Default | Contoh |
|---|---|---|---|---|---|
| backend_name | str | Nama backend untuk melakukan query. | Ya | N/A | ibm_fez |
| pubs | Iterable[EstimatorPubLike] | Iterable dari objek PUB-like (primitive unified bloc) abstrak, seperti tuple (circuit, observables) atau (circuit, observables, parameter_values). Lihat Ikhtisar PUBs untuk informasi lebih lanjut. Sirkuit bisa abstrak (non-ISA). | Ya | N/A | (circuit, observables, parameter_values) |
| options | dict | Opsi input. Lihat bagian Options untuk detail lebih lanjut. | Tidak | Lihat bagian Options untuk detail. | {"optimization_level": 3} |
| instance | str | Nama resource cloud dari instance yang akan digunakan dalam format tersebut. | Tidak | Satu dipilih secara acak jika akunmu punya akses ke beberapa instance. | CRN |
Options​
Struktur​
Mirip dengan Qiskit Runtime primitives, opsi untuk IBM Circuit function bisa ditentukan sebagai nested dictionary. Opsi yang umum digunakan, seperti optimization_level dan mitigation_level, berada di level pertama. Opsi lain yang lebih canggih dikelompokkan ke dalam kategori berbeda, seperti resilience.
Default​
Jika kamu tidak menentukan nilai untuk sebuah opsi, nilai default yang ditentukan oleh layanan akan digunakan.
Mitigation level​
IBM Circuit function juga mendukung mitigation_level. Mitigation level menentukan seberapa banyak suppression dan mitigasi error yang diterapkan pada job. Level yang lebih tinggi menghasilkan hasil yang lebih akurat, dengan pengorbanan waktu pemrosesan yang lebih lama. Tingkat pengurangan error bergantung pada metode yang diterapkan. Mitigation level mengabstraksi pilihan detail metode mitigasi dan suppression error agar pengguna bisa mempertimbangkan trade-off biaya/akurasi yang sesuai untuk aplikasinya. Tabel berikut menunjukkan metode yang bersesuaian untuk setiap level.
Meski namanya mirip, mitigation_level menerapkan teknik yang berbeda dari yang digunakan oleh resilience_level Estimator.
Mirip dengan resilience_level di Qiskit Runtime Estimator, mitigation_level menentukan sekumpulan opsi tersesuaikan sebagai dasar. Opsi apapun yang kamu tentukan secara manual selain mitigation level akan diterapkan di atas kumpulan opsi dasar yang didefinisikan oleh mitigation level. Oleh karena itu, pada prinsipnya, kamu bisa mengatur mitigation level ke 1, tetapi kemudian mematikan measurement mitigation, meskipun ini tidak disarankan.
| Mitigation Level | Teknik |
|---|---|
| 1 [Default] | Dynamical decoupling + measurement twirling + TREX |
| 2 | Level 1 + gate twirling + ZNE via gate folding |
| 3 | Level 1 + gate twirling + ZNE via PEA |
Contoh berikut mendemonstrasikan pengaturan mitigation level:
options = {"mitigation_level": 2}
job = function.run(backend_name=backend.name, pubs=pubs, options=options)
Semua opsi yang tersedia​
Selain mitigation_level, IBM Circuit function juga menyediakan sejumlah opsi canggih yang memungkinkan kamu menyesuaikan trade-off biaya/akurasi. Tabel berikut menunjukkan semua opsi yang tersedia:
| Opsi | Sub-opsi | Sub-sub-opsi | Deskripsi | Pilihan | Default |
|---|---|---|---|---|---|
| default_precision | Presisi default yang digunakan untuk PUB apapun atau panggilan run()yang tidak menentukan presisi sendiri. Setiap input PUB bisa menentukan presisinya sendiri. Jika metode run() diberi presisi, maka nilai tersebut digunakan untuk semua PUB dalam panggilan run() yang tidak menentukan presisinya sendiri. | float > 0 | 0.015625 | ||
| max_execution_time | Waktu eksekusi maksimum dalam detik, yang didasarkan pada penggunaan QPU (bukan wall clock time). Penggunaan QPU adalah jumlah waktu QPU didedikasikan untuk memproses job-mu. Jika sebuah job melampaui batas waktu ini, job tersebut akan dibatalkan secara paksa. | Bilangan bulat dalam detik dalam rentang [1, 10800] | |||
| mitigation_level | Seberapa banyak suppression dan mitigasi error yang diterapkan. Lihat bagian Mitigation level untuk informasi lebih lanjut tentang metode yang digunakan di setiap level. | 1 / 2 / 3 | 1 | ||
| optimization_level | Seberapa banyak optimasi yang dilakukan pada sirkuit. Level yang lebih tinggi menghasilkan sirkuit yang lebih dioptimalkan, dengan pengorbanan waktu transpilasi yang lebih lama. | 1 / 2 / 3 | 2 | ||
| dynamical_decoupling | enable | Apakah akan mengaktifkan dynamical decoupling. Lihat Teknik suppression dan mitigasi error untuk penjelasan metodenya. | True/False | True | |
| sequence_type | Urutan dynamical decoupling yang digunakan. * XX: gunakan urutan tau/2 - (+X) - tau - (+X) - tau/2* XpXm: gunakan urutan tau/2 - (+X) - tau - (-X) - tau/2* XY4: gunakan urutantau/2 - (+X) - tau - (+Y) - tau (-X) - tau - (-Y) - tau/2 | 'XX'/'XpXm'/'XY4' | 'XX' | ||
| twirling | enable_gates | Apakah akan menerapkan gate twirling Clifford 2-qubit. | True/False | False | |
| enable_measure | Apakah akan mengaktifkan twirling pada measurement. | True/False | True | ||
| resilience | measure_mitigation | Apakah akan mengaktifkan metode mitigasi error measurement TREX. Lihat Teknik suppression dan mitigasi error untuk penjelasan metodenya. | True/False | True | |
| zne_mitigation | Apakah akan mengaktifkan metode mitigasi error Zero Noise Extrapolation. Lihat Teknik suppression dan mitigasi error untuk penjelasan metodenya. | True/False | False | ||
| zne | amplifier | Teknik yang digunakan untuk memperkuat noise. Salah satu dari: - gate_folding (default) menggunakan gate folding 2-qubit untuk memperkuat noise. Jika faktor noise mengharuskan memperkuat hanya sebagian gate, maka gate-gate tersebut dipilih secara acak.- gate_folding_front menggunakan gate folding 2-qubit untuk memperkuat noise. Jika faktor noise mengharuskan memperkuat hanya sebagian gate, maka gate-gate tersebut dipilih dari bagian depan DAG circuit yang terurut secara topologis.- gate_folding_back menggunakan gate folding 2-qubit untuk memperkuat noise. Jika faktor noise mengharuskan memperkuat hanya sebagian gate, maka gate-gate tersebut dipilih dari bagian belakang DAG circuit yang terurut secara topologis.- pea menggunakan teknik yang disebut Probabilistic error amplification (PEA) untuk memperkuat noise. Lihat Teknik suppression dan mitigasi error untuk penjelasan metodenya. | gate_folding / gate_folding_front / gate_folding_back / pea | gate_folding | |
| noise_factors | Faktor noise yang digunakan untuk amplifikasi noise. | list of floats; each float >= 1 | (1, 1.5, 2) for PEA, and (1, 3, 5) otherwise. | ||
| extrapolator | Faktor noise untuk mengevaluasi model ekstrapolasi fit. Opsi ini tidak mempengaruhi eksekusi atau fitting model dengan cara apapun; ini hanya menentukan titik di mana objek extrapolator dievaluasi untuk dikembalikan dalam field data yang disebut evs_extrapolated dan stds_extrapolated. | one or more of exponential,linear, double_exponential,polynomial_degree_(1 <= k <= 7) | (exponential, linear) | ||
| pec_mitigation | Apakah akan mengaktifkan metode mitigasi error Probabilistic Error Cancellation. Lihat Teknik suppression dan mitigasi error untuk penjelasan metodenya. | True/False | False | ||
| pec | max_overhead | Overhead sampling sirkuit maksimum yang diizinkan, atau None untuk tanpa batas. | None/ integer >1 | 100 |
Dalam contoh berikut, mengatur mitigation level ke 1 awalnya mematikan mitigasi ZNE, tetapi mengatur zne_mitigation ke True menimpa pengaturan relevan dari mitigation_level.
options = {"mitigation_level": 1, "resilience": {"zne_mitigation": True}}
Output​
Output dari Circuit function adalah PrimitiveResult, yang berisi dua field:
-
Satu atau lebih objek PubResult. Ini bisa diindeks langsung dari
PrimitiveResult. -
Metadata tingkat job.
Setiap PubResult berisi field data dan metadata.
-
Field
databerisi setidaknya sebuah array nilai ekspektasi (PubResult.data.evs) dan sebuah array standard error (PubResult.data.stds). Field ini juga bisa berisi lebih banyak data, tergantung pada opsi yang digunakan. -
Field
metadataberisi metadata tingkat PUB (PubResult.metadata).
Snippet kode berikut mendeskripsikan format PrimitiveResult (dan PubResult terkait).
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}
Mengambil pesan error​
Jika status workload-mu adalah ERROR, gunakan job.result() untuk mengambil pesan error guna membantu debugging sebagai berikut:
job = function.run(
backend_name="bad_backend_name", pubs=pubs, options=options
)
print(job.result())
Dapatkan dukungan​
Hubungi IBM Quantum support, dan sertakan informasi berikut:
- Qiskit Function Job ID (
qiskit-ibm-catalog),job.job_id - Deskripsi detail tentang masalahnya
- Pesan atau kode error yang relevan
- Langkah-langkah untuk mereproduksi masalah
Langkah selanjutnya​
- Coba tutorial Mitigasi error dengan IBM Circuit function.