Laksanakan litar dinamik
Versi pakej
Kod di halaman ini dibangunkan menggunakan keperluan berikut. Kami syorkan menggunakan versi ini atau yang lebih baru.
qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1
Litar dinamik adalah alatan berkuasa yang membolehkan anda mengukur qubit di tengah-tengah pelaksanaan litar kuantum dan kemudian melakukan operasi logik klasikal dalam litar, berdasarkan hasil ukuran pertengahan litar tersebut. Proses ini juga dikenali sebagai suapan balik klasikal. Walaupun ini adalah hari-hari awal untuk memahami cara terbaik memanfaatkan litar dinamik, komuniti penyelidikan kuantum telah pun mengenal pasti beberapa kes penggunaan, seperti berikut:
- Penyediaan keadaan kuantum yang cekap, seperti keadaan GHZ, keadaan W (untuk maklumat lanjut tentang keadaan W, juga rujuk "State preparation by shallow circuits using feed forward"), dan kelas luas keadaan produk matriks
- Pembelengguan jarak jauh yang cekap antara qubit pada cip yang sama menggunakan litar cetek
- Pensampelan litar seperti IQP yang cekap
Walau bagaimanapun, penambahbaikan yang dibawa oleh litar dinamik ini datang dengan pertukaran. Ukuran pertengahan litar dan operasi klasikal biasanya mempunyai masa pelaksanaan yang lebih lama berbanding Gate dua-Qubit, dan peningkatan masa ini mungkin mengatasi manfaat kedalaman litar yang dikurangkan. Oleh itu, mengurangkan panjang ukuran pertengahan litar adalah bidang tumpuan penambahbaikan apabila IBM Quantumยฎ mengeluarkan versi baru litar dinamik. Untuk sekatan lain apabila menggunakan litar dinamik, lihat jadual Keserasian Ciri Estimator atau Sampler.
Spesifikasi OpenQASM 3 mentakrifkan beberapa struktur aliran kawalan, tetapi Qiskit Runtime kini hanya menyokong pernyataan if bersyarat. Dalam Qiskit SDK, ini sepadan dengan kaedah if_test pada QuantumCircuit. Kaedah ini mengembalikan pengurus konteks dan biasanya digunakan dalam pernyataan with. Panduan ini menerangkan cara menggunakan pernyataan bersyarat ini.
Contoh kod dalam panduan ini menggunakan arahan ukuran standard untuk ukuran pertengahan litar. Walau bagaimanapun, adalah disyorkan untuk menggunakan arahan MidCircuitMeasure sebaliknya, jika Backend menyokongnya. Lihat bahagian Ukuran pertengahan litar untuk butiran.
Cari Backend yang menyokong litar dinamikโ
Untuk mencari semua Backend yang boleh diakses oleh akaun anda dan menyokong litar dinamik, jalankan kod seperti berikut. Contoh ini mengandaikan bahawa anda telah menyimpan kelayakan log masuk anda. Anda juga boleh menentukan kelayakan secara eksplisit apabila memulakan akaun perkhidmatan Qiskit Runtime anda. Ini membolehkan anda melihat Backend yang tersedia pada instans atau jenis pelan tertentu, misalnya.
- Backend yang tersedia untuk akaun bergantung pada instans yang ditentukan dalam kelayakan.
- Versi baru litar dinamik kini tersedia untuk semua pengguna pada semua Backend. Lihat pengumuman untuk butiran lanjut.
# Added by doQumentation โ required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
# This cell is hidden from users. It hides all those "...instance was not set..." warnings.
import warnings
warnings.filterwarnings("ignore", message=".*Instance was not set*")
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
dc_backends = service.backends(dynamic_circuits=True)
print(dc_backends)
[<IBMBackend('ibm_pittsburgh')>, <IBMBackend('ibm_kingston')>, <IBMBackend('ibm_marrakesh')>, <IBMBackend('ibm_fez')>, <IBMBackend('ibm_boston')>]
Ukuran pertengahan litarโ
Sebelum qiskit-ibm-runtime v0.43.0, measure adalah satu-satunya arahan ukuran dalam Qiskit. Walau bagaimanapun, ukuran pertengahan litar mempunyai keperluan penalaan yang berbeza daripada ukuran terminal (ukuran yang berlaku di penghujung litar). Sebagai contoh, anda perlu mempertimbangkan tempoh arahan apabila menala ukuran pertengahan litar kerana arahan yang lebih lama menyebabkan litar yang lebih berhingar. Anda tidak perlu mempertimbangkan tempoh arahan untuk ukuran terminal kerana tiada arahan selepas ukuran terminal.
Arahan MidCircuitMeasure dipetakan kepada arahan measure_2 yang dilaporkan dalam supported_instructions Backend. Walau bagaimanapun, measure_2 tidak disokong pada semua Backend. Gunakan service.backends(filters=lambda b: "measure_2" in b.supported_instructions) untuk mencari Backend yang menyokongnya. Ukuran baru mungkin ditambahkan pada masa depan, tetapi ini tidak dijamin.
Kaedah MidCircuitMeasureโ
Dalam qiskit-ibm-runtime v0.43.0, arahan MidCircuitMeasure telah diperkenalkan. Seperti namanya, ia adalah arahan ukuran baru yang dioptimumkan untuk pertengahan litar pada QPU IBMยฎ. Walaupun anda boleh menggunakan QuantumCircuit.measure untuk ukuran pertengahan litar, kerana reka bentuknya, MidCircuitMeasure biasanya merupakan pilihan yang lebih baik. Sebagai contoh, ia menambahkan lebih sedikit overhed kepada litar anda berbanding menggunakan QuantumCircuit.measure.
from qiskit import QuantumCircuit
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime.circuit import MidCircuitMeasure
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, dynamic_circuits=True
)
circ = QuantumCircuit(2, 2)
circ.x(0)
circ.append(MidCircuitMeasure(), [0], [0])
# circ.measure([0], [0])
# circ.measure_all()
print(circ.draw(cregbundle=False))
โโโโโโโโโโโโโโโโโโโ
q_0: โค X โโค0 โ
โโโโโโ โ
q_1: โโโโโโค Measure_2 โ
โ โ
c_0: โโโโโโก0 โ
โโโโโโโโโโโโโโ
c_1: โโโโโโโโโโโโโโโโโโโ
- Mesti ada sekurang-kurangnya satu daftar klasikal untuk menggunakan ukuran.
- Primitif Sampler memerlukan ukuran litar. Anda boleh menambah ukuran litar dengan primitif Estimator, tetapi ia diabaikan.
Storeโ
Dengan qiskit-ibm-runtime versi 0.47.0 atau lebih baru, anda boleh menggunakan arahan store untuk menyimpan hasil ungkapan klasikal, jika ungkapan tersebut akan digunakan berulang kali. Operasi diparalelkan secara automatik, menjadikan kod anda jauh lebih cekap semasa masa jalan.
Untuk maklumat lanjut, lihat panduan Suapan balik klasikal dan aliran kawalan.
Apabila anda menggunakan store untuk menyimpan nilai ke daftar klasikal pada Backend sebenar, nilai tersebut hanya disimpan dalam memori semasa pelaksanaan dan tidak disalin atau dikembalikan dalam keputusan kerja.
Sebagai contoh, dalam kod berikut, temp mempunyai nilai yang sama dengan creg semasa pelaksanaan, dan if_test berfungsi seperti yang dijangkakan. Tetapi selepas kerja selesai, temp BitArray yang dikembalikan dalam keputusan kerja tidak mengandungi nilai creg. Iaitu, job.result()[0].data.temp adalah 0.
creg = ClassicalRegister(3, "c")
temp = ClassicalRegister(3, "temp")
...
qc.store(temp, creg)
with circuit.if_test((temp, 0b001)):
...
Contoh penuhโ
Kod berikut mencipta dan menjalankan litar dinamik pada perkakasan IBMยฎ.
from qiskit_ibm_runtime import SamplerV2, QiskitRuntimeService
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.transpiler import generate_preset_pass_manager
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, dynamic_circuits=True
)
# Create a dynamic circuit
qubits = QuantumRegister(1)
clbits = ClassicalRegister(1)
qc = QuantumCircuit(qubits, clbits)
(q0,) = qubits
(c0,) = clbits
qc.h(q0)
qc.measure(q0, c0)
with qc.if_test((c0, 1)):
qc.x(q0)
qc.measure(q0, c0)
# Convert to an ISA circuit for the given backend
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(qc)
# Generate samplers for backend targets
sampler = SamplerV2(backend)
# Submit jobs
sampler_job = sampler.run([isa_circuit])
result = sampler_job.result()
print(
f">>> {' Job ID:':<10} {sampler_job.job_id()} ({sampler_job.status()})"
)
>>> Job ID: d88cakp789is7391vq0g (DONE)
Had Qiskit Runtimeโ
Sedar tentang kekangan berikut apabila menjalankan litar dinamik dalam Qiskit Runtime.
-
Disebabkan memori fizikal yang terhad pada elektronik kawalan, terdapat juga had pada bilangan pernyataan
ifdan saiz operannya. Had ini adalah fungsi bilangan siaran dan bilangan bit yang disiarkan dalam kerja (bukan litar).Apabila memproses syarat
if, data ukuran perlu dipindahkan kepada logik kawalan untuk membuat penilaian tersebut. Siaran adalah pemindahan data klasikal yang unik, dan bit yang disiarkan adalah bilangan bit klasikal yang dipindahkan. Pertimbangkan yang berikut:c0 = ClassicalRegister(3)c1 = ClassicalRegister(5)...with circuit.if_test((c0, 1)) ...with circuit.if_test((c0, 3)) ...with circuit.if_test((c1[2], 1)) ...Dalam contoh kod sebelumnya, dua objek
if_testpertama padac0dianggap satu siaran kerana kandunganc0tidak berubah, dan oleh itu tidak perlu disiarkan semula.if_testpadac1adalah siaran kedua. Yang pertama menyiarkan semua tiga bit dalamc0dan yang kedua menyiarkan hanya satu bit, menjadikan jumlah empat bit yang disiarkan.Kini, jika anda menyiarkan 60 bit setiap kali, maka kerja boleh mempunyai kira-kira 300 siaran. Walau bagaimanapun, jika anda hanya menyiarkan satu bit setiap kali, maka kerja boleh mempunyai 2400 siaran.
-
Operan yang digunakan dalam pernyataan
if_testmestilah 32 bit atau kurang. Oleh itu, jika anda membandingkan keseluruhanClassicalRegister, saizClassicalRegistertersebut mestilah 32 bit atau kurang. Walau bagaimanapun, jika anda hanya membandingkan satu bit dariClassicalRegister,ClassicalRegistertersebut boleh berukuran apa-apa (kerana operannya hanya satu bit).Sebagai contoh, blok kod "Tidak sah" tidak berfungsi kerana
crmempunyai lebih daripada 32 bit. Walau bagaimanapun, anda boleh menggunakan daftar klasikal yang lebih lebar daripada 32 bit jika anda menguji hanya satu bit, seperti yang ditunjukkan dalam blok kod "Sah".- Tidak sah
- Sah
cr = ClassicalRegister(50)qr = QuantumRegister(50)circuit = QuantumCircuit(qr, cr)...circ.measure(qr, cr)with circ.if_test((cr, 15)):...cr = ClassicalRegister(50)qr = QuantumRegister(50)circuit = QuantumCircuit(qr, cr)...circ.measure(qr, cr)with circ.if_test((cr[5], 1)):... -
Kondisional bersarang tidak dibenarkan. Sebagai contoh, blok kod berikut tidak akan berfungsi kerana ia mempunyai
if_testdi dalamif_testyang lain:- Tidak sah
- Sah
c1 = ClassicalRegister(1, "c1")c2 = ClassicalRegister(2, "c2")...with circ.if_test((c1, 1)):with circ.if_test(c2, 1)):...cr = ClassicalRegister(2)...with circuit.if_test((cr, 0b11)):... -
Mempunyai
resetatau ukuran di dalam kondisional tidak disokong. -
Operasi aritmetik tidak disokong.
-
Lihat jadual ciri OpenQASM 3 untuk menentukan ciri OpenQASM 3 yang disokong pada Qiskit dan Qiskit Runtime.
-
Apabila OpenQASM 3 (bukan
QuantumCircuit) digunakan sebagai format input untuk menghantar litar kepada primitif Qiskit Runtime, hanya arahan yang boleh dimuatkan ke dalam Qiskit yang disokong. Operasi klasikal, misalnya, tidak disokong kerana ia tidak boleh dimuatkan ke dalam Qiskit. Lihat Import program OpenQASM 3 ke dalam Qiskit untuk maklumat lanjut. -
Arahan
for,while, danswitchtidak disokong.
Gunakan litar dinamik dengan Estimatorโ
Oleh kerana Estimator tidak menyokong litar dinamik, anda boleh menggunakan Sampler dan membina litar ukuran sendiri.
Untuk meniru tingkah laku Estimator, ikuti proses ini:
- Kumpulkan sebutan semua boleh pantau ke dalam partisi. Ini boleh dilakukan menggunakan API
PauliList, misalnya.notaAnda boleh menggunakan atribut primitif
BitArrayuntuk mengira nilai jangkaan boleh pantau yang disediakan. - Laksanakan satu Circuit perubahan asas per partisi (perubahan asas mana yang perlu dilakukan untuk setiap partisi). Lihat utiliti tambahan Ukuran Asas
modul measurement_basesuntuk maklumat lanjut. Untuk maklumat lanjut, lihat dokumentasi untuk pakej utiliti tambahan Qiskit. - Tambahkan semula keputusan untuk setiap partisi.
Sekatanโ
Semak mana-mana jadual Keserasian Ciri untuk memahami sekatan apabila menggunakan litar dinamik. Perhatikan bahawa keserasian ciri tidak bergantung pada primitif.
Langkah seterusnyaโ
- Ketahui cara melaksanakan decoupling dinamik yang tepat menggunakan regangan.
- Semak panduan suapan balik klasikal dan aliran kawalan.
- Gunakan visualisasi jadual litar untuk menyahpepijat dan mengoptimumkan litar dinamik anda.
- Tidak semua fungsi serasi dengan litar dinamik. Semak bahagian keserasian ciri untuk Sampler atau Executor untuk butiran.