一个用于使用Qiskit IBM Transpiler(https://docs.quantum.ibm.com/transpile/qiskit-ibm-transpiler)和AI Transpiler passes(https://docs.quantum.ibm.com/transpile/ai-transpiler-passes)的库
项目描述
qiskit_ibm_transpiler
一个用于使用Qiskit Transpiler Service和AI transpiler passes的库。
注意 Qiskit Transpiler Service和AI transpiler passes使用不同的实验性服务,这些服务仅对IBM Quantum Premium Plan用户可用。此库和相关服务是alpha版本,可能发生变化。
安装qiskit-ibm-transpiler
要使用Qiskit IBM Transpiler,请安装qiskit-ibm-transpiler
包
pip install qiskit-ibm-transpiler
默认情况下,该包尝试使用定义的Qiskit API令牌对IBM Quantum服务进行身份验证,并使用来自QISKIT_IBM_TOKEN
环境变量或来自文件~/.qiskit/qiskit-ibm.json
(在default-ibm-quantum
部分下)的令牌。
注意:此库需要Qiskit 1.0或更高版本。
如何使用库
使用Qiskit IBM Transpiler
以下示例演示了如何使用Qiskit IBM Transpiler以不同的参数对电路进行编译。
-
创建一个电路,并调用Qiskit IBM Transpiler以
backend_name
为ibm_sherbrooke
、optimization_level
为3,且在编译过程中不使用AI的方式编译该电路。from qiskit.circuit.library import EfficientSU2 from qiskit_ibm_transpiler.transpiler_service import TranspilerService circuit = EfficientSU2(101, entanglement="circular", reps=1).decompose() cloud_transpiler_service = TranspilerService( backend_name="ibm_sherbrooke", ai='false', optimization_level=3, ) transpiled_circuit = cloud_transpiler_service.run(circuit)
注意:您只能使用您允许的backend_name
设备。除了backend_name
之外,TranspilerService
还允许coupling_map
作为参数。
-
生成一个类似的电路并将其编译,通过设置标志
ai
为'true'
来请求AI编译功能from qiskit.circuit.library import EfficientSU2 from qiskit_ibm_transpiler.transpiler_service import TranspilerService circuit = EfficientSU2(101, entanglement="circular", reps=1).decompose() cloud_transpiler_service = TranspilerService( backend_name="ibm_sherbrooke", ai='true', optimization_level=1, ) transpiled_circuit = cloud_transpiler_service.run(circuit)
手动使用AIRouting pass
AIRouting
pass既充当布局阶段,也充当路由阶段。它可以在以下方式中使用在PassManager
中:
from qiskit.transpiler import PassManager
from qiskit_ibm_transpiler.ai.routing import AIRouting
from qiskit.circuit.library import EfficientSU2
ai_passmanager = PassManager([
AIRouting(backend_name="ibm_sherbrooke", optimization_level=2, layout_mode="optimize")
])
circuit = EfficientSU2(101, entanglement="circular", reps=1).decompose()
transpiled_circuit = ai_passmanager.run(circuit)
在这里,backend_name
确定要路由的后端,optimization_level
(1、2或3)确定在过程中要花费的计算工作量(通常较高的结果更好,但需要更长时间),layout_mode
指定如何处理布局选择。layout_mode
包括以下选项:
keep
:这尊重由之前的编译器pass设置的布局(或使用未设置的平凡布局)。通常仅在电路必须在设备的特定量子位上运行时使用。它通常会产生更差的结果,因为它有更少的优化空间。improve
:这使用由之前的编译器pass设置的布局作为起点。当您对布局有良好的初始猜测时很有用;例如,对于以约遵循设备耦合图的方式构建的电路。如果您想尝试与AIRouting
pass结合使用的其他特定布局pass,这也很有用。optimize
:这是默认模式。对于您可能没有良好布局猜测的通用电路,此模式效果最好。此模式忽略以前的布局选择。
使用AI电路合成pass
AI电路合成pass允许您通过重新合成它们来优化不同电路类型(Clifford、线性函数、置换)的各个部分。使用合成pass的典型方法如下:
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 EfficientSU2
ai_passmanager = PassManager([
AIRouting(backend_name="ibm_cairo", optimization_level=3, layout_mode="optimize"), # Route circuit
CollectLinearFunctions(), # Collect Linear Function blocks
AILinearFunctionSynthesis(backend_name="ibm_cairo") # Re-synthesize Linear Function blocks
])
circuit = EfficientSU2(10, entanglement="full", reps=1).decompose()
transpiled_circuit = ai_passmanager.run(circuit)
合成尊重设备的耦合图:可以在其他路由pass之后安全运行,而不会“弄乱”电路,因此整体电路仍然遵循设备限制。默认情况下,合成将仅在合成的子电路改进原始子电路(目前仅检查CNOT
计数)时替换原始子电路,但可以通过设置replace_only_if_better=False
来强制始终替换电路。
以下合成pass可以从qiskit_ibm_transpiler.ai.synthesis
中获取:
- AICliffordSynthesis:用于 Clifford 电路(
H
、S
和CX
门的块)的合成。目前支持最多9比特的块。 - AILinearFunctionSynthesis:用于 线性函数 电路(
CX
和SWAP
门的块)。目前支持最多9比特的块。 - AIPermutationSynthesis:用于 排列 电路(
SWAP
门的块)。目前支持65、33和27比特的块。
我们预计将逐步增加支持块的尺寸。
所有传递都使用线程池并行发送多个请求。默认情况下,它将使用与核心数量加四相同的最大线程数(Python对象 ThreadPoolExecutor
的默认值)。但是,您可以在传递实例化时使用 max_threads
参数设置自己的值。例如,以下行将实例化 AILinearFunctionSynthesis
传递,允许它使用最多20个线程。
AILinearFunctionSynthesis(backend_name="ibm_cairo", max_threads=20) # Re-synthesize Linear Function blocks using 20 threads max
您还可以将环境变量 AI_TRANSPILER_MAX_THREADS
设置为期望的最大线程数,之后实例化的所有合成传递都将使用该值。
为了使AI合成传递能够合成子电路,该子电路必须位于耦合图的连接子图中(这可以通过在收集块之前仅执行路由传递来确保,但这不是唯一的方法)。合成传递将自动检查子电路所在的特定子图是否受支持,如果不支持,它将引发警告并保留原始子电路不变。
为了补充合成传递,我们还提供了从 qiskit_ibm_transpiler.ai.collection
可导入的针对Clifford、线性函数和排列的定制收集传递。
- CollectCliffords:收集
Clifford
块作为Instruction
对象,并存储原始子电路以便在合成后进行比较。 - CollectLinearFunctions:收集
SWAP
和CX
块作为LinearFunction
对象,并存储原始子电路以便在合成后进行比较。 - CollectPermutations:收集
SWAP
电路块作为Permutations
。
这些定制收集传递限制了收集的子电路的大小,以便它们能够被AI合成传递支持,因此建议在路由传递之后和合成传递之前使用它们以获得更好的整体优化。
自定义日志
库已准备好让用户记录他们想要的日志消息。为此,用户只需将以下代码添加到他们的代码中
import logging
logging.getLogger("qiskit_ibm_transpiler").setLevel(logging.X)
其中 X 可以是:NOTSET
、DEBUG
、INFO
、WARNING
、ERROR
或 CRITICAL
引用
如果您在研究中使用了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},
}
项目详情
下载文件
下载适合您平台的应用程序。如果您不确定要选择哪个,请了解有关 安装软件包 的更多信息。
源分发
构建发行版
qiskit_ibm_transpiler-0.7.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d30928df21d1c8368f1b7dd30a6a72d5f859be87907c771b4d90becacb1d8b00 |
|
MD5 | 53a1077cb306aae2dd7924864b58445d |
|
BLAKE2b-256 | 1446efe20a8095758c1758156913835b6e5b0c91d6b33318446d8202f1711d16 |
qiskit_ibm_transpiler-0.7.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e55cb38872afb96e99a333010b1487f76ff843725defc2318c344f607e301e07 |
|
MD5 | 7536890d45edfafc7126de39f446dd7f |
|
BLAKE2b-256 | a9dd2565a65d8341726ac4a869045a6fcb2ce5d1d1ecaaa64ab77757642dc971 |