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.
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.
Przewiń w prawo, aby zobaczyć ważne uwagi.
BackendV1 | BackendV2 | Uwagi |
|---|---|---|
backend.configuration().n_qubits | backend.num_qubits | |
backend.configuration().coupling_map | backend.coupling_map | Wartość 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_name | backend.name | |
backend.configuration().backend_version | backend.backend_version | Atrybut 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_gates | backend.operation_names | BackendV2 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().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 | W 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,)].duration | W 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. |