Mula menggunakan primitif
Keluaran beta bagi model pelaksanaan baharu kini tersedia. Model pelaksanaan terarah memberikan lebih fleksibiliti apabila menyesuaikan aliran kerja mitigasi ralat anda. Lihat panduan Model pelaksanaan terarah untuk maklumat lanjut.
Walaupun dokumentasi ini menggunakan primitif dari Qiskit Runtime, yang membolehkan anda menggunakan Backend IBM®, primitif boleh dijalankan pada mana-mana penyedia dengan menggunakan primitif Backend sebagai gantinya. Selain itu, anda boleh menggunakan primitif rujukan untuk dijalankan pada simulator statevector tempatan. Lihat Simulasi tepat dengan primitif Qiskit untuk butiran.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
Langkah-langkah dalam topik ini menerangkan cara menyediakan primitif, meneroka pilihan yang boleh anda gunakan untuk mengkonfigurasinya, dan memanggilnya dalam program.
Untuk menggunakan gate pecahan yang baru disokong, tetapkan use_fractional_gates=True apabila meminta Backend dari contoh QiskitRuntimeService. Sebagai contoh:
service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)
Perhatikan bahawa ini adalah ciri eksperimental dan mungkin berubah pada masa hadapan.
Versi pakej
Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau lebih baharu.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Mula menggunakan Estimator​
1. Mulakan akaun​
Kerana Qiskit Runtime Estimator adalah perkhidmatan yang diurus, anda perlu memulakan akaun anda terlebih dahulu. Anda kemudian boleh memilih QPU yang ingin anda gunakan untuk mengira nilai jangkaan.
Ikuti langkah-langkah dalam topik Pasang dan sediakan jika anda belum mempunyai akaun.
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
print(backend.name)
ibm_torino
2. Cipta Circuit dan boleh jadi​
Anda memerlukan sekurang-kurangnya satu Circuit dan satu boleh jadi sebagai input kepada primitif Estimator.
from qiskit.circuit.library import qaoa_ansatz
from qiskit.quantum_info import SparsePauliOp
entanglement = [tuple(edge) for edge in backend.coupling_map.get_edges()]
observable = SparsePauliOp.from_sparse_list(
[("ZZ", [i, j], 0.5) for i, j in entanglement],
num_qubits=backend.num_qubits,
)
circuit = qaoa_ansatz(observable, reps=2)
# the circuit is parametrized, so we will define the parameter values for execution
param_values = [0.1, 0.2, 0.3, 0.4]
print(f">>> Observable: {observable.paulis}")
>>> Observable: ['IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...', ...]
Circuit dan boleh jadi perlu ditransformasi untuk hanya menggunakan arahan yang disokong oleh QPU (dirujuk sebagai Circuit seni bina set arahan (ISA)). Kami akan menggunakan Transpiler untuk melakukan ini.
from qiskit.transpiler import generate_preset_pass_manager
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pm.run(circuit)
isa_observable = observable.apply_layout(isa_circuit.layout)
print(f">>> Circuit ops (ISA): {isa_circuit.count_ops()}")
>>> Circuit ops (ISA): OrderedDict([('rz', 3826), ('sx', 1601), ('cz', 968)])
3. Mulakan Qiskit Runtime Estimator​
Apabila anda memulakan Estimator, gunakan parameter mode untuk menentukan mod yang anda inginkan untuk dijalankan. Nilai yang boleh dipilih adalah objek batch, session, atau backend untuk mod pelaksanaan kelompok, Session, dan kerja, masing-masing. Untuk maklumat lanjut, lihat Pengenalan kepada mod pelaksanaan Qiskit Runtime.
from qiskit_ibm_runtime import EstimatorV2 as Estimator
estimator = Estimator(mode=backend)
4. Panggil Estimator dan dapatkan keputusan​
Seterusnya, panggil kaedah run() untuk mengira nilai jangkaan untuk Circuit dan boleh jadi input. Circuit, boleh jadi, dan set nilai parameter pilihan dimasukkan sebagai tupel primitive unified bloc (PUB).
job = estimator.run([(isa_circuit, isa_observable, param_values)])
print(f">>> Job ID: {job.job_id()}")
print(f">>> Job Status: {job.status()}")
>>> Job ID: d5k96c4jt3vs73ds5smg
>>> Job Status: QUEUED
result = job.result()
print(f">>> {result}")
print(f" > Expectation value: {result[0].data.evs}")
print(f" > Metadata: {result[0].metadata}")
>>> PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': False, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})
> Expectation value: 25.8930784649363
> Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}
Mula menggunakan Sampler​
1. Mulakan akaun​
Kerana Qiskit Runtime Sampler adalah perkhidmatan yang diurus, anda perlu memulakan akaun anda terlebih dahulu. Anda kemudian boleh memilih QPU yang ingin anda gunakan untuk mengira nilai jangkaan.
Ikuti langkah-langkah dalam topik Pasang dan sediakan jika anda belum menyediakan akaun.
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
2. Cipta Circuit​
Anda memerlukan sekurang-kurangnya satu Circuit sebagai input kepada primitif Sampler.
import numpy as np
from qiskit.circuit.library import efficient_su2
circuit = efficient_su2(127, entanglement="linear")
circuit.measure_all()
# The circuit is parametrized, so we will define the parameter values for execution
param_values = np.random.rand(circuit.num_parameters)
Gunakan Transpiler untuk mendapatkan Circuit ISA.
from qiskit.transpiler import generate_preset_pass_manager
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pm.run(circuit)
print(f">>> Circuit ops (ISA): {isa_circuit.count_ops()}")
>>> Circuit ops (ISA): OrderedDict([('sx', 3089), ('rz', 3036), ('cz', 1092), ('measure', 127), ('barrier', 1)])
3. Mulakan Qiskit Runtime Sampler​
Apabila anda memulakan Sampler, gunakan parameter mode untuk menentukan mod yang anda inginkan untuk dijalankan. Nilai yang boleh dipilih adalah objek batch, session, atau backend untuk mod pelaksanaan kelompok, Session, dan kerja, masing-masing. Untuk maklumat lanjut, lihat Pengenalan kepada mod pelaksanaan Qiskit Runtime. Perhatikan bahawa pengguna Pelan Terbuka tidak boleh menghantar kerja Session.
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)
4. Panggil Sampler dan dapatkan keputusan​
Seterusnya, panggil kaedah run() untuk menjana output. Circuit dan set nilai parameter pilihan dimasukkan sebagai tupel primitive unified bloc (PUB).
job = sampler.run([(isa_circuit, param_values)])
print(f">>> Job ID: {job.job_id()}")
print(f">>> Job Status: {job.status()}")
>>> Job ID: d5k96rsjt3vs73ds5tig
>>> Job Status: QUEUED
result = job.result()
# Get results for the first (and only) PUB
pub_result = result[0]
print(
f"First ten results for the 'meas' output register: {pub_result.data.meas.get_bitstrings()[:10]}"
)
First ten results for the 'meas' output register: ['0101001101010000011001110001011000010010001100001000100110011111011110000010110001101000110011101010000100011011000110101111000', '0100111000000100110001100100000101111000111001101000110111101110110010010100001101001111001010011101010000010011000110000010001', '0101111101111111010011010101000000110100000010000010011101100011100011001100000100100001000101000000100001010101010011001101100', '1100110101111111001110010000010100101010101010001000001100100110011111010000000010001000110111010000010101100000100000110111001', '0010000001111001111010100100010111101000101000100000101100001000011100000100011010110110100011100110001001110110111101010011000', '0101110000001000100100010010100100111000010100000000010010000000010110010010000110000001110110010100000111001110100100111101100', '0100011111101001000111110011011101101101110101110001010111011101111110011101001000000001110000011110000101010000001010000100000', '0001010101011000110100000100111111100001011000111110000011000111001101010000010001001100000110000000100000110101010010101110010', '0100011010001110011110000110100101100100101001001111010100100101010100010000000010100000101010110010000000001000010101011111110', '0000011000000111000001000101111111110110101100110000001100010010011101011100001010000100011010001010001101000000000000010001001']
Mula menggunakan primitif Backend​
Tidak seperti primitif khusus penyedia, primitif Backend adalah pelaksanaan generik yang boleh digunakan dengan objek backend sembarang,
selagi ia melaksanakan antara muka Backend.
- Primitif Sampler boleh dijalankan dengan mana-mana penyedia menggunakan
qiskit.primitives.BackendSamplerV2. - Primitif Estimator boleh dijalankan dengan mana-mana penyedia menggunakan
qiskit.primitives.BackendEstimatorV2.
Sesetengah penyedia melaksanakan primitif secara asli. Lihat halaman Ekosistem Qiskit untuk butiran.
Contoh: BackendEstimator​
from qiskit.primitives import BackendEstimatorV2
from <some_qiskit_provider> import QiskitProvider
provider = QiskitProvider()
backend = provider.get_backend('backend_name')
estimator = BackendEstimatorV2(backend)
Contoh: BackendSampler​
from qiskit.primitives import BackendSamplerV2
from <some_qiskit_provider> import QiskitProvider
provider = QiskitProvider()
backend = provider.get_backend('backend_name')
sampler = BackendSamplerV2(backend)
Persamaan dan perbezaan antara primitif Backend dan Runtime​
-
Input kepada dan output dari
qiskit.primitives.BackendSamplerV2danqiskit.primitives.BackendEstimatorV2mengikut format PUB yang sama seperti primitif dalam Qiskit Runtime. Lihat Input dan output primitif untuk butiran. Walau bagaimanapun, terdapat perbezaan dalam medan metadata yang dikembalikan. -
Kelas
qiskit.primitives.BackendEstimatorV2tidak menawarkan pelaksanaan mitigasi ralat pengukuran atau gate secara bawaan, kerana primitif Backend direka untuk dijalankan secara tempatan pada mesin pengguna. -
Kelas
qiskit.primitives.BackendSamplerV2memerlukan Backend yang menyokong pilihanmemory. -
Antara muka primitif Backend mendedahkan
OptionsSamplerV2danEstimatorV2tersuai yang berbeza daripada pelaksanaan Runtime.
Langkah seterusnya​
- Ketahui cara menguji secara tempatan sebelum menjalankan pada komputer kuantum.
- Semak contoh primitif terperinci.
- Berlatih dengan primitif melalui Pelajaran fungsi kos dalam IBM Quantum Learning.
- Ketahui cara mentranspil secara tempatan dalam bahagian Transpil.
- Cuba panduan Bandingkan tetapan Transpiler.
- Ketahui cara menggunakan pilihan primitif.
- Lihat API untuk pilihan Sampler dan Estimator.
- Baca Migrasi ke primitif V2.