Skip to main content
IBM Quantum Platform

통과 관리자를 사용한 트랜스파일링

  • 이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다. 다음 버전 이상을 사용하는 것이 좋습니다.

    qiskit[all]~=2.5.2
    qiskit-ibm-runtime~=0.47.0
    

회로를 트랜스파일하는 권장 방법은 스테이지 패스 매니저를 생성한 다음 회로를 입력으로 하여 run 메서드를 실행하는 것입니다. 이 페이지에서는 이러한 방식으로 양자 회로를 트랜스파일하는 방법을 설명합니다.


(단계별) 패스 관리란 무엇인가요?

키스킷 SDK의 맥락에서 변환은 입력 회로를 양자 디바이스에서 실행하기에 적합한 형태로 변환하는 과정을 의미합니다. 트랜스파일링은 일반적으로 트랜스파일러 패스라고 하는 일련의 단계로 이루어집니다. 회로는 각 트랜스파일러 패스에 의해 순차적으로 처리되며, 한 패스의 출력은 다음 패스의 입력이 됩니다. 예를 들어, 한 패스가 회로를 통과하여 연속된 모든 단일 큐비트 게이트 시퀀스를 병합한 다음 다음 패스에서 이러한 게이트를 대상 디바이스의 기본 집합으로 합성할 수 있습니다. 키스킷에 포함된 트랜스파일러 패스는 트랜스파일러의 qiskit.transpiler.passes 모듈에 있다.

패스 매니저는 트랜스파일러 패스 목록을 저장하고 회로에서 이를 실행할 수 있는 객체입니다. 를 초기화하여 패스 매니저를 생성하고 PassManager 를 트랜스파일러 패스 목록으로 초기화하여 패스 관리자를 만듭니다. 회로에서 트랜스필레이션을 실행하려면 회로를 입력으로 사용하여 run 메서드를 호출합니다.

스테이지 패스 매니저는 일반 패스 매니저보다 더 높은 수준의 추상화를 나타내는 특별한 종류의 패스 매니저입니다. 일반 패스 매니저는 여러 개의 트랜스파일러 패스로 구성되는 반면, 스테이지드 패스 매니저는 여러 개의 패스 매니저로 구성됩니다. 트랜스파일은 일반적으로 트랜스파일러 단계에서 설명한 대로 개별 단계에서 이루어지며 각 단계는 패스 매니저로 표현되므로 이는 유용한 추상화입니다. 스테이지 패스 관리자는 StagedPassManager 클래스로 표현됩니다. 이 페이지의 나머지 부분에서는 패스 관리자를 만들고 (단계별) 사용자 지정하는 방법에 대해 설명합니다.


사전 설정된 단계별 패스 관리자를 생성합니다

적절한 기본값이 설정된 사전 정의된 스테이지드 패스 관리자를 생성하려면 함수를 generate_preset_pass_manager 사용하십시오.

Note

이 예제에서는 의 모의 FakeSherbrooke``qiskit_ibm_runtime 백엔드를 사용하지만, Qiskit과 호환되는 실제 또는 모의 백엔드라면 어떤 것이든 사용해 볼 수 있습니다. 결과는 다를 수 있습니다.

from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke

backend = FakeSherbrooke()
pass_manager = generate_preset_pass_manager(
    optimization_level=3, backend=backend
)

패스 관리자를 사용하여 회로 또는 회로 목록을 트랜스파일하려면 run 메서드로 회로 또는 회로 목록을 전달합니다. 하다마드와 인접한 두 개의 CX 게이트로 구성된 2큐비트 회로에서 이 작업을 수행해 보겠습니다:

from qiskit import QuantumRegister, QuantumCircuit

# Create a circuit
qubits = QuantumRegister(2, name="q")
circuit = QuantumCircuit(qubits)
a, b = qubits
circuit.h(a)
circuit.cx(a, b)
circuit.cx(b, a)

# Transpile it by calling the run method of the pass manager
transpiled = pass_manager.run(circuit)

# Draw it, excluding idle qubits from the diagram
transpiled.draw("mpl", idle_wires=False)

Output:

Output of the previous code cell

generate_preset_pass_manager 함수에 사용할 수 있는 인수에 대한 설명은 번역 기본값 및 구성 옵션을 참조하세요. generate_preset_pass_manager 의 인수는 의 인수가 transpile 함수의 인자와 일치합니다.

사전 설정된 패스 매니저가 요구 사항을 충족하지 않는 경우 (단계별) 패스 매니저 또는 트랜스필레이션 패스를 생성하여 트랜스필레이션을 사용자 지정하세요. 이 페이지의 나머지 부분에서는 패스 관리자를 만드는 방법에 대해 설명합니다. 트랜스파일링 패스를 만드는 방법에 대한 지침은 나만의 트랜스파일러 패스 작성을 참조하세요.


나만의 패스 관리자를 만들어 보세요

모듈에는 qiskit.transpiler.passes 모듈에는 패스 관리자를 만드는 데 사용할 수 있는 많은 트랜스파일러 패스가 포함되어 있습니다. 패스 관리자를 만들려면 PassManager 에 패스 목록을 초기화합니다. 예를 들어, 다음 코드는 인접한 2-큐비트 게이트를 병합한 다음 합성하는 트랜스파일러 패스를 생성하여 RyR_y, RzR_zRxxR_{xx} 게이트로 합성합니다.

from qiskit.transpiler import PassManager
from qiskit.transpiler.passes import (
    Collect2qBlocks,
    ConsolidateBlocks,
    UnitarySynthesis,
)

basis_gates = ["rx", "ry", "rxx"]
translate = PassManager(
    [
        Collect2qBlocks(),
        ConsolidateBlocks(basis_gates=basis_gates),
        UnitarySynthesis(basis_gates),
    ]
)

이 패스 매니저가 실제로 작동하는 모습을 보려면, 하다마드와 인접한 두 개의 CX 게이트로 구성된 2쿼비트 회로에서 테스트해 보세요:

from qiskit import QuantumRegister, QuantumCircuit

qubits = QuantumRegister(2, name="q")
circuit = QuantumCircuit(qubits)

a, b = qubits
circuit.h(a)
circuit.cx(a, b)
circuit.cx(b, a)

circuit.draw("mpl")

Output:

Output of the previous code cell

회로에서 패스 관리자를 실행하려면 run 메서드를 호출합니다.

translated = translate.run(circuit)
translated.draw("mpl")

Output:

Output of the previous code cell

동적 디커플링이라는 오류 억제 기술을 구현하기 위해 패스 관리자를 만드는 방법을 보여주는 고급 예제는 동적 디커플링을 위한 패스 관리자 만들기를 참조하세요.


단계별 패스 관리자 생성

StagedPassManager 은 개별 단계로 구성된 패스 관리자로, 각 단계는 PassManager 인스턴스에 의해 정의됩니다. 원하는 단계를 지정하여 StagedPassManager 을 만들 수 있습니다. 예를 들어 다음 코드는 inittranslation 두 단계로 구성된 스테이지 패스 관리자를 생성합니다. translation 단계는 이전에 생성한 패스 관리자에 의해 정의됩니다.

from qiskit.transpiler import PassManager, StagedPassManager
from qiskit.transpiler.passes import UnitarySynthesis, Unroll3qOrMore

basis_gates = ["rx", "ry", "rxx"]
init = PassManager(
    [UnitarySynthesis(basis_gates, min_qubits=3), Unroll3qOrMore()]
)
staged_pm = StagedPassManager(
    stages=["init", "translation"], init=init, translation=translate
)

스테이지 패스 매니저에 넣을 수 있는 스테이지 수에는 제한이 없습니다.

스테이지 패스 관리자를 만드는 또 다른 유용한 방법은 미리 설정된 스테이지 패스 관리자로 시작한 다음 일부 스테이지를 교체하는 것입니다. 예를 들어 다음 코드는 최적화 수준 3의 사전 설정 패스 관리자를 생성한 다음 사용자 지정 pre_layout 단계를 지정합니다.

import numpy as np
from qiskit.circuit.library import HGate, PhaseGate, RXGate, TdgGate, TGate
from qiskit.transpiler.passes import InverseCancellation

pass_manager = generate_preset_pass_manager(3, backend)
inverse_gate_list = [
    HGate(),
    (RXGate(np.pi / 4), RXGate(-np.pi / 4)),
    (PhaseGate(np.pi / 4), PhaseGate(-np.pi / 4)),
    (TGate(), TdgGate()),
]
logical_opt = PassManager(
    [
        InverseCancellation(inverse_gate_list),
    ]
)

# Add pre-layout stage to run extra logical optimization
pass_manager.pre_layout = logical_opt

스테이지 생성기 기능은 커스텀 패스 매니저를 구성하는 데 유용할 수 있습니다. 많은 패스 관리자에서 사용되는 공통 기능을 제공하는 스테이지를 생성합니다. 예를 들어 generate_embed_passmanager 를 사용하여 스테이지를 생성할 수 있습니다 를 사용하여 선택한 이니셜 Layout 을 레이아웃 패스에서 지정된 대상 디바이스에 '임베드'할 수 있습니다.


다음 단계

권장사항
이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.