주 콘텐츠로 건너뛰기

분수 게이트

패키지 버전

이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다. 이 버전 이상을 사용하길 권장합니다.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

이 페이지는 IBM Quantum® QPU 제품군에서 새롭게 지원되는 두 가지 Gate 유형을 소개합니다. 이 분수(fractional) Gate는 다음 형태로 Heron QPU에서 지원됩니다:

  • RZZ(θ)R_{ZZ}(\theta) (0<θπ/20 \lt \theta \leq \pi/2 범위)
  • RX(θ)R_X(\theta) (임의의 θ\theta)

이 페이지에서는 분수 Gate를 구현함으로써 워크플로의 효율성을 향상시킬 수 있는 사용 사례와 IBM Quantum QPU에서 이 Gate를 사용하는 방법을 설명합니다.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime

분수 게이트 사용 방법

내부적으로 이 분수 Gate는 임의의 각도에 대해 RZZ(θ)R_{ZZ}(\theta)RX(θ)R_X(\theta) 회전을 직접 실행하는 방식으로 동작합니다. RX(θ)R_X(\theta) Gate를 사용하면 임의의 각도에 대한 단일 Qubit 회전의 지속 시간과 오류를 최대 두 배까지 줄일 수 있습니다. RZZ(θ)R_{ZZ}(\theta) Gate 회전을 직접 실행하면 여러 CZGate 객체로의 분해가 필요 없어지므로, Circuit의 지속 시간과 오류도 마찬가지로 줄어듭니다. 이는 양자 시스템의 동역학을 시뮬레이션하거나 많은 파라미터를 가진 변분 ansatz를 사용할 때처럼, 단일 및 2-Qubit 회전이 많이 포함된 Circuit에 특히 유용합니다.

이러한 유형의 Gate는 QuantumCircuit이 보유할 수 있는 표준 Gate 라이브러리에 포함되어 있지만, 특정 IBM Quantum QPU에서만 사용할 수 있으며, use_fractional_gates 플래그를 True로 설정하여 로드해야 합니다(아래 참고). 이 플래그를 설정하면 분수 Gate가 Transpiler를 위한 Backend의 Target에 포함됩니다.

service = QiskitRuntimeService()
backend = service.backend('ibm_torino', use_fractional_gates=True)

이 코드 예제는 분수 Gate를 사용하여 이징(Ising) 체인의 동역학을 시뮬레이션하는 워크플로 컨텍스트에서 분수 Gate를 사용하는 방법을 보여줍니다. 그런 다음 Circuit 지속 시간을 분수 Gate를 사용하지 않는 Backend와 비교합니다.

보고된 오류율에 대한 참고 사항

분수 Gate가 활성화된 Backend의 Target에 보고된 오류 값은 비분수 Gate의 상대 항목을 복사한 것에 불과합니다(동일하지 않을 수 있습니다). 이는 분수 Gate에 대한 오류율 보고가 아직 지원되지 않기 때문입니다.

그러나 분수 Gate와 비분수 Gate의 게이트 시간은 동일하므로, 특히 Circuit의 주요 오류 원인이 이완(relaxation)에 의한 경우, 오류율이 비슷하다고 합리적으로 가정할 수 있습니다.

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")

이전 코드 셀의 출력

분수 Gate가 활성화된 Backend와 비활성화된 Backend, 두 가지 Backend 객체를 지정한 후 둘 다 트랜스파일합니다.

service = QiskitRuntimeService()
backend_fractional = service.backend("ibm_torino", use_fractional_gates=True)
backend_conventional = service.backend(
"ibm_torino", 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)

두 가지 Gate 유형을 사용한 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-Qubit RZZ(θ)R_{ZZ}(\theta) Gate의 경우, IBM Quantum 하드웨어에서는 00π/2\pi/2 사이의 각도만 실행할 수 있습니다. Circuit에 이 범위를 벗어난 각도를 가진 RZZ(θ)R_{ZZ}(\theta) Gate가 포함되어 있으면, 표준 트랜스파일 파이프라인이 일반적으로 적절한 Circuit 변환(FoldRzzAngle 패스를 통해)으로 이를 수정합니다. 그러나 하나 이상의 Parameter를 포함하는 RZZ(θ)R_{ZZ}(\theta) Gate의 경우, Transpiler는 이 파라미터들이 런타임에 이 범위 내의 각도로 할당된다고 가정합니다. Qiskit Runtime에 제출된 PUB에 지정된 파라미터 값이 이 범위를 벗어나면 작업이 실패합니다.

분수 게이트를 사용하는 경우

역사적으로 IBM Quantum QPU에서 사용 가능한 기본 Gate는 CZ, X, RZ, SX, **ID**였으며, 이는 π/2\pi / 2의 배수가 아닌 단일 및 2-Qubit 회전이 있는 Circuit을 효율적으로 표현할 수 없었습니다. 예를 들어, RX(θ)R_X(\theta) Gate는 트랜스파일 시 일련의 RZRZX\sqrt{X} Gate로 분해되어야 하므로, 유한 지속 시간을 가진 Gate가 하나가 아닌 두 개인 Circuit이 만들어집니다.

마찬가지로, RZZ(θ)R_{ZZ}(\theta) Gate와 같은 2-Qubit 회전을 트랜스파일할 때, 분해에는 두 개의 CZ Gate와 여러 단일 Qubit Gate가 필요하여 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.backend("ibm_torino")
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.backend("ibm_torino")
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)

이전 코드 셀의 출력

많은 단일 Qubit RX(θ)R_X(\theta) 또는 2-Qubit 회전이 필요한 워크플로(예: 변분 ansatz 또는 양자 시스템의 시간 발전 시뮬레이션)의 경우, 이 제약으로 인해 Circuit 깊이가 빠르게 증가합니다. 그러나 분수 Gate는 단일 및 2-Qubit 회전을 직접 실행하므로 이 요구 사항을 제거하여 보다 효율적인(따라서 오류가 억제된) 양자 Circuit을 만들어냅니다.

분수 게이트를 사용하지 않아야 하는 경우

분수 Gate는 실험적 기능이며 use_fractional_gates 플래그의 동작은 향후 변경될 수 있다는 점에 유의하는 것이 중요합니다. Qiskit Runtime 새 버전의 릴리스 노트에서 자세한 정보를 확인하세요. use_fractional_gates를 설명하는 QiskitRuntimeService.backend의 API 참조 문서도 참고하세요.

또한, Qiskit Transpiler는 최적화 패스에서 RZZ(θ)R_{ZZ}(\theta)를 사용하는 능력이 제한되어 있습니다. 따라서 이 명령어를 포함하는 Circuit을 구성하고 최적화할 때 더 세심한 주의가 필요합니다.

마지막으로, 분수 Gate 사용은 다음에서 지원되지 않습니다:

특정 양자 워크로드에 대한 오류 완화 및 억제 기술 사용자 정의에 대해 자세히 알아보려면 기본 옵션 가이드를 읽어보세요.

다음 단계

권장 사항