Migrasi dari BackendV1 ke BackendV2
Kelas Qiskit BackendV1 telah didepresiasi dan akan dihapus
dari layanan. Panduan migrasi ini menjelaskan penyesuaian kecil yang perlu kamu lakukan jika menggunakan provider yang sudah diperbarui
dari BackendV1 ke
BackendV2.
Jika kamu hanya menggunakan qiskit_ibm_runtime dan qiskit_aer, tidak ada tindakan yang perlu dilakukan. Paket qiskit_ibm_runtime
selalu menggunakan BackendV2, dan qiskit_aer sudah menggunakan BackendV2 sejak versi 0.13.
Perubahan utama di BackendV2​
Model Qiskit Backend dirancang untuk menyediakan lapisan abstraksi
kepada Qiskit SDK yang memungkinkan penalaran tentang komputer kuantum dalam lingkup SDK. Iterasi pertama model ini diperkenalkan melalui
kelas BackendV1. Kelas ini menyimpan informasi backend dalam
serangkaian kontainer data, yaitu kelas
BackendConfiguration dan
BackendProperties.
Kelas BackendV2 mendefinisikan ulang akses pengguna untuk sebagian
besar properti backend agar bisa bekerja dengan struktur data Qiskit native dan memiliki pola akses yang lebih datar. Inti dari model
BackendV2 adalah kelas
Target, sebuah representasi QPU yang berisi batasan transpilasi yang
bisa digunakan Qiskit untuk mengoptimalkan Circuit untuk eksekusi.
Qiskit SDK telah diperbarui untuk bekerja secara eksklusif dengan input
BackendV2, dan sebagian besar provider sudah diperbarui dari
BackendV1 ke
BackendV2. Diharapkan bahwa provider yang sudah ada akan
mendepresiasi akses lama di mana memungkinkan untuk memberikan migrasi yang mulus, namun pada akhirnya pengguna perlu menyesuaikan kode
mereka.
Prinsip di balik BackendV2 adalah bahwa sebagian besar informasi
tentang sebuah backend terdapat dalam objek Target-nya, dan atribut
backend sering kali mengkueri atribut BackendV2.target-nya untuk mengembalikan informasi. Namun, dalam banyak kasus atribut hanya
memberikan sebagian informasi yang bisa dikandung target. Misalnya, backend.coupling_map mengembalikan objek
CouplingMap yang dibangun dari
Target yang dapat diakses di atribut BackendV2.target. Namun,
target mungkin mengandung instruksi yang beroperasi pada lebih dari dua Qubit (yang tidak bisa direpresentasikan dalam
CouplingMap) atau mungkin memiliki instruksi yang hanya
beroperasi pada sebagian Qubit (atau dua tautan Qubit, untuk instruksi dua Qubit), yang tidak akan diperinci dalam coupling map lengkap
yang dikembalikan oleh BackendV2.coupling_map. Jadi tergantung pada kasus penggunaanmu, mungkin perlu untuk melihat lebih dalam dari
sekadar akses ekuivalen dengan BackendV2.
Perubahan spesifik di BackendV2​
Sebagian besar atribut memiliki pengganti langsung, sehingga menyederhanakan upaya migrasi. Satu-satunya titik ketidakcocokan antara
antarmuka adalah pada CouplingMap.
Berikut adalah tabel contoh pola akses di BackendV1 dan bentuk
barunya dengan BackendV2.
Gulir ke kanan untuk melihat catatan penting.
BackendV1 | BackendV2 | Catatan |
|---|---|---|
backend.configuration().n_qubits | backend.num_qubits | |
backend.configuration().coupling_map | backend.coupling_map | Nilai kembalian dari BackendV2 adalah objek CouplingMap. Di BackendV1 berupa edge list. Selain itu, ini hanya tampilan dari informasi yang terdapat di backend.target yang mungkin hanya merupakan sebagian dari informasi yang terkandung dalam objek Target. |
backend.configuration().backend_name | backend.name | |
backend.configuration().backend_version | backend.backend_version | Atribut BackendV2.version merepresentasikan versi antarmuka Backend abstrak yang diimplementasikan oleh objek, sementara BackendV2.backend_version adalah metadata tentang versi backend itu sendiri. |
backend.configuration().basis_gates | backend.operation_names | BackendV2 mengembalikan daftar nama operasi yang terdapat dalam atribut backend.target. Target mungkin mengandung lebih banyak informasi daripada yang bisa diekspresikan oleh daftar nama ini. Misalnya, beberapa operasi hanya bekerja pada sebagian Qubit, dan beberapa nama mengimplementasikan Gate yang sama dengan parameter berbeda. |
backend.configuration().dt | backend.dt | |
backend.configuration().dtm | backend.dtm | |
backend.configuration().max_experiments | backend.max_circuits | |
backend.configuration().online_date | backend.online_date | |
InstructionDurations.from_backend(backend) | backend.instruction_durations | |
backend.defaults().instruction_schedule_map | backend.instruction_schedule_map | |
backend.properties().t1(0) | backend.qubit_properties(0).t1 | |
backend.properties().t2(0) | backend.qubit_properties(0).t2 | |
backend.properties().frequency(0) | backend.qubit_properties(0).frequency | |
backend.properties().readout_error(0) | backend.target["measure"][(0,)].error | Di BackendV2, tingkat error untuk operasi Measure pada Qubit tertentu digunakan untuk memodelkan readout error. Namun, objek BackendV2 bisa mengimplementasikan beberapa tipe pengukuran dan mencantumkannya secara terpisah dalam Target. |
backend.properties().readout_length(0) | backend.target["measure"][(0,)].duration | Di BackendV2, durasi untuk operasi Measure pada Qubit tertentu digunakan untuk memodelkan readout length. Namun, objek BackendV2 bisa mengimplementasikan beberapa tipe pengukuran dan mencantumkannya secara terpisah dalam Target. |