已弃用:使用 qiskit-ibm-transpiler (https://pypi.ac.cn/project/qiskit-ibm-transpiler/) 代替。一个用于使用 Qiskit Transpiler 服务 (https://docs.quantum.ibm.com/transpile/qiskit-transpiler-service) 和 AI transpiler passes (https://docs.quantum.ibm.com/transpile/ai-transpiler-passes) 的库。
项目描述
qiskit_transpiler_service
⚠️ 包 qiskit-transpiler-service 已弃用。请使用 qiskit-ibm-transpiler 代替
一个用于使用 Qiskit Transpiler 服务 和 AI transpiler passes 的库。
注意 Qiskit transpiler service 和 AI transpiler passes 使用不同的实验性服务,仅适用于 IBM Quantum Premium Plan 用户。此库和相关服务为alpha版本,可能发生变化。
安装 qiskit-transpiler-service
要使用 Qiskit transpiler service,请安装 qiskit-transpiler-service
包
pip install qiskit-transpiler-service
默认情况下,该包会尝试使用定义的 Qiskit API token 验证到 IBM Quantum 服务,并使用从 QISKIT_IBM_TOKEN
环境变量或从文件 ~/.qiskit/qiskit-ibm.json
(在 default-ibm-quantum
部分)中的令牌。
注意:此库默认需要Qiskit 1.0。
如何使用库
使用Qiskit Transpiler服务
以下示例演示了如何使用不同的参数通过Qiskit transpiler服务转换电路。
-
创建一个电路,并调用Qiskit transpiler服务,使用
ibm_sherbrooke
作为backend_name
,3作为optimization_level
,并在转换过程中不使用AI。from qiskit.circuit.library import EfficientSU2 from qiskit_transpiler_service.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)
注意:您只能使用IBM Quantum账户允许的backend_name
设备。除了backend_name
之外,TranspilerService
还允许使用coupling_map
作为参数。
-
生成一个类似的电路并将其转换,通过将标志
ai
设置为'true'
来请求AI转换能力from qiskit.circuit.library import EfficientSU2 from qiskit_transpiler_service.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传递
AIRouting
传递既作为布局阶段,也作为路由阶段。它可以在以下方式中使用在PassManager
中
from qiskit.transpiler import PassManager
from qiskit_transpiler_service.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
:这尊重先前转换器传递设置的布局(或如果未设置,则使用平凡布局)。通常仅在电路必须在设备的特定量子比特上运行时使用。它通常会产生更差的结果,因为它有较少的优化空间。improve
:这使用先前转换器传递设置的布局作为起点。当您对布局有良好的初始猜测时很有用;例如,对于以近似遵循设备耦合图的方式构建的电路。如果您想尝试与其他特定布局传递结合使用AIRouting
传递,这也很有用。optimize
:这是默认模式。对于您可能没有良好布局猜测的通用电路效果最好。此模式忽略以前的布局选择。
使用AI电路综合传递
AI电路综合传递允许您通过重新综合它们来优化不同电路类型(Clifford、线性函数、置换)的各个部分。人们通常会使用以下方法使用综合传递
from qiskit.transpiler import PassManager
from qiskit_transpiler_service.ai.routing import AIRouting
from qiskit_transpiler_service.ai.synthesis import AILinearFunctionSynthesis
from qiskit_transpiler_service.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)
综合尊重设备的耦合图:它可以在其他路由传递之后安全运行而不会“破坏”电路,因此整个电路仍然遵循设备限制。默认情况下,如果综合子电路比原始子电路好(目前仅检查CNOT
计数),则综合将替换原始子电路,但可以通过设置replace_only_if_better=False
来强制始终替换电路。
以下综合传递来自qiskit_transpiler_service.ai.synthesis
- AICliffordSynthesis:用于Clifford电路(由
H
、S
和CX
门组成的块)。目前最多支持9量子比特块。 - AILinearFunctionSynthesis:用于线性函数电路(由
CX
和SWAP
门组成的块)。目前最多支持9量子比特块。 - AIPermutationSynthesis:用于置换电路(由
SWAP
门组成的块)。目前适用于65、33和27量子比特块。
我们预计将逐步增加支持的块的大小。
所有通过都使用线程池并行发送多个请求。默认情况下,它将使用与核心数加四相同的最大线程数(这是ThreadPoolExecutor
python对象的默认值)。然而,您可以在通过实例化时使用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合成通过要合成的子电路,它必须位于耦合图的一个连接子图中(这可以通过在收集块之前只进行路由通过来确保,但这不是唯一的方法)。合成通过将自动检查子电路所在的特定子图是否受支持,如果不支持,将引发警告并保留原始子电路不变。
为了补充合成通过,我们还提供了自定义收集通过,用于Cliffords、线性函数和排列,可以从qiskit_transpiler_service.ai.collection
导入。
- CollectCliffords:收集
Clifford
块作为Instruction
对象,并将原始子电路存储起来,以便在合成后进行比较。 - CollectLinearFunctions:收集
SWAP
和CX
块作为LinearFunction
对象,并将原始子电路存储起来,以便在合成后进行比较。 - CollectPermutations:收集
SWAP
电路块作为Permutations
。
这些自定义收集通过限制了收集子电路的大小,以确保它们由AI合成通过支持,因此建议在路由通过之后和合成通过之前使用它们,以获得更好的整体优化。
自定义日志
库已准备让用户记录他们想要的日志。为此,用户只需将以下代码添加到他们的代码中即可
import logging
logging.getLogger("qiskit_transpiler_service").setLevel(logging.X)
其中X可以是:NOTSET
、DEBUG
、INFO
、WARNING
、ERROR
或CRITICAL
引用
如果您在研究中使用了Qiskit 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_transpiler_service-0.4.10-py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2340b940586e11961278d7b3fa4aeeebf6783a1695d8b8f6c280d5f393ca4dfe |
|
MD5 | 60a7437cf3f1e525404db3a98c478a42 |
|
BLAKE2b-256 | eb4c97b8362628ed48dcfc3003d016b3ac59627488471a05cb78791b0b0941f0 |