Sari la conținutul principal

Migrează de la BackendV1 la BackendV2

Clasa Qiskit BackendV1 a fost marcată ca depreciată și va fi eliminată din serviciu. Acest ghid de migrare descrie ajustările minore pe care trebuie să le faci dacă folosești un provider care a făcut upgrade de la BackendV1 la BackendV2.

notă

Dacă folosești exclusiv qiskit_ibm_runtime și qiskit_aer, nu este necesară nicio acțiune. Pachetul qiskit_ibm_runtime a folosit întotdeauna BackendV2, iar qiskit_aer folosește BackendV2 începând cu versiunea 0.13.

Modificări de nivel înalt în BackendV2

Modelul Qiskit Backend a fost conceput pentru a oferi SDK-ului Qiskit un nivel de abstractizare care să permită raționamentul despre calculatoarele cuantice în cadrul SDK-ului. Prima iterație a modelului a fost introdusă prin clasa BackendV1. Această clasă stoca informațiile despre backend într-o serie de containere de date, și anume clasele BackendConfiguration și BackendProperties.

Clasa BackendV2 a redefinit accesul utilizatorilor la majoritatea proprietăților backend-ului, pentru a le face compatibile cu structurile de date native Qiskit și pentru a oferi tipare de acces mai simple. Nucleul modelului BackendV2 este clasa Target, o reprezentare a QPU-ului care conține constrângerile de transpilare pe care Qiskit le poate folosi pentru a optimiza circuitele în vederea execuției.

SDK-ul Qiskit a fost actualizat pentru a lucra exclusiv cu intrări BackendV2, iar majoritatea providerilor au făcut upgrade de la BackendV1 la BackendV2. Se preconizează că providerii existenți vor deprecia vechiul mod de acces acolo unde este posibil, pentru a permite o migrare lină, dar în cele din urmă utilizatorii va trebui să își ajusteze codul.

Principiul din spatele BackendV2 este că majoritatea informațiilor despre un backend sunt conținute în obiectul său Target, iar atributele backend-ului interogează adesea atributul BackendV2.target pentru a returna informații. Totuși, în multe cazuri, atributele oferă doar un subset din informațiile pe care target-ul le poate conține. De exemplu, backend.coupling_map returnează un obiect CouplingMap construit din Target-ul accesibil prin atributul BackendV2.target. Totuși, target-ul ar putea conține instrucțiuni care operează pe mai mult de doi qubiți (care nu pot fi reprezentați într-un CouplingMap) sau ar putea conține instrucțiuni care operează doar pe un subset de qubiți (sau pe două legături de qubiți, pentru o instrucțiune cu doi qubiți), detalii care nu vor fi incluse în harta de cuplare completă returnată de BackendV2.coupling_map. Astfel, în funcție de cazul tău de utilizare, ar putea fi necesar să explorezi mai în profunzime decât simpla înlocuire a accesului echivalent cu BackendV2.

Modificări specifice în BackendV2

Majoritatea atributelor au un înlocuitor direct, ceea ce simplifică eforturile de migrare. Singurul punct de discrepanță între interfețe este în CouplingMap.

Mai jos este un tabel cu exemple de tipare de acces în BackendV1 și noua formă cu BackendV2.

important

Derulează spre dreapta pentru a vedea notele importante.

BackendV1BackendV2Note
backend.configuration().n_qubitsbackend.num_qubits
backend.configuration().coupling_mapbackend.coupling_mapRezultatul returnat de BackendV2 este un obiect CouplingMap. În BackendV1 este o listă de muchii. De asemenea, acesta este doar o vedere a informațiilor conținute în backend.target, care poate fi doar un subset al informațiilor din obiectul Target.
backend.configuration().backend_namebackend.name
backend.configuration().backend_versionbackend.backend_versionAtributul BackendV2.version reprezintă versiunea interfeței abstracte Backend pe care o implementează obiectul, în timp ce BackendV2.backend_version reprezintă metadate despre versiunea backend-ului în sine.
backend.configuration().basis_gatesbackend.operation_namesBackendV2 returnează o listă de nume de operații conținute în atributul backend.target. Target-ul ar putea conține mai multe informații decât pot fi exprimate prin această listă de nume. De exemplu, unele operații funcționează doar pe un subset de qubiți, iar unele nume implementează același gate cu parametri diferiți.
backend.configuration().dtbackend.dt
backend.configuration().dtmbackend.dtm
backend.configuration().max_experimentsbackend.max_circuits
backend.configuration().online_datebackend.online_date
InstructionDurations.from_backend(backend)backend.instruction_durations
backend.defaults().instruction_schedule_mapbackend.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În BackendV2, rata de eroare pentru operația Measure pe un qubit dat este folosită pentru a modela eroarea de citire. Totuși, un obiect BackendV2 poate implementa mai multe tipuri de măsurare și le poate lista separat într-un Target.
backend.properties().readout_length(0)backend.target["measure"][(0,)].durationÎn BackendV2, durata pentru operația Measure pe un qubit dat este folosită pentru a modela lungimea de citire. Totuși, un obiect BackendV2 poate implementa mai multe tipuri de măsurare și le poate lista separat într-un Target.