フラクショナルゲート
パッケージバージョン
このページのコードは、以下の要件を使用して開発されました。 これらのバージョン以降を使用することをお勧めします。
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
このページでは、IBM Quantum® QPUフリートで新たにサポートされた2種類のゲートタイプを紹介します。これらのフラクショナルゲートは、Heron QPUで次の形式でサポートされています:
- (の範囲)
- (任意の)
このページでは、フラクショナルゲートの実装がワークフローの効率を向上させるユースケースと、IBM Quantum QPUでこれらのゲートを使用する方法について説明します。
# 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")
フラクショナルゲートの使用方法
内部的には、これらのフラクショナルゲートは任意の角度に対しておよび回転を直接実行することで動作します。ゲートを使用すると、任意角度の1量子ビット回転の時間とエラーを最大で半分に削減できます。ゲートの回転を直接実行することで、複数のCZGateオブジェクトへの分解を避け、同様にCircuitの時間とエラーを削減します。これは、量子システムのダイナミクスをシミュレートする場合や、多くのパラメータを持つ変分アンザッツを使用する場合など、多くの1量子ビットおよび2量子ビット回転を含むCircuitに特に有効です。
これらのゲートタイプはQuantumCircuitが持てる標準ゲートのライブラリに含まれていますが、特定のIBM Quantum QPUでのみ使用でき、use_fractional_gatesフラグをTrueに設定して読み込む必要があります(以下を参照)。このフラグにより、フラクショナルゲートがTranspiler用のBackendのTargetに含まれるようになります。
service = QiskitRuntimeService()
backend = service.backend('ibm_torino', use_fractional_gates=True)
このコード例では、フラクショナルゲートを使用してイジング鎖のダイナミクスをシミュレートするワークフローの文脈でフラクショナルゲートを使用する方法を示します。その後、Circuit時間をフラクショナルゲートを使用しないBackendと比較します。
フラクショナルゲートが有効なBackendのTargetで報告されるエラー値は、非フラクショナルゲートに対応するもののコピーにすぎません(同一でない場合があります)。これは、フラクショナルゲートのエラーレートの報告がまだサポートされていないためです。
ただし、フラクショナルゲートと非フラクショナルゲートのゲート時間は同じであるため、エラーレートは同程度であると考えるのが妥当です――特にCircuit内のエラーの主要な要因が緩和によるものである場合はなおさらです。
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")
フラクショナルゲートを有効にしたものと無効にしたものの2つのBackendオブジェクトを指定し、両方をトランスパイルします。
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)
2種類のゲートを使用した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(),
)
角度の制約
2量子ビットのゲートについては、IBM Quantum ハードウェア上で実行できる角度はからの間のみです。Circuit にこの範囲外の角度を持つゲートが含まれている場合、標準のトランスパイルパイプラインは通常、適切なCircuit 変換(FoldRzzAngleパスを通じて)でこれを修正します。ただし、1つ以上のParameterを含むゲートについては、Transpiler はこれらのパラメータが実行時にこの範囲内の角度に割り当てられると仮定します。IBM Quantum Compute Service への PUB に指定されたパラメータ値のいずれかがこの範囲外の場合、ジョブは失敗します。
フラクショナルゲートを使用する場面
歴史的に、IBM Quantum QPUで利用可能なBasis Gateは**CZ、X、RZ、SX、ID**であり、の倍数でない1量子ビットおよび2量子ビット回転を持つCircuitを効率的に表現できませんでした。例えば、ゲートはトランスパイル時に一連のゲートとゲートに分解する必要があり、1つではなく有限時間を持つ2つのゲートを含むCircuitが作成されます。
同様に、ゲートなどの2量子ビット回転がトランスパイルされる場合、分解には2つの**CZ**ゲートといくつかの1量子ビットゲートが必要となり、Circuit深度が増加します。これらの分解は以下のコードに示されています。
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)
多くの1量子ビットまたは2量子ビット回転を必要とするワークフロー(変分アンザッツや量子システムの時間発展をシミュレートする場合など)では、この制約によって Circuit 深度が急速に増大します。しかし、フラクショナルゲートはこの要件を取り除きます。なぜなら、1量子ビットおよび2量子ビット回転が直接実行され、より効率的な(つまりエラーが抑制された)量子 Circuit が作成されるからです。
フラクショナルゲートを使用すべきでない場面
フラクショナルゲートは実験的な機能であり、use_fractional_gatesフラグの動作は将来変更される可能性がある点に注意してください。詳細については、qiskit-ibm-runtime の新バージョンのリリースノートを参照してください。また、use_fractional_gates について説明しているQiskitRuntimeService.backendのAPIリファレンスドキュメントも参照してください。
また、QiskitのTranspilerには最適化パスでを使用する機能が限られています。そのため、これらの命令を含むCircuitの設計と最適化においてより注意が必要です。
最後に、フラクショナルゲートは以下の用途ではサポートされていません:
- Pauli ツワーリング - ただし、TREX による測定ツワーリングはサポートされています。
- 確率的エラーキャンセル
- ゼロノイズ外挿(確率的エラー増幅を使用)
特定の量子ワークロードに対するエラー緩和および抑制技術のカスタマイズについては、プリミティブオプションのガイドを読んでください。
どのBackendがフラクショナルゲートをサポートしていますか?
すべてのBackendがフラクショナルゲートをサポートしているわけではありません。サポートしているものを見つけるには、service.backends(use_fractional_gates=True)を実行してください。qiskit-ibm-runtime v0.48のリリースにより、フラクショナルゲートをサポートする最も空いているBackendを見つけるために、service.least_busy(fractional_gates=True)を実行することもできます。フェイクBackendは、関連する「実際の」Backendがそれらをサポートしている場合にのみ、フラクショナルゲートをサポートします。
フラクショナルゲートはデフォルトで無効になっているため、フェイクBackendはデフォルトではフラクショナルゲートをサポートしないことに注意してください。フラクショナルゲートをサポートするフェイクBackendでそれらを有効にするには、その設定を更新してください。
Example:
service = QiskitRuntimeService()
fake_backend = FakeBoston()
fake_backend.refresh(service=service, use_fractional_gates=True)
次のステップ
- トランスパイルの詳細については、トランスパイルの概要ページを参照してください。
- カスタム Transpiler パスの作成について読んでください。
- エラー緩和の設定方法を理解してください。