Skip to main content
IBM Quantum Platform

패스매니저

qiskit.passmanager


개요

Qiskit의 패스 매니저는 LLVM 컴파일러에서 영감을 받았습니다. 컴파일러 인프라는 역할을 ‘태스크’, ‘플로우 컨트롤러’, ‘패스 매니저’라는 세 가지 주요 구성 요소로 구분합니다.

컴파일 파이프라인은 일련의 Task 객체를 실행하며, 각 객체는 중간 표현(IR)을 입력으로 받아 작업을 수행한 후, 결과로 (이전과 다를 수도 있는) IR을 반환합니다. 어디 Task 인터페이스를 정의하며, 원자적 작업은 패스 이고, 이는 하위 클래스입니다. GenericPass 그리고 그 추상 개념을 구현합니다. run() 방법. 이 클래스는 사용자 정의 컴파일러 패스를 구현할 때 기본 클래스로 사용해야 하는 클래스입니다.

흐름 제어기는 일련의 작업에 대한 실행 모델을 제공합니다. 가장 간단한 흐름 제어기는 일련의 작업을 선형 순서대로 실행하는 것입니다 FlowControllerLinear. 보다 고급형 유량 제어기에는 루프나 조건부 실행 기능이 포함되어 있습니다. 예를 들어, 이러한 기능은 Qiskit의 사전 설정된 트랜스파일러 파이프라인에서 더 높은 최적화 수준을 달성하기 위해 사용되며, 이 경우 수렴 기준이 충족될 때까지 최적화가 수행됩니다.

패스 관리자는 필요한 분석 일정을 수립하고, 사용자가 작업 순서를 수정할 수 있도록 지원하는 등 작업 관리를 담당합니다. Qiskit은 이 모듈에서 두 개의 IR 일반용 패스 관리자를 제공하며, 의 DAGCircuit IR로 특화된 패스 관리자도 제공합니다 qiskit.transpiler. IR-일반 유형은 다음과 같습니다:

  • BasePassManager: 고정 IR을 갖춘 패스 관리자. 이 패스 관리자는 실행할 작업 집합을 수정할 수 있게 해주며, 을 통해 여러 입력에 대한 병렬 실행을 지원합니다 parallel_map(). 이 클래스는 입력 프로그램 표현을 내부 IR로 변환하는 기능과, 이를 출력 프로그램 형식으로 변환하는 기능을 추가로 지원합니다.

    는 ``에 의해 반환되는 것과 같이, Qiskit의 트랜스파일링을 DAGCircuit 위한 사전 설정된 패스 관리자의 기본 클래스입니다 BasePassManagergenerate_preset_pass_manager() . 여기서는 입력 및 출력 프로그램 QuantumCircuit 형식으로의 암시적 변환이 사용됩니다.

  • MultiStagePassManager: 각 단계에서 IR을 유지하거나 낮출 수 있는 단계별 패스 관리자. 스테이지는 또는 Task 그 반복 가능한 객체로 정의되며, 이는 또한 내부에서 그룹화될 수도 있습니다 BasePassManager. 각 단계는 현재 단계의 출력 IR이 다음 단계의 입력 IR과 일치하도록 구성되어야 하며, (현재로서는) 자동 변환 기능이 없습니다.

패스 관리자는 또한 모든 태스크를 거치며 컨텍스트 정보를 전달할 수 있는 PropertySet 인프라와, 내부 상태를 확인하기 위한 콜백 함수를 제공합니다. 는 자유 형식의 사전으로 PropertySet , 실행 중에 패스에 의해 채워지거나 읽힐 수 있으며, 플로우 컨트롤러가 이를 읽어 패스의 실행을 제어할 수도 있습니다. 이 속성 집합은 이동 가능하며, 실행 시 패스에서 다음 패스로 전달됩니다. 작업에는 속성 집합 외에도 데이터 WorkflowStatus 구조가 할당됩니다. 이 객체는 패스 관리자가 실행될 때 초기화되며, 기본 작업들에게 전달됩니다. 상태는 각 패스가 실행될 때마다 업데이트되며, 최적화 대상인 IR에 대한 정보를 포함하는 것과는 달리 파이프라인 상태(실행된 패스 PropertySet 수, 실패 상태 등)에 대한 정보를 포함합니다.

콜백은 다음 시그니처를 기대하는 GenericPass 인스턴스에 의해 호출됩니다:

def callback(
    *,
    task: Task[IR_IN, IR_OUT],
    passmanager_ir: IR_OUT,
    property_set: PropertySet,
    running_time: float,
    count: int
) -> None:
    ...

단, 이 시그니처는 qiskit.transpiler 모듈에 정의된 패스와 패스 관리자의 경우 약간 다르다는 점에 유의하십시오.


우리는 간단한 최적화 문제를 살펴보겠습니다. 구체적으로, 숫자 행을 준비한 뒤, 숫자가 5인 경우 해당 숫자를 제거하는 작업입니다. 입력된 숫자를 문자열로 변환하면 이러한 작업을 쉽게 수행할 수 있습니다. 여기서는 패스 매니저 프레임워크를 사용하며, 효율성은 잠시 제쳐두고 커스텀 Qiskit 컴파일러를 구축하는 방법을 배워보겠습니다.

from qiskit.passmanager import BasePassManager, GenericPass, ConditionalController

class ToyPassManager(BasePassManager):

    def _passmanager_frontend(self, input_program: int, **kwargs) -> str:
        return str(input_program)

    def _passmanager_backend(self, passmanager_ir: str, in_program: int, **kwargs) -> int:
        return int(passmanager_ir)

이 패스 매니저는 문자열 데이터에 대한 최적화 작업을 수행하면서 정수를 입력 및 출력합니다. 따라서 입력, IR, 출력 유형은 각각 정수, 문자열, 정수입니다. _passmanager_frontend() 메서드는 입력 데이터에서 IR로의 변환을 정의하고 _passmanager_backend() 메서드는 IR에서 출력 데이터로의 변환을 정의합니다. 패스 관리자 백엔드에는 최종 변환을 위해 입력 프로그램의 원본 메타데이터를 참조할 수 있도록 원본 input_program 을 포함하는 in_program 파라미터가 프론트엔드에 제공됩니다.

다음으로 숫자가 5일 때 한 자릿수를 제거하는 패스를 구현합니다.

class RemoveFive(GenericPass):

    def run(self, passmanager_ir: str):
        return passmanager_ir.replace("5", "")

task = RemoveFive()

마지막으로, 패스 매니저를 생성하고 이를 사용하여 작업을 예약합니다. 패스 매니저를 임의의 숫자 행으로 실행하면 5가 포함되지 않은 새로운 숫자들이 반환됩니다.

pm = ToyPassManager()
pm.append(task)

pm.run([123456789, 45654, 36785554])

출력:

[12346789, 464, 36784]

이제 조건부 실행의 경우를 살펴보겠습니다. 입력 번호가 6자리 이하인 경우 '5자리 제거' 작업은 실행되지 않습니다. 이러한 제어는 플로우 컨트롤러로 구현할 수 있습니다. 플로우 컨트롤러에 숫자 수에 대한 정보를 제공하는 분석 패스에서 시작합니다.

class CountDigits(GenericPass):

    def run(self, passmanager_ir: str):
        self.property_set["ndigits"] = len(passmanager_ir)

analysis_task = CountDigits()

그런 다음, 조건이 충족될 때만 저장된 작업을 실행하는 ConditionalController 로 ‘remove five’ 작업을 감쌉니다.

def digit_condition(property_set):
    # Return True when condition is met.
    return property_set["ndigits"] > 6

conditional_task = ConditionalController(
    tasks=[RemoveFive()],
    condition=digit_condition,
)

이전과 마찬가지로 패스 관리자와 함께 이러한 패스를 예약하고 실행합니다.

pm = ToyPassManager()
pm.append(analysis_task)
pm.append(conditional_task)

pm.run([123456789, 45654, 36785554])

출력:

[12346789, 45654, 36784]

'5개 제거' 작업은 6자리 이상 입력값인 첫 번째와 세 번째 입력값에 대해서만 트리거됩니다.

패스 관리자 프레임워크를 사용하면 개발자는 여러 패스와 흐름 제어기를 조합하여 최적화 작업을 유연하게 맞춤 설정할 수 있습니다. 자세한 내용은 다음 클래스 API 문서를 참조하십시오.


인터페이스

패스

GenericPass()단일 패스 관리자 작업의 기본 클래스입니다.
Task()패스 관리자 태스크의 인터페이스입니다.

패스 관리자

BasePassManager( [작업, max_iteration] )패스 관리자 기본 클래스.
MultiStagePassManager(**stages)여러 IR을 지원하는 단계별 패스 관리자.

유량 제어기

BaseController( [옵션] )컨트롤러의 베이스 클래스입니다.
FlowControllerLinear( [작업, 옵션] )작업을 차례로 실행하는 표준 흐름 컨트롤러입니다.
ConditionalController( [작업, 조건,...] )플로우 컨트롤러는 조건이 참이면 파이프라인을 한 번 실행하고, 조건이 거짓이면 아무 작업도 수행하지 않습니다.
DoWhileController( [작업, do_while, 옵션] )속성 집합의 do_while 조건이 False 이 될 때까지 주어진 작업을 루프에서 실행합니다.

컴파일 상태

PropertySet기본 딕셔너리와 유사한 객체입니다.
WorkflowStatus( [count, completed_passes,...] )워크플로우의 컴파일 상태, 즉 패스 관리자 실행을 수집합니다.
PassManagerState(워크플로우_상태, 속성_설정)관리자 작업을 전달하는 휴대용 컨테이너 객체는 생성기를 통해 통신합니다.

예외

PassManagerError

exception qiskit.passmanager.PassManagerError(*message)

GitHub

베이스: QiskitError

패스 관리자 오류입니다.

오류 메시지를 설정합니다.

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