Przejdź do głównej treści

Migracja z BackendV1 do BackendV2

Klasa Qiskit BackendV1 została oznaczona jako przestarzała i zostanie usunięta z serwisu. Ten przewodnik migracji opisuje niewielkie zmiany, które musisz wprowadzić, jeśli korzystasz z providera, który przeszedł z BackendV1 na BackendV2.

uwaga

Jeśli używasz wyłącznie qiskit_ibm_runtime i qiskit_aer, żadne działanie nie jest konieczne. Pakiet qiskit_ibm_runtime zawsze używał BackendV2, a qiskit_aer korzysta z BackendV2 od wersji 0.13.

Zmiany wysokiego poziomu w BackendV2

Model Qiskit Backend został zaprojektowany, aby zapewnić Qiskit SDK warstwę abstrakcji umożliwiającą wnioskowanie o komputerach kwantowych w ramach SDK. Pierwsza iteracja modelu została wprowadzona wraz z klasą BackendV1. Klasa ta przechowywała informacje o Backend w szeregu kontenerów danych, mianowicie klasach BackendConfiguration i BackendProperties.

Klasa BackendV2 na nowo zdefiniowała dostęp użytkownika do większości właściwości Backend, aby działały z natywnymi strukturami danych Qiskit i miały prostsze wzorce dostępu. Sercem modelu BackendV2 jest klasa Target, reprezentacja QPU zawierająca ograniczenia transpilacji, których Qiskit może używać do optymalizowania Circuit pod kątem wykonania.

Qiskit SDK zostało zaktualizowane tak, aby działać wyłącznie z wejściami BackendV2, a większość providerów przeszła z BackendV1 na BackendV2. Oczekuje się, że istniejący providerzy tam, gdzie to możliwe, oznaczą stary dostęp jako przestarzały, aby zapewnić płynną migrację, ale ostatecznie użytkownicy będą musieli dostosować swój kod.

Zasada działania BackendV2 polega na tym, że większość informacji o Backend zawarta jest w jego obiekcie Target, a atrybuty Backend często odpytują atrybut BackendV2.target w celu zwrócenia informacji. Jednak w wielu przypadkach atrybuty te dostarczają jedynie podzbioru informacji, które może zawierać target. Na przykład backend.coupling_map zwraca obiekt CouplingMap zbudowany na podstawie Target dostępnego przez atrybut BackendV2.target. Jednak target może zawierać instrukcje działające na więcej niż dwóch Qubitach (czego nie można wyrazić w CouplingMap) lub instrukcje działające tylko na podzbiorze Qubitów (albo parach Qubitów, w przypadku instrukcji dwuqubitowych), co nie będzie szczegółowo opisane w pełnej mapie sprzężeń zwracanej przez BackendV2.coupling_map. Dlatego w zależności od przypadku użycia może być konieczne sięgnięcie głębiej niż tylko do równoważnego dostępu przez BackendV2.

Konkretne zmiany w BackendV2

Większość atrybutów ma bezpośredni odpowiednik, co upraszcza migrację. Jedyną rozbieżnością między interfejsami jest CouplingMap.

Poniżej przedstawiono tabelę przykładowych wzorców dostępu w BackendV1 oraz ich nowych odpowiedników w BackendV2.

important

Przewiń w prawo, aby zobaczyć ważne uwagi.

BackendV1BackendV2Uwagi
backend.configuration().n_qubitsbackend.num_qubits
backend.configuration().coupling_mapbackend.coupling_mapWartość zwracana przez BackendV2 to obiekt CouplingMap. W BackendV1 jest to lista krawędzi. Ponadto jest to tylko widok informacji zawartych w backend.target, który może być jedynie podzbiorem informacji zawartych w obiekcie Target.
backend.configuration().backend_namebackend.name
backend.configuration().backend_versionbackend.backend_versionAtrybut BackendV2.version reprezentuje wersję abstrakcyjnego interfejsu Backend implementowanego przez dany obiekt, natomiast BackendV2.backend_version to metadane dotyczące wersji samego Backend.
backend.configuration().basis_gatesbackend.operation_namesBackendV2 zwraca listę nazw operacji zawartych w atrybucie backend.target. Target może zawierać więcej informacji, niż można wyrazić przez tę listę nazw. Na przykład niektóre operacje działają tylko na podzbiorze Qubitów, a niektóre nazwy implementują tę samą Gate z różnymi parametrami.
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,)].errorW BackendV2 współczynnik błędu dla operacji Measure na danym Qubicie służy do modelowania błędu odczytu. Jednak obiekt BackendV2 może implementować wiele typów pomiarów i wymieniać je osobno w Target.
backend.properties().readout_length(0)backend.target["measure"][(0,)].durationW BackendV2 czas trwania operacji Measure na danym Qubicie służy do modelowania długości odczytu. Jednak obiekt BackendV2 może implementować wiele typów pomiarów i wymieniać je osobno w Target.