Міграція з BackendV1 на BackendV2
Клас Qiskit BackendV1 є застарілим і буде вилучений з обслуговування. Цей посібник з міграції описує невеликі зміни, які тобі потрібно внести, якщо ти використовуєш провайдера, що оновився з BackendV1 на BackendV2.
Якщо ти використовуєш виключно qiskit_ibm_runtime та qiskit_aer, жодних дій не потрібно. Пакет qiskit_ibm_runtime завжди використовував BackendV2, а qiskit_aer використовує BackendV2 починаючи з версії 0.13.
Основні зміни в BackendV2
Модель Qiskit Backend була розроблена для забезпечення Qiskit SDK рівнем абстракції,
який дозволяв міркувати про квантові комп'ютери в межах SDK. Перша ітерація моделі була представлена класом
BackendV1. Цей клас зберігав інформацію про Backend у серії
контейнерів даних, а саме класах BackendConfiguration та
BackendProperties.
Клас BackendV2 переглянув
доступ користувача до більшості властивостей Backend, щоб вони працювали з нативними структурами даних Qiskit і мали більш плоскі
шаблони доступу. Ядром моделі BackendV2 є клас
Target — представлення QPU, що містить обмеження транспіляції, які Qiskit може використовувати для оптимізації Circuit для виконання.
Qiskit SDK було оновлено для роботи виключно з вхідними даними BackendV2,
і більшість провайдерів оновилися з BackendV1 на BackendV2. Очікується, що існуючі провайдери визнають застарілим старий доступ, де це можливо, для плавної міграції, але врешті-решт користувачам потрібно буде адаптувати свій код.
Принцип BackendV2 полягає в тому,
що більша частина інформації про Backend міститься в його об'єкті
Target, і атрибути Backend часто звертаються
до атрибута BackendV2.target для повернення інформації. Проте в багатьох випадках атрибути надають лише
підмножину інформації, яку може містити Target. Наприклад, backend.coupling_map
повертає CouplingMap, побудовану з
Target, доступного в атрибуті
BackendV2.target. Проте Target може містити
інструкції, які працюють з більш ніж двома Qubit (що не може бути представлено в
CouplingMap), або може мати інструкції, які працюють лише з
підмножиною Qubit (або двокубітних зв'язків для двокубітної інструкції), що не буде
детально відображено в повній карті зв'язків, що повертається
BackendV2.coupling_map. Тому, залежно від твого випадку використання,
може бути необхідно заглибитися далі, ніж просто еквівалентний доступ через
BackendV2.
Конкретні зміни в BackendV2
Більшість атрибутів мають пряму заміну, що спрощує зусилля з міграції. Єдиною точкою розбіжності між інтерфейсами є CouplingMap.
Нижче наведена таблиця прикладів шаблонів доступу в BackendV1 та нова форма
з BackendV2.
Прокрути праворуч, щоб побачити важливі примітки.
BackendV1 | BackendV2 | Примітки |
|---|---|---|
backend.configuration().n_qubits | backend.num_qubits | |
backend.configuration().coupling_map | backend.coupling_map | Повернення з BackendV2 — це об'єкт CouplingMap. У BackendV1 це список ребер. Також це лише перегляд інформації, що міститься в backend.target, яка може бути лише підмножиною інформації в об'єкті Target. |
backend.configuration().backend_name | backend.name | |
backend.configuration().backend_version | backend.backend_version | Атрибут BackendV2.version представляє версію абстрактного інтерфейсу Backend, який реалізує об'єкт, тоді як BackendV2.backend_version — це метадані про версію самого Backend. |
backend.configuration().basis_gates | backend.operation_names | BackendV2 повертає список імен операцій, що містяться в атрибуті backend.target. Target може містити більше інформації, ніж може бути виражено цим списком імен. Наприклад, деякі операції працюють лише з підмножиною Qubit, а деякі імена реалізують той самий Gate з різними параметрами. |
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 | У BackendV2 частота помилок для операції Measure на даному Qubit використовується для моделювання помилки зчитування. Проте об'єкт BackendV2 може реалізовувати кілька типів вимірювань і перераховувати їх окремо в Target. |
backend.properties().readout_length(0) | backend.target["measure"][(0,)].duration | У BackendV2 тривалість операції Measure на даному Qubit використовується для моделювання довжини зчитування. Проте об'єкт BackendV2 може реалізовувати кілька типів вимірювань і перераховувати їх окремо в Target. |