Skip to main content
IBM Quantum Platform

트랜스파일러용 양자 컴퓨터를 표현한다

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

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

추상 회로를 특정 QPU(양자 처리 장치)에서 실행할 수 있는 ISA 회로로 변환하려면 트랜스파일러에 QPU에 대한 특정 정보가 필요합니다. 이 정보는 작업을 제출하려는 BackendV2 (또는 레거시 BackendV1) 개체와 백엔드의 Target 속성 두 곳에서 찾을 수 있습니다.

  • 이 컨테이너에는 장치의 지원되는 명령어 집합, 큐비트 연결성 Target , 펄스 또는 타이밍 정보 등 모든 관련 제약 조건이 포함됩니다.
  • 기본적으로 TargetBackend 보유하고 있으며, InstructionScheduleMap와 같은 추가 정보를 포함하고, 양자 회로 작업 제출을 위한 인터페이스를 제공합니다.

특정 사용 사례가 있거나 이 정보가 트랜스파일러가 보다 최적화된 회로를 생성하는 데 도움이 될 것으로 판단되는 경우 등 트랜스파일러가 사용할 정보를 명시적으로 제공할 수도 있습니다.

트랜스파일러가 특정 하드웨어에 가장 적합한 회로를 생성하는 정밀도는 Target 또는 Backend 에서 제약 조건에 대한 정보를 얼마나 많이 보유하고 있는지에 따라 달라집니다.

Note

기본 트랜스필레이션 알고리즘의 대부분은 확률적이기 때문에 더 나은 회로를 찾을 수 있다는 보장은 없습니다.

이 페이지에서는 QPU 정보를 트랜스파일러로 전달하는 몇 가지 예시를 보여줍니다.


기본 구성

트랜스파일러의 가장 간단한 사용법은 Backend 또는 Target 을 통해 모든 QPU 정보를 제공하는 것입니다. 트랜스파일러의 작동 방식을 더 잘 이해하려면 다음과 같이 회로를 구성하고 다양한 정보로 트랜스파일해 보세요.

필요한 라이브러리를 가져오고 QPU를 인스턴스화합니다: 추상 회로를 특정 프로세서에서 실행할 수 있는 ISA 회로로 변환하려면 트랜스파일러에 프로세서에 대한 특정 정보가 필요합니다. 일반적으로 이 정보는 Backend 또는 Target 에 저장되며 추가 정보는 필요하지 않습니다. 그러나 특정 사용 사례가 있거나 이 정보가 트랜스파일러가 보다 최적화된 회로를 생성하는 데 도움이 될 것으로 판단되는 경우 등 트랜스파일러가 사용할 정보를 명시적으로 제공할 수도 있습니다.

이 주제에서는 트랜스파일러에 정보를 전달하는 몇 가지 예시를 보여줍니다.

Note

이 예제들은 모의 qiskit_ibm_runtimeFakeSherbrooke 백엔드의 타깃을 사용합니다. 하지만 Qiskit과 호환되는 실제 또는 시뮬레이션 백엔드라면 어떤 것이든 시도해 볼 수 있습니다. 결과는 다를 수 있습니다.

from qiskit_ibm_runtime.fake_provider import FakeSherbrooke

backend = FakeSherbrooke()
target = backend.target

이 예제 회로는 키스킷의 회로 라이브러리에서 efficient_su2 인스턴스를 사용합니다.

from qiskit.circuit.library import efficient_su2

qc = efficient_su2(12, entanglement="circular", reps=1)

qc.draw("mpl")

Output:

Output of the previous code cell

이 예에서는 기본 설정을 사용하여 backendtarget 로 트랜스파일하여 백엔드에서 실행되는 회로로 변환하는 데 필요한 모든 정보를 제공합니다.

from qiskit.transpiler import generate_preset_pass_manager

pass_manager = generate_preset_pass_manager(
    optimization_level=1, target=target, seed_transpiler=12345
)
qc_t_target = pass_manager.run(qc)
qc_t_target.draw("mpl", idle_wires=False, fold=-1)

Output:

Output of the previous code cell

이 예시는 본 주제의 후속 섹션에서 최적의 회로 구축을 위해 트랜스파일러에 전달해야 할 핵심 정보가 커플링 맵과 지원되는 명령어 세트임을 설명하기 위해 사용됩니다. QPU는 일반적으로 전달되지 않은 다른 정보(예: 타이밍 및 스케줄링)에 대해 기본 설정을 선택할 수 있습니다.


결합 지도

커플링 맵은 어떤 큐비트가 연결되어 있고, 따라서 그 사이에 2큐비트 게이트가 있는지를 보여주는 그래프입니다. 때때로 이 그래프는 방향성이 있어 2쿼비트 게이트가 한 방향으로만 갈 수 있는 경우도 있습니다. 그러나 트랜스파일러는 단일 큐비트 게이트를 추가하여 언제든지 게이트의 방향을 뒤집을 수 있습니다. 추상적인 양자 회로는 연결성이 제한되어 있더라도 양자 정보를 이동시키는 스왑 게이트를 도입하여 항상 이 그래프에 표현할 수 있습니다.

추상 회로의 큐비트를 가상 큐비트, 커플링 맵의 큐비트를 물리적 큐 비트라고 합니다. 트랜스파일러는 가상 큐비트와 물리적 큐비트 간의 매핑을 제공합니다. 트랜스필레이션의 첫 번째 단계 중 하나인 레이아웃 단계에서는 이 매핑을 수행합니다.

Note

라우팅 단계는 기본적으로 실제 큐비트를 선택하는 레이아웃 단계와 얽혀 있지만, 이 주제에서는 단순화를 위해 별도의 단계로 취급합니다. 라우팅과 레이아웃의 조합을 쿼비트 매핑이라고 합니다. 트랜스파일러 단계 항목에서 이러한 단계에 대해 자세히 알아보세요.

coupling_map 키워드 인수를 전달하면 트랜스파일러에 미치는 영향을 확인할 수 있습니다:

coupling_map = target.build_coupling_map()

pass_manager = generate_preset_pass_manager(
    optimization_level=0, coupling_map=coupling_map, seed_transpiler=12345
)
qc_t_cm_lv0 = pass_manager.run(qc)
qc_t_cm_lv0.draw("mpl", idle_wires=False, fold=-1)

Output:

Output of the previous code cell

위와 같이 여러 개의 SWAP 게이트가 삽입되어(각각 3개의 CX 게이트로 구성됨) 현재 장치에서 많은 오류가 발생합니다. 실제 큐비트 토폴로지에서 어떤 큐비트가 선택되었는지 확인하려면 키스킷 시각화에서 plot_circuit_layout 을 사용하세요:

from qiskit.visualization import plot_circuit_layout

plot_circuit_layout(qc_t_cm_lv0, backend, view="physical")

Output:

Output of the previous code cell

이것은 가상 큐비트 0-11이 물리적 큐비트 0-11의 라인에 사소하게 매핑되었음을 보여줍니다. 라우팅이 필요한 경우 VF2Layout 을 사용하는 기본값(optimization_level=1)으로 돌아가 보겠습니다.

pass_manager = generate_preset_pass_manager(
    optimization_level=1, coupling_map=coupling_map, seed_transpiler=12345
)
qc_t_cm_lv1 = pass_manager.run(qc)
qc_t_cm_lv1.draw("mpl", idle_wires=False, fold=-1)

Output:

Output of the previous code cell

이제 스왑 게이트가 삽입되지 않으며 target 클래스를 사용할 때 선택된 물리적 큐비트는 동일합니다.

from qiskit.visualization import plot_circuit_layout

plot_circuit_layout(qc_t_cm_lv1, backend, view="physical")

Output:

Output of the previous code cell

이제 레이아웃이 고리 모양으로 완성되었습니다. 이 레이아웃은 회로의 연결성을 존중하기 때문에 스왑 게이트가 없어 실행에 훨씬 유리한 회로를 제공합니다.


지원되는 지침

모든 양자 컴퓨터는 제한된 명령어 집합을 지원한다. 회로의 모든 게이트는 이 집합의 원소들로 변환되어야 한다. 이 게이트 집합은 단일 큐비트 및 이중 큐비트 게이트로 구성되어야 하며, 이를 통해 보편적 게이트 집합을 제공해야 합니다. 즉, 모든 양자 연산이 해당 게이트들로 분해될 수 있어야 합니다. 이는 BasisTranslator 에 의해 수행되며, 이 정보를 제공하기 위해 basis_gates 트랜스파일러에 키워드 인자로 지정할 수 있습니다.

basis_gates = list(target.operation_names)
print(basis_gates)

Output:

['for_loop', 'sx', 'switch_case', 'id', 'if_else', 'delay', 'rz', 'measure', 'reset', 'ecr', 'x']

의 기본 단일 큐비트 FakeSherbrooke 게이트는, x, 및 rz``sx이며, 기본 2큐비트 게이트는 (에코 크로스 ecr 공명)입니다. CX 게이트는 ecr 게이트로 구성되므로, 일부 QPU에서는 ecr 가 2-큐비트 기본 게이트로 지정되는 반면, 다른 QPU에서는 cx 가 기본값으로 설정되어 있습니다. 게이트는 ecr cx 게이트의 얽힘을 일으키는 부분입니다. 제어 게이트 외에도 및 measurement delay 명령어가 있습니다.

Note

QPU에는 기본 게이트가 있지만, 명령어를 제공하거나 펄스 게이트를 추가하는 한 원하는 게이트를 선택할 수 있습니다( 트랜스파일러 패스 생성 참조) 기본 베이스 게이트는 QPU에서 보정이 완료된 게이트이므로 추가적인 명령/펄스 게이트를 제공할 필요가 없습니다. 예를 들어, 일부 QPU에서는 기본 2큐비트 게이트가 이고 cx , 다른 ecr QPU에서는 입니다. 자세한 내용은 가능한 네이티브 게이트 및 연산 목록을 참조하십시오.

pass_manager = generate_preset_pass_manager(
    optimization_level=1,
    coupling_map=coupling_map,
    basis_gates=basis_gates,
    seed_transpiler=12345,
)
qc_t_cm_bg = pass_manager.run(qc)
qc_t_cm_bg.draw("mpl", idle_wires=False, fold=-1)

Output:

Output of the previous code cell

해당 CXGate 객체들은 게이트와 단일 ecr 큐비트 기반 게이트로 분해되었음을 유의하십시오.


장치 오류율

Target 클래스에는 디바이스에서의 작업 오류율에 대한 정보가 포함될 수 있습니다. 예를 들어, 다음 코드는 큐비트 1과 0 사이의 에코 교차 공명(ECR) 게이트에 대한 속성을 검색합니다(ECR 게이트는 방향성임을 참고하세요):

target["ecr"][(1, 0)]

Output:

InstructionProperties(duration=5.333333333333332e-07, error=0.007494257741828603)

출력에는 게이트의 지속 시간(초)과 오류율이 표시됩니다. 트랜스파일러에 오류 정보를 표시하려면 위에서 basis_gatescoupling_map 을 사용하여 대상 모델을 빌드하고 백엔드 FakeSherbrooke 의 오류 값으로 채우세요.

from qiskit.transpiler import Target
from qiskit.circuit.controlflow import IfElseOp, SwitchCaseOp, ForLoopOp

err_targ = Target.from_configuration(
    basis_gates=basis_gates,
    coupling_map=coupling_map,
    num_qubits=target.num_qubits,
    custom_name_mapping={
        "if_else": IfElseOp,
        "switch_case": SwitchCaseOp,
        "for_loop": ForLoopOp,
    },
)

for i, (op, qargs) in enumerate(target.instructions):
    if op.name in basis_gates:
        err_targ[op.name][qargs] = target.instruction_properties(i)

새 대상 err_targ 을 대상으로 트랜스파일합니다:

pass_manager = generate_preset_pass_manager(
    optimization_level=1, target=err_targ, seed_transpiler=12345
)
qc_t_cm_bg_et = pass_manager.run(qc)
qc_t_cm_bg_et.draw("mpl", idle_wires=False, fold=-1)

Output:

Output of the previous code cell

대상에 오류 정보가 포함되어 있기 때문에 VF2PostLayout 패스는 사용할 최적의 큐비트를 찾으려고 시도하며, 그 결과 원래 동일한 물리적 큐비트로 발견된 것과 동일한 회로가 생성됩니다.


다음 단계

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