Mag-migrate mula sa server-side patungo sa client-side na Sampler at Estimator
Inilalarawan ng gabay na ito kung paano mag-migrate mula sa server-side na implementasyon ng IBM Quantum®
Sampler at Estimator patungo sa kanilang bagong client-side na implementasyon sa
qiskit-ibm-runtime. Ang mga interface at opsyon ay karamihan hindi nagbago, kaya karamihan sa code
ay tatakbo nang as-is, ngunit may ilang pagkakaiba sa behavior na dapat unawain.
Kaligiran
Ang Sampler at Estimator ay primitive interface na tinukoy sa Qiskit. Ang IBM Quantum
Compute Service (dating Qiskit Runtime) ay tradisyunal na nagbibigay ng implementasyon
ng mga primitive na ito sa loob ng runtime environment nito. Kapag tinawag mo ang sampler.run() o
estimator.run(), ipinapadala ang request sa service, at lahat ng computation — kabilang ang
error suppression at mitigation — ay nagaganap sa server side.
Maginhawa ang black-box na karanasan na ito: hindi mo na kailangang alalahanin ang mga detalye ng implementasyon. Ngunit dahil dito, mahirap ding i-debug, i-customize, o pag-aralan ang mga primitive, dahil hindi mo makikita kung ano ang nangyayari sa panahon ng processing.
Ang bagong ipinakilalang directed execution model ay gumagamit ng kabaligtarang approach at nagbibigay ng white-box na karanasan. Ang lahat ng design intent ay nakukuha sa client side, at isang solong server-side na primitive Executor ang nagpoproseso ng mga input na iyon nang eksakto ayon sa direksyon — hindi ito gumagawa ng anumang implicit na desisyon para sa iyo.
Simula sa qiskit-ibm-runtime v0.50.0, ang Sampler at Estimator ay muling naipatupad
sa client side sa ibabaw ng Executor. Nagbibigay pa rin sila ng parehong convenience at
abstraction gaya ng dati, at ngayon ay maaari mo nang suriin ang mga detalye ng implementasyon kapag kailangan
mo ito. Dahil ang mga interface at opsyon ay karamihan hindi nagbago, dapat na maayos at walang aberya ang migration.
Tandaan: Sinusuportahan lang ng IBM Quantum ang version 2 ng Sampler at Estimator interface (BaseSamplerV2 at BaseEstimatorV2). Kaya, tinutukoy lang sila bilang Sampler at Estimator sa gabay na ito.
I-update ang mga import
Sa ngayon, kailangan mong explicit na i-import ang mga bagong implementasyon mula sa kani-kanilang dedicated module:
from qiskit_ibm_runtime.executor_sampler import Sampler
from qiskit_ibm_runtime.executor_estimator import Estimator
Sa malapit na hinaharap, ang mga top-level na import ay mare-resolve na sa bagong client-side na implementasyon, at hindi na kakailanganin ang pagbabago sa code:
# Coming soon — the following code will import the new client-side implementations.
from qiskit_ibm_runtime import Sampler, Estimator
Gayundin, kung gagawa ka ng typed options object, kailangan mo itong i-import mula sa
qiskit_ibm_runtime.options_models sa halip, o mag-pasa lang ng plain nested dict:
from qiskit_ibm_runtime.options_models import SamplerOptions, EstimatorOptions
Ano ang nananatiling pareho
-
Ang paggawa ng primitive gamit ang
modeatoptions. -
Ang
run()signature at PUB format. -
Ang options tree (
options.twirling,options.resilience,options.default_shots, at iba pa). -
Ang result data structure na ibinabalik ng
job.result().
Mga hindi compatible na pagbabago sa bagong Sampler
| Pagbabago | Aksyon sa migration |
|---|---|
Ang underlying primitive ngayon ay Executor. Ipapakita ng parehong IBM Quantum Platform user interface at job.primitive_id ang executor sa halip na sampler. | I-update ang anumang code na tumutukoy sa job.primitive_id. |
Ang bagong implementasyon ay nag-ma-map ng mga Sampler input patungo sa Executor input, kaya ang job.inputs ay nagbabalik ng Executor input. | I-update ang anumang code na tumutukoy sa job.inputs. Tingnan ang Mga input ng job. |
Mas maraming pre- at post-processing ang nagaganap na ngayon sa client side, kaya ang sampler.run() at job.result() ay maaaring tumagal nang mas matagal kaysa dati. | I-enable ang INFO logging para sundan ang progress ng client-side processing. Tingnan ang I-enable ang INFO logging. |
Kinokopya ang circuit metadata sa result metadata. Ang mga data type na pinapayagan sa result metadata ay limitado na ngayon sa str, float, int, bool, at mga lists o dictionaries ng mga type na iyon. | Kung kailangan mo ng ibang data type, i-encode muna ito bilang string (halimbawa, gamit ang base64). |
Ang mga options class (options_models.SamplerOptions at iba pa) ay Pydantic models na ngayon sa halip na dataclasses, kaya hindi na ito maaaring i-convert sa Python dictionaries gamit ang asdict(). | Gamitin na lang ang options.model_dump(). |
Ang mga options class na dati ay may V2 suffix (ExecutionOptionsV2 at iba pa) ay wala na nito, dahil hindi na sinusuportahan ang mga V1 primitive. | Alisin ang V2 suffix ng mga options class na ito: palitan ang ExecutionOptionsV2 ng ExecutionOptions, ResilienceOptionsV2 ng ResilienceOptions, at SamplerExecutionOptionsV2 ng SamplerExecutionOptions. |
Kung naka-enable ang twirling at ang shots (sa mga PUB o sa run()), shots_per_randomization, at num_randomizations ay lahat na-specify, ang num_randomizations * shots_per_randomization ang mananaig kaysa sa shots. | Alisin ang num_randomizations at shots_per_randomization kung gusto mong gamitin ang value ng shots. |
Ang ilang input validation ay inilipat na sa server side at nagbibigay na ngayon ng RuntimeError sa halip na IBMInputValueError. | I-update ang mga exception type na hinuhuli ng iyong code. |
| Hindi na sinusuportahan ang mixed shot values sa iisang job. | Mag-submit ng hiwalay na job para sa bawat shot value. Tingnan ang Paghahati ng job para sa mga dapat isaalang-alang. |
Mga hindi compatible na pagbabago sa bagong Estimator
| Pagbabago | Aksyon sa migration |
|---|---|
Ang underlying primitive ngayon ay Executor. Ipapakita ng parehong IBM Quantum Platform user interface at job.primitive_id ang executor sa halip na estimator. | I-update ang anumang code na tumutukoy sa job.primitive_id. |
Ang bagong implementasyon ay nag-ma-map ng mga Estimator input patungo sa Executor input, kaya ang job.inputs ay nagbabalik ng Executor input. | I-update ang anumang code na tumutukoy sa job.inputs. Tingnan ang Mga input ng job. |
Mas maraming pre- at post-processing ang nagaganap na ngayon sa client side, kaya ang estimator.run() at job.result() ay maaaring tumagal nang mas matagal kaysa dati. | I-enable ang INFO logging para sundan ang progress ng client-side processing. Tingnan ang I-enable ang INFO logging. |
Kinokopya ang circuit metadata sa result metadata. Ang mga data type na pinapayagan sa result metadata ay limitado na ngayon sa str, float, int, bool, at mga lists o dictionaries ng mga type na iyon. | Kung kailangan mo ng ibang data type, i-encode muna ito bilang string (halimbawa, gamit ang base64). |
Ang mga options class (options_models.EstimatorOptions at iba pa) ay Pydantic models na ngayon sa halip na dataclasses, kaya hindi na ito maaaring i-convert sa Python dictionaries gamit ang asdict(). | Gamitin na lang ang options.model_dump(). |
Ang mga options class na dati ay may V2 suffix (ExecutionOptionsV2 at iba pa) ay wala na nito, dahil hindi na sinusuportahan ang mga V1 primitive. | Alisin ang V2 suffix ng mga options class na ito: palitan ang ExecutionOptionsV2 ng ExecutionOptions at ang ResilienceOptionsV2 ng ResilienceOptions. |
| Ang lahat ng input options ay ibinabalik sa result metadata, sa halip na isang piling subset. | Wala — ito ay impormasyon lamang. |
Ang ilang input validation ay inilipat na sa server side at nagbibigay na ngayon ng RuntimeError sa halip na IBMInputValueError. | I-update ang mga exception type na hinuhuli ng iyong code. |
| Wala nang implicit na noise learning para sa PEA at PEC. Sinusuportahan pa rin ang measurement noise learning para sa TREX. | Matutunan ang mga noise model nang hiwalay at ipasa ang mga ito sa Estimator. Tingnan ang Magsagawa ng explicit na noise learning para sa PEA at PEC. |
Ang input type ng ResilienceOptions.layer_noise_model ay iba na at maaaring gawin mula sa mga resulta ng NoiseLearnerV3. | Tingnan ang Magsagawa ng explicit na noise learning para sa PEA at PEC kung paano matutunan ang mga noise model gamit ang NoiseLearnerV3 at ipasa ang mga ito sa Estimator. |
Hindi na sinusuportahan ang MeasureNoiseLearningOptions.shots_per_randomization. | Isang solong shot value ang ginagamit para sa lahat ng circuit sa job, kabilang ang mga circuit para sa measurement noise-learning. Kung kailangan mong gumamit ng ibang shot value, i-apply ang TREX gamit ang qiskit-mitigation sa labas ng Estimator. |
| Hindi na sinusuportahan ang mixed precision values sa iisang job. | Mag-submit ng hiwalay na job para sa bawat gustong precision. Tingnan ang Paghahati ng job para sa mga dapat isaalang-alang. |
Hindi na sinusuportahan ang opsyong seed_estimator. | Alisin ang anumang assignment ng options.seed_estimator (ang pag-set nito ay nagbibigay ng ValidationError). Walang katumbas dito sa client side, kaya hindi na maaaring gawing reproducible ang mga resulta gamit ang seed na ito. |
I-enable ang INFO logging
Dahil mas maraming trabaho na ngayon ang nagaganap sa client side, kapaki-pakinabang na makita ang progress ng
processing na iyon. I-enable ang INFO-level logging para sa qiskit_ibm_runtime logger:
import logging
logger = logging.getLogger("qiskit_ibm_runtime")
logger.setLevel(logging.INFO)
Magsagawa ng explicit na noise learning para sa PEA at PEC
Ang bagong Estimator ay hindi na nagsasagawa ng implicit na noise learning kapag pinili ang error
mitigation method na PEA o PEC. Kailangan mong matutunan ang mga noise model nang explicit at ipasa
ang mga ito. Gamitin ang bagong NoiseLearnerV3 para kontrolin kung paano na-stratify ang mga circuit
sa mga layer. Kumukuha ito ng listahan ng mga boxed circuit instruction (halimbawa,
ang mga unique layer) bilang input.
Kinakailangan na ngayon ng PEA at PEC ang explicit na pattern na ito. Huwag laktawan ang hakbang ng noise-learning o mabibigo ang iyong code. Hindi apektado ang measurement noise learning para sa TREX at patuloy itong gumagana gaya ng dati.
Gayundin, kung ang iyong code ay gumagamit ng NoiseLearner at ipinapasa ang resultang noise model sa server-side na Estimator, kailangan mong mag-migrate patungo sa NoiseLearnerV3. HUWAG gamitin ang mas lumang NoiseLearner, na hindi compatible sa bagong Estimator.
Lahat ng noise learning options sa server-side na Estimator (LayerNoiseLearningOptions) ay direktang naka-map sa opsyon ng NoiseLearnerV3 (NoiseLearnerV3Options), maliban sa max_layers_to_learn. Sa halip, ang bilang ng mga layer na matututunan ay batay sa bilang ng mga layer na ipinasa sa NoiseLearnerV3.
Halimbawa:
Server-side Estimator (na naka-enable ang PEC):
from qiskit_ibm_runtime import Estimator
pubs = [...] # Your PUBs
estimator = Estimator(mode, options)
estimator.options.resilience.pec_mitigation = True # or zne_mitigation + pea amplifier
estimator.options.resilience.layer_noise_learning.num_randomizations = 64
job = estimator.run(pubs)
Client-side Estimator (na naka-enable ang PEC):
from qiskit_ibm_runtime.executor_estimator import Estimator
from qiskit_ibm_runtime import NoiseLearnerV3
pubs = [...] # Your PUBs
estimator = Estimator(mode, options)
estimator.options.resilience.pec_mitigation = True # or zne_mitigation + pea amplifier
# Identify the unique layers to learn.
layers = estimator.find_unique_layers(pubs)
# Learn the noise model for those layers (runs as a separate job).
learner = NoiseLearnerV3(mode)
learner.options.num_randomizations = 64 # Same as layer_noise_learning.num_randomizations
learner_job = learner.run(layers)
learner_result = learner_job.result()
# Convert results to Pauli-Lindblad noise maps.
pauli_lindblad_maps = learner_result.to_pauli_lindblad_maps()
# Assign the learned noise maps so PEA/PEC uses them.
estimator.options.resilience.layer_noise_model = zip(layers, pauli_lindblad_maps)
# Now execute the target PUBs.
job = estimator.run(pubs)
Mag-migrate mula sa NoiseLearner patungo sa NoiseLearnerV3
Gumagana lang ang NoiseLearner kasama ang server-side na implementasyon ng Estimator. Kaya, kung ang iyong code ay gumagamit ng NoiseLearner para matutunan ang noise model at ipasa ito sa Estimator, kailangan mong i-update ang iyong code para gamitin ang NoiseLearnerV3.
Tingnan ang gabay na Mag-migrate mula sa NoiseLearner patungo sa NoiseLearnerV3 para sa mga detalye.
Paghahati ng job
Kapag kinakailangan mong hatiin ang isang job sa ilan dahil hindi na sinusuportahan ang mixed shot o precision values sa iisang job, isaalang-alang ang mga sumusunod:
-
Pagsamahin ang mga PUB base sa kanilang target value — isang job bawat natatanging value, hindi isang job bawat PUB. Ang splitting ay isang regrouping, kaya hindi nagbabago ang kabuuang bilang ng mga PUB na isu-submit mo. Halimbawa, sa
[A@0.01, B@0.05, C@0.01], mag-submit ng dalawang job:[A, C]saprecision=0.01at[B]saprecision=0.05. Ang pag-submit ngAatCbilang magkahiwalay na job ay mas hindi episyente, dahil bawat job ay may fixed overhead. -
Matuto nang isang beses at gamitin ang mga noise model sa lahat ng hinating job. Mas episyente na magpatakbo ng iisang
NoiseLearnerV3job sa union ng lahat ng layer. Ang resulta ng isang noise learner job ay naglalaman ng listahan ng mgaNoiseLearnerV3Resultobject, isa para sa bawat input instruction, at nasa parehong pagkakasunod-sunod ng input list. Maaari mong gamitin ang output ng noise learner job na ito sa lahat ng hinating (Estimator) job, at ang mga noise model para sa mga layer na wala sa mga PUB ng isang hinating job ay babalewalain. -
Isumite muna ang lahat ng hinating job sa isang
Batch, saka kolektahin ang kanilang mga resulta. AngBatchexecution mode ay nagbibigay ng episyenteng parallel execution kapag maraming job. Gayunpaman, angjob.result()ay blocking, kaya ang pagtawag dito sa loob ng submission loop ay nagse-serialize sa mga job at binabawi ang mga benepisyo ng paggamit ngBatch. Siguraduhing gamitin mo ang submit-all-then-collect na pattern (ipinapakita sa baba).
Sa sumusunod na halimbawa, kinakailangan ng pub1 at pub2 ang precision=0.5, samantalang kinakailangan ng pub3 ang precision=0.1:
group1_pubs = [pub1, pub2]
group2_pubs = [pub3]
with Batch(backend=backend) as batch:
estimator = Estimator(mode=batch)
estimator.options.resilience.pec_mitigation = True
# Learn once, over the union of every job's layers.
all_layers = estimator.find_unique_layers(group1_pubs + group2_pubs)
learner_job = NoiseLearnerV3(mode=batch).run(all_layers)
learner_result = learner_job.result()
pauli_lindblad_maps = learner_result.to_pauli_lindblad_maps()
# Assign the learned noise maps. Any layers not found in the input PUBs are ignored.
estimator.options.resilience.layer_noise_model = zip(all_layers, pauli_lindblad_maps)
# Submit every split job with different precision values.
jobs = []
jobs.append(estimator.run(group1_pubs, precision=0.5))
jobs.append(estimator.run(group2_pubs, precision=0.1))
# Block once, at the end — the jobs run in parallel.
results = [job.result() for job in jobs]
Istruktura ng mga input ng job
Ang bagong implementasyon ay nag-ma-map ng mga input ng Sampler o Estimator patungo sa mga input ng Executor, kaya ang job.inputs ay nagbabalik ng dictionary na naglalaman ng mga input ng Executor. May sumusunod na keys ang dictionary na ito:
-
options: Ang input naExecutorOption. -
quantum_program: Ang input naQuantumProgram -
schema_version: Ang server-side schema version na ginamit.
Kung ang iyong code ay gumamit ng job.inputs['options'] para hanapin ang mga opsyon na tinukoy para sa job, maaari mo na ngayong gamitin ang job.result().metadata['options'] sa halip.
Mag-test nang lokal gamit ang fake backend
Bago mag-submit sa hardware, maaari mong i-validate ang na-migrate na code laban sa Fake*
na backend para maagap na mahuli ang anumang syntax error. Tandaan ang sumusunod na detalye tungkol sa local testing mode:
-
Hindi nito ginagaya ang mga resulta ng hardware. Ang local noisy simulation ay hindi perpektong gumagaya sa noise ng totoong device, kaya maaaring magkaiba ang mga output. Sinusuri pa rin ng pagpapatakbo kung tama ang mga option path at value type.
-
Ang
NoiseLearnerV3ay walang local testing mode: tinatanggap lang ngmodenito ang totoongBackend,Session, oBatch, kaya hindi mo masusubok ang hakbang ng noise-learning laban sa fake na backend. Sa halip, i-verify ang bahaging iyon ng iyong code laban saNoiseLearnerV3API reference. Kumpirmahin na ang constructor, ang input shape ngrun(instructions), at anumang helper (tulad ng unique-layer helper) ay ginagamit ayon sa dokumentasyon.
I-Cliffordize ang circuit para sa episyenteng lokal na simulation
Ang fake backend ay gumagamit ng statevector (noisy) simulator, na ang gastos ay lumalaki nang exponential kasabay ng
bilang ng qubit at lalim. Kaya, maaaring mag-hang o maubusan ng memory ang isang makatotohanang workload circuit. Dahil
ang local testing ay kailangan lang na masubok ang mga option path (hindi kailangang gayahin ang pisikal na resulta),
bawasan muna ang circuit sa isang Clifford na circuit gamit ang
ConvertISAToClifford,
na nagro-round ng bawat anggulo ng RZ/RZZ/RX sa pinakamalapit na multiple ng π/2. Ang mga Clifford circuit ay
nagsi-simulate nang episyente (stabilizer simulation) anuman ang laki.
from qiskit.transpiler import PassManager
from qiskit_ibm_runtime.transpiler.passes import ConvertISAToClifford
clifford = PassManager([ConvertISAToClifford()]).run(isa_circuit)
# run `clifford` (not the original) through the fake-backend primitive
Kinakailangan ng ConvertISAToClifford ang isang ISA circuit bilang input (ang output ng
generate_preset_pass_manager(...).run(...) na naka-target sa backend). Kailangan mong isaalang-alang ang sumusunod na konsekwensya
kapag gumagawa ng lokal na PUB:
-
Naaalis ang
.layoutattribute. Pinapanatili ng Cliffordized na circuit ang parehong bilang ng qubit, ngunit angclifford.layoutayNone, kaya nabibigo angobservable.apply_layout(clifford.layout). Sa halip, i-layout ang observable mula sa pre-Clifford ISA na circuit:isa_obs = observable.apply_layout(isa_circuit.layout), saka patakbuhin ang(clifford, isa_obs). -
Naaalis ang mga parameter. Ang pag-round sa mga anggulo ng rotation ay ginagawang concrete Clifford na circuit ang isang parametric na ISA circuit, kaya nagiging
0angclifford.num_parameters. Ang isang PUB na may dalang parameter-values array ay mabibigo sa coercion. Para sa lokal na run, alisin ang parameter array mula sa PUB; pinapanatili ng hardware run ang orihinal na parametric na circuit at ang mga value nito.
Mga susunod na hakbang
- Modelo ng directed execution
- Mga input at output ng Estimator
- Tukuyin ang mga opsyon ng Estimator
- Mga input at output ng Sampler
- Tukuyin ang mga opsyon ng Sampler
- Helper ng noise learning (NoiseLearnerV3)
- Sanggunian ng NoiseLearnerV3 API
- Transpiler pass na
ConvertISAToClifford - Mga teknik ng error mitigation at suppression