AI 기반 트랜스파일러 통과
AI 기반 트랜스파일러 패스는 일부 트랜스파일링 작업에서 “기존” Qiskit 패스를 그대로 대체할 수 있는 패스입니다. 이들은 기존 휴리스틱 알고리즘(예: 더 낮은 탐색 깊이와 더 적은 CNOT 횟수)보다 더 나은 결과를 내는 경우가 많을 뿐만 아니라, 부울 만족성 솔버와 같은 최적화 알고리즘보다 훨씬 빠릅니다. AI 트랜스파일러는 사용자의 로컬 환경에서 실행됩니다.
AI 기반 트랜스파일러 패스는 베타 릴리스 상태이며 변경될 수 있습니다. 피드백이 있거나 개발자 팀에 연락하고 싶다면 이 키스킷 슬랙 워크스페이스 채널을 이용하세요.
현재 사용 가능한 패스는 다음과 같습니다:
라우팅 패스
AIRouting: 레이아웃 선택 및 회로 라우팅
회로 합성 패스
AICliffordSynthesis: 클리포드 회로 합성AILinearFunctionSynthesis: 선형 함수 회로 합성AIPermutationSynthesis: 순열 회로 합성
AI 트랜스파일러 패스를 사용하려면 먼저 해당 qiskit-ibm-transpiler 패키지를 설치하십시오. 사용 가능한 다양한 옵션에 대한 자세한 내용은 qiskit-ibm-transpiler API 문서를 참조하십시오.
pip install qiskit-ibm-transpilerAI 라우팅 패스
AIRouting 패스는 레이아웃 단계와 라우팅 단계의 역할을 모두 수행합니다. PassManager 내에서 다음과 같이 사용할 수 있습니다:
from qiskit.transpiler import PassManager
from qiskit.circuit.library import efficient_su2
from qiskit_ibm_transpiler.ai.routing import AIRouting
from qiskit_ibm_runtime import QiskitRuntimeService
import logging
backend = QiskitRuntimeService().backend("ibm_fez")
ai_passmanager = PassManager(
[
AIRouting(
backend=backend,
optimization_level=2,
layout_mode="optimize",
)
]
)
circuit = efficient_su2(101, entanglement="circular", reps=1)
logging.getLogger(
"qiskit_ibm_transpiler.wrappers.ai_local_synthesis"
).setLevel(logging.WARNING)
transpiled_circuit = ai_passmanager.run(circuit)여기서 backend 은 라우팅할 커플링 맵을 결정하고, optimization_level (1, 2 또는 3)은 프로세스에 소요되는 계산 노력을 결정하며(일반적으로 더 나은 결과를 제공하지만 더 오래 걸림), layout_mode 은 레이아웃 선택을 처리하는 방법을 지정합니다.
layout_mode 에는 다음과 같은 옵션이 포함되어 있습니다:
keep: 이전 트랜스파일러 패스에서 설정한 레이아웃을 존중합니다(설정하지 않은 경우 기본 레이아웃 사용). 일반적으로 디바이스의 특정 큐비트에서 회로를 실행해야 하는 경우에만 사용됩니다. 최적화를 위한 여지가 적기 때문에 종종 더 나쁜 결과를 낳습니다.improve: 이전 트랜스파일러 패스에서 설정한 레이아웃을 시작점으로 사용합니다. 예를 들어 장치의 커플링 맵을 거의 따르는 방식으로 구축된 회로와 같이 레이아웃에 대한 초기 추측이 좋은 경우에 유용합니다.AIRouting패스와 함께 다른 특정 레이아웃 패스를 사용해보고 싶은 경우에도 유용합니다.optimize: 기본 모드입니다. 레이아웃을 잘 추측할 수 없는 일반적인 회로에 가장 적합합니다. 이 모드는 이전 레이아웃 선택을 무시합니다.
AI 회로 합성 통과
AI 회로 합성 패스를 사용하면 다양한 회로 유형 (클리포드, 선형 함수, 순열, 파울리 네트워크)의 조각을 재합성하여 최적화할 수 있습니다. 합성 패스를 사용하는 일반적인 방법은 다음과 같습니다:
from qiskit.transpiler import PassManager
from qiskit_ibm_transpiler.ai.routing import AIRouting
from qiskit_ibm_transpiler.ai.synthesis import AILinearFunctionSynthesis
from qiskit_ibm_transpiler.ai.collection import CollectLinearFunctions
from qiskit.circuit.library import efficient_su2
ibm_kingston = QiskitRuntimeService().backend("ibm_kingston")
ai_passmanager = PassManager(
[
AIRouting(
backend=ibm_kingston,
optimization_level=3,
layout_mode="optimize",
local_mode=True,
), # Route circuit
CollectLinearFunctions(), # Collect Linear Function blocks
AILinearFunctionSynthesis(
backend=ibm_kingston, local_mode=True
), # Re-synthesize Linear Function blocks
]
)
circuit = efficient_su2(10, entanglement="full", reps=1)
transpiled_circuit = ai_passmanager.run(circuit)합성은 디바이스의 커플링 맵을 존중하므로 회로를 방해하지 않고 다른 라우팅 패스를 안전하게 실행할 수 있으므로 전체 회로가 여전히 디바이스 제한을 따릅니다. 기본적으로 합성은 합성된 하위 회로가 원본보다 개선된 경우에만 원본 하위 회로를 대체하지만(현재는 CNOT 수만 확인), replace_only_if_better=False 을 설정하여 항상 회로를 대체하도록 강제할 수 있습니다.
다음 합성 패스는 qiskit_ibm_transpiler.ai.synthesis 에서 사용할 수 있습니다:
- AICliffordSynthesis : 클리포드 회로(
H,S,CX게이트 블록)를 합성합니다. 현재 최대 9개의 큐비트 블록이 있습니다. - AILinearFunctionSynthesis : 선형 함수 회로(
CX및SWAP게이트 블록)를 위한 합성입니다. 현재 최대 9개의 큐비트 블록이 있습니다. - AIPermutationSynthesis : 순열 회로(
SWAP게이트 블록)에 대한 합성. 현재 65, 33, 27 큐비트 블록을 사용할 수 있습니다. - AIPauliNetworkSynthesis : 폴리 네트워크 회로(
H,S,SX,CX,RX,RY및RZ게이트 블록)에 대한 합성. 현재 최대 6개의 큐비트 블록이 있습니다.
지원되는 블록의 크기를 점차 늘려나갈 예정입니다.
모든 패스는 스레드 풀을 사용하여 여러 요청을 병렬로 전송합니다. 기본적으로 최대 스레드 수는 코어 수에 4개를 더한 값입니다( ThreadPoolExecutor Python 객체의 기본값). 그러나 전달 인스턴스화 시 max_threads 인수를 사용하여 고유한 값을 설정할 수 있습니다. 예를 들어, 다음 줄은 최대 20개의 스레드를 사용할 수 있는 AILinearFunctionSynthesis 패스를 인스턴스화합니다.
AILinearFunctionSynthesis(backend=ibm_torino, max_threads=20) # Re-synthesize Linear Function blocks using 20 threads max환경 변수 AI_TRANSPILER_MAX_THREADS 를 원하는 최대 스레드 수로 설정하면 그 이후에 인스턴스화된 모든 합성 패스는 해당 값을 사용합니다.
AI 합성 패스가 하위 회로를 합성하려면 커플링 맵의 연결된 서브그래프 위에 놓여야 합니다(블록을 수집하기 전에 라우팅 패스를 사용하는 것도 한 가지 방법이지만 이 방법만 있는 것은 아닙니다). 합성 패스는 특정 서브그래프가 지원되는지 자동으로 확인하고, 그렇지 않은 경우 경고를 표시하고 원래 서브회로를 변경하지 않습니다.
qiskit_ibm_transpiler.ai.collection 에서 임포트할 수 있는 클리포드, 선형 함수 및 퍼뮤테이션에 대한 다음 커스텀 컬렉션 패스도 합성 패스를 보완합니다:
- 수집 클리포드 : 클리포드 블록을
Instruction오브젝트로 수집하고 합성 후 비교할 원본 서브회로를 저장합니다. - 수집선형함수 :
SWAP및CX블록을LinearFunction객체로 수집하고 합성 후 비교하기 위해 원본 하위 회로를 저장합니다. - 콜렉트퍼뮤테이션 :
SWAP회로의 블록을Permutations으로 수집합니다. - 폴리 네트워크 수집 : 폴리 네트워크 블록을 수집하고 합성 후 비교할 원본 서브 회로를 저장합니다.
이러한 커스텀 컬렉션 패스는 수집된 하위 회로의 크기를 제한하여 AI 기반 합성 패스에서 지원되도록 합니다. 따라서 전반적인 최적화를 위해 라우팅이 통과한 후 합성이 통과하기 전에 사용하는 것이 좋습니다.
하이브리드 휴리스틱-AI 회로 트랜스파일레이션
qiskit-ibm-transpiler 에서 키스킷의 휴리스틱과 AI 기반 트랜스파일러 패스의 장점을 결합한 하이브리드 패스 매니저를 구성할 수 있습니다. 이 기능은 키스킷 generate_pass_manager 메서드와 유사하게 작동합니다. 일반적인 사용 방법( generate_ai_pass_manager )은 다음과 같습니다:
from qiskit_ibm_transpiler import generate_ai_pass_manager
from qiskit.circuit.library import efficient_su2
from qiskit_ibm_runtime import QiskitRuntimeService
backend = QiskitRuntimeService().backend("ibm_kingston")
kingston_coupling_map = backend.coupling_map
su2_circuit = efficient_su2(101, entanglement="circular", reps=1)
ai_transpiler_pass_manager = generate_ai_pass_manager(
coupling_map=kingston_coupling_map,
ai_optimization_level=3,
optimization_level=3,
ai_layout_mode="optimize",
)
ai_su2_transpiled_circuit = ai_transpiler_pass_manager.run(su2_circuit)이 예제에서는 다음 옵션이 사용됩니다:
coupling_map- 트랜스필레이션에 사용할 커플링 맵을 지정합니다.ai_optimization_level- PassManager 의 AI 구성 요소에 사용할 최적화 수준(1~3)을 지정합니다.optimization_level- PassManager 의 휴리스틱 구성 요소에 대해 회로에서 수행할 최적화의 양을 지정합니다.ai_layout_mode- PassManager 의 AI 라우팅 부분이 레이아웃을 처리하는 방법을 지정합니다. 이ai_layout_mode매개변수에 대한 구성 옵션을 검토하려면 AI 라우팅 패스 섹션을 참조하세요.
인용
인용
연구에서 이 qiskit-ibm-transpiler 패키지의 AI 기반 기능을 사용할 경우, 다음의 권장 인용 형식을 따르십시오:
@misc{2405.13196,
Author = {David Kremer and Victor Villar and Hanhee Paik and Ivan Duran and Ismael Faro and Juan Cruz-Benito},
Title = {Practical and efficient quantum circuit synthesis and transpiling with Reinforcement Learning},
Year = {2024},
Eprint = {arXiv:2405.13196},
}