Дробові гейти
Package versions
Код на цій сторінці було розроблено з використанням наступних залежностей. Рекомендуємо використовувати ці або новіші версії.
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
Ця сторінка знайомить з двома нещодавно підтриманими типами гейтів у флоті QPU IBM Quantum®. Ці дробові гейти підтримуються на QPU Heron у вигляді:
- для
- для довільного
На цій сторінці розглядаються випадки використання дробових гейтів, де вони можуть підвищити ефективність твоїх робочих процесів, а також те, як застосовувати ці гейти на QPU IBM Quantum.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
Як використовувати дробові гейти
Внутрішньо ці дробові гейти працюють шляхом безпосереднього виконання обертання і на довільний кут. Використання гейта може скоротити тривалість і похибку для однокубітних обертань на довільний кут до двох разів. Безпосереднє виконання обертання гейта дозволяє уникнути декомпозиції в кілька об'єктів CZGate, аналогічно скорочуючи тривалість і похибку схеми. Це особливо корисно для схем, що містять багато одно- і двокубітних обертань — наприклад, при моделюванні динаміки квантової системи або при використанні варіаційного ансатцу з великою кількістю параметрів.
Хоча ці типи гейтів є в бібліотеці стандартних гейтів, якою може володіти QuantumCircuit, вони можуть використовуватися лише на конкретних QPU IBM Quantum, і для цього потрібно завантажити їх з прапорцем use_fractional_gates зі значенням True (показано нижче). Цей прапорець гарантує, що дробові гейти будуть включені до Target бекенду для транспілятора.
service = QiskitRuntimeService()
backend = service.backend('ibm_torino', use_fractional_gates=True)
Цей приклад коду демонструє, як використовувати дробові гейти в контексті робочого процесу, що моделює динаміку ланцюжка Ізінга за допомогою дробових гейтів. Тривалість схеми потім порівнюється з бекендом, що не використовує дробові гейти.
Значення похибки, що повідомляється в Target бекенду з увімкненими дробовими гейтами, є лише копією відповідного значення недробового гейта (яке може не збігатися). Це пов'язано з тим, що звітність про рівні похибок для дробових гейтів ще не підтримується.
Однак, оскільки час виконання дробових і недробових гейтів однаковий, можна обґрунтовано припустити, що їхні рівні похибок є порівнянними — особливо коли домінуючим джерелом похибки в схемі є релаксація.
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.visualization.timeline import draw as draw_timeline, IQXSimple
from qiskit_ibm_runtime import QiskitRuntimeService
num_qubits = 5
num_time_steps = 3
rx_angle = 0.1
rzz_angle = 0.1
ising_circuit = QuantumCircuit(num_qubits)
for i in range(num_time_steps):
# rx layer
for q in range(num_qubits):
ising_circuit.rx(rx_angle, q)
for q in range(1, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
# 2nd rzz layer
for q in range(0, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
ising_circuit.barrier()
ising_circuit.draw("mpl")
Задай два об'єкти бекенду: один з увімкненими дробовими гейтами, інший — з вимкненими, потім транспілюй обидва.
service = QiskitRuntimeService()
backend_name = service.least_busy(operational=True, simulator=False).name
backend_fractional = service.backend(backend_name, use_fractional_gates=True)
backend_conventional = service.backend(
backend_name, use_fractional_gates=False
)
pm_fractional = generate_preset_pass_manager(
optimization_level=3, backend=backend_fractional, scheduling_method="alap"
)
pm_conventional = generate_preset_pass_manager(
optimization_level=3,
backend=backend_conventional,
scheduling_method="alap",
)
ising_circuit_fractional = pm_fractional.run(ising_circuit)
ising_circuit_conventional = pm_conventional.run(ising_circuit)
Відобрази часову шкалу схеми з двома типами гейтів.
# Draw timeline of circuit with conventional gates
draw_timeline(
ising_circuit_conventional,
idle_wires=False,
target=backend_conventional.target,
time_range=(0, 500),
style=IQXSimple(),
)
# Draw timeline of circuit with fractional gates
draw_timeline(
ising_circuit_fractional,
idle_wires=False,
target=backend_fractional.target,
time_range=(0, 500),
style=IQXSimple(),
)
Обмеження на кути
Для двокубітного гейта на обладнанні IBM Quantum можна виконувати лише кути між і . Якщо схема містить будь-які гейти з кутом поза цим діапазоном, стандартний конвеєр транспіляції зазвичай виправить це за допомогою відповідного перетворення схеми (через прохід FoldRzzAngle). Однак для будь-якого гейта , що містить один або більше Parameterів, транспілятор вважатиме, що ці параметри будуть отримувати кути у цьому діапазоні під час виконання. Завдання завершиться помилкою, якщо будь-яке зі значень параметрів, зазначених у PUB, поданому до IBM Quantum Compute Service, виходить за межі цього діапазону.
Де використовувати дробові гейти
Історично базові гейти, доступні на QPU IBM Quantum, — це CZ, X, RZ, SX і ID, які не можуть ефективно представляти схеми з одно- і двокубітними обертаннями, що не є кратними . Наприклад, гейт при транспіляції має розкластися в послідовність гейтів і , що породжує схему з двома гейтами скінченної тривалості замість одного.
Аналогічно, при транспіляції двокубітних обертань, таких як гейт , декомпозиція потребує двох гейтів CZ і кількох однокубітних гейтів, що збільшує глибину схеми. Ці декомпозиції показані в наступному коді.
qc = QuantumCircuit(1)
param = Parameter("θ")
qc.rx(param, 0)
qc.draw("mpl")
# Decomposition of an RX(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
qc = QuantumCircuit(2)
param = Parameter("θ")
qc.rzz(param, 0, 1)
qc.draw("mpl")
# Decomposition of an RZZ(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)
Для робочих процесів, що потребують багатьох однокубітних обертань або двокубітних обертань (наприклад, у варіаційному ансатці або при моделюванні часової еволюції квантових систем), це обмеження призводить до швидкого зростання глибини схеми. Однак дробові гейти знімають цю вимогу, оскільки одно- і двокубітні обертання виконуються безпосередньо, що породжує більш ефективну (а отже, менш схильну до похибок) квантову схему.
Коли не варто використовувати дробові гейти
Важливо зазначити, що дробові гейти є експериментальною функцією, і поведінка прапорця use_fractional_gates може змінитися в майбутньому. Слідкуй за нотатками про випуски нових версій qiskit-ibm-runtime для отримання додаткової інформації. Також дивись документацію API для QiskitRuntimeService.backend, де описано use_fractional_gates.
Крім того, транспілятор Qiskit має обмежені можливості використання у своїх проходах оптимізації. Це вимагає більш ретельного підходу до створення та оптимізації схем, що містять ці інструкції.
Нарешті, використання дробових гейтів не підтримується для:
- Твірлінгу Паулі - однак, твірлінг вимірювань з TREX підтримується.
- Імовірнісного скасування похибок
- Екстраполяції нульового шуму (з використанням імовірнісного підсилення похибок)
Прочитай посібник із параметрів примітивів, щоб дізнатися більше про налаштування методів пом'якшення і придушення похибок для конкретного квантового завдання.
Які бекенди підтримують дробові гейти?
Не всі бекенди підтримують дробові гейти. Запусти service.backends(use_fractional_gates=True), щоб знайти ті, що підтримують. З виходом qiskit-ibm-runtime v0.48 ти також можеш запустити service.least_busy(fractional_gates=True), щоб знайти найменш завантажений бекенд, який підтримує дробові гейти. Фейковий бекенд підтримує дробові гейти, лише якщо відповідний "реальний" бекенд їх підтримує.
Зверни увагу, що фейкові бекенди не підтримують дробові гейти за замовчуванням, оскільки дробові гейти вимкнено за замовчуванням. Щоб увімкнути дробові гейти на фейковому бекенді, який їх підтримує, онови його конфігурацію.
Example:
service = QiskitRuntimeService()
fake_backend = FakeBoston()
fake_backend.refresh(service=service, use_fractional_gates=True)
Наступні кроки
- Щоб дізнатися більше про транспіляцію, переглянь сторінку введення в транспіляцію.
- Прочитай про написання власного проходу транспілятора.
- Дізнайся, як налаштувати пом'якшення похибок.