동적 분리용 패스 관리자 생성
이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다. 다음 버전 이상을 사용하는 것이 좋습니다.
qiskit[all]~=2.5.2 qiskit-ibm-runtime~=0.47.0
이 페이지는 동적 디커플링이라는 오류 억제 기법을 추가하기 위해 PadDynamicalDecoupling 패스를 사용하여 동적 디커플링이라는 오류 억제 기술을 회로에 추가하는 방법을 설명합니다.
동적 디커플링은 유휴 큐비트에 펄스 시퀀스( 동적 디커플링 시퀀스라고 함)를 추가하여 블로흐 구체 주위를 뒤집어 노이즈 채널의 효과를 상쇄하여 디코히어런스를 억제하는 방식으로 작동합니다. 이러한 펄스 시퀀스는 핵 자기 공명에서 사용되는 리포커싱 펄스와 유사합니다. 자세한 설명은 양자 엔지니어를 위한 초전도 큐비트 가이드를 참조하세요.
PadDynamicalDecoupling 패스는 예약된 회로에서만 작동하고 대상의 기본 게이트가 아닌 게이트를 포함하므로, 반드시 ALAPScheduleAnalysis 및 BasisTranslator 패스도 필요합니다.
에서 정보를 target backend 가져오고, 작업 이름을 로 저장하십시오 basis_gates . 동적 디커플링에 사용되는 게이트에 대한 타이밍 정보를 추가하기 위해 를 target 수정해야 하기 때문입니다.
이 예제에서는 의 모의 FakeSherbrooke``qiskit_ibm_runtime 백엔드를 사용하지만, Qiskit과 호환되는 실제 또는 모의 백엔드라면 어떤 것이든 사용해 볼 수 있습니다. 결과는 다를 수 있습니다.
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
backend = FakeSherbrooke()
target = backend.target
basis_gates = list(target.operation_names)예를 들어 efficient_su2 회로를 만듭니다. 먼저, 회로를 트랜스파일하고 스케줄링한 후 동적 디커플링 펄스를 추가해야 하므로 회로를 백엔드로 트랜스파일합니다. 동적 디커플링은 양자 회로에 유휴 시간이 많을 때, 즉 다른 큐비트가 활성화되어 있는 동안 사용되지 않는 큐비트가 있을 때 가장 잘 작동하는 경우가 많습니다. 이 회로에서는 두 개의 큐비트 ecr 게이트가 순차적으로 적용되기 때문입니다.
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.circuit.library import efficient_su2
qc = efficient_su2(12, entanglement="circular", reps=1)
pm = generate_preset_pass_manager(1, target=target, seed_transpiler=12345)
qc_t = pm.run(qc)
qc_t.draw("mpl", fold=-1, idle_wires=False)Output:
동적 디커플링 시퀀스는 아이덴티티를 구성하는 일련의 게이트로, 시간적으로 일정한 간격을 두고 있습니다. 예를 들어, 4개의 게이트로 구성된 XY4 이라는 간단한 시퀀스를 생성하는 것으로 시작하세요.
from qiskit.circuit.library import XGate, YGate
X = XGate()
Y = YGate()
dd_sequence = [X, Y, X, Y]동적 분리 시퀀스의 규칙적인 타이밍 때문에, 는 기본 게이트가 아닌 반면 는 XGate 기본 게이트이므로, 에 target 대한 정보를 에 YGate 추가해야 합니다. 우리는 선험적으로 가 와 동일한 지속 YGate 시간과 XGate오차를 가짐을 알고 있으므로, target 에서 해당 속성들을 추출하여 YGate 객체들에 다시 적용하면 됩니다. 이것이 또한 가 별도로 basis_gates 저장된 이유이기도 합니다. 비록 의 실제 기본 ibm_fez게이트는 아니지만, YGate 명령어를 target 에 추가하고 있기 때문입니다.
from qiskit.transpiler import InstructionProperties
y_gate_properties = {}
for qubit in range(target.num_qubits):
y_gate_properties.update(
{
(qubit,): InstructionProperties(
duration=target["x"][(qubit,)].duration,
error=target["x"][(qubit,)].error,
)
}
)
target.add_instruction(YGate(), y_gate_properties)efficient_su2 같은 앤사츠 회로는 매개변수화되어 있으므로 백엔드로 전송되기 전에 바인딩된 값이 있어야 합니다. 여기에서 임의의 매개 변수를 할당합니다.
import numpy as np
rng = np.random.default_rng(1234)
qc_t.assign_parameters(
rng.uniform(-np.pi, np.pi, qc_t.num_parameters), inplace=True
)다음으로 사용자 지정 패스를 실행합니다. PassManager 를 ALAPScheduleAnalysis 및 PadDynamicalDecoupling 로 인스턴스화합니다. 규칙적인 간격의 동적 디커플링 시퀀스를 추가하기 전에 ALAPScheduleAnalysis 을 먼저 실행하여 양자 회로에 대한 타이밍 정보를 추가합니다. 이 패스는 .run() 를 사용하여 회로에서 실행됩니다.
from qiskit.transpiler import PassManager
from qiskit.transpiler.passes.scheduling import (
ALAPScheduleAnalysis,
PadDynamicalDecoupling,
)
dd_pm = PassManager(
[
ALAPScheduleAnalysis(target=target),
PadDynamicalDecoupling(target=target, dd_sequence=dd_sequence),
]
)
qc_dd = dd_pm.run(qc_t)시각화 도구를 사용하여 회로의 timeline_drawer 타이밍을 확인하고, 회로 내에 균일한 간격으로 배열된 XGate 객체와 YGate 객체의 시퀀스가 나타나는지 확인하십시오.
from qiskit.visualization import timeline_drawer
timeline_drawer(qc_dd, idle_wires=False, target=target)Output:
마지막으로 YGate 는 백엔드의 실제 기준 게이트가 아니므로 BasisTranslator 패스를 수동으로 적용하세요(기본 패스는 아니지만 스케줄링 전에 실행되므로 다시 적용해야 합니다). 세션 등가 라이브러리는 트랜스파일러가 인자로 지정된 대로 회로를 기저 게이트로 분해할 수 있도록 하는 회로 등가 라이브러리입니다.
from qiskit.circuit.equivalence_library import (
SessionEquivalenceLibrary as sel,
)
from qiskit.transpiler.passes import BasisTranslator
qc_dd = BasisTranslator(sel, basis_gates)(qc_dd)
qc_dd.draw("mpl", fold=-1, idle_wires=False)Output:
이제 회로에서 YGate 객체가 사라졌으며, 게이트 Delay 형태의 명시적 타이밍 정보가 존재합니다. 동적 디커플링이 적용된 이 트랜스파일된 회로는 이제 백엔드로 전송할 준비가 되었습니다.
다음 단계
- 직접 패스를 작성하는 대신
generate_preset_passmanager함수를 사용하는 방법을 알아보려면 번역 기본 설정 및 구성 옵션 항목부터 시작하세요. - Compare 트랜스파일러 설정 가이드를 시도해 보세요.
- Transpile API 문서를 참조하십시오.