跳转到主要内容

一个用于使用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 ServiceAI 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以不同的参数对电路进行编译。

  1. 创建一个电路,并调用Qiskit IBM Transpiler以backend_nameibm_sherbrookeoptimization_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作为参数。

  1. 生成一个类似的电路并将其编译,通过设置标志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 电路(HSCX 门的块)的合成。目前支持最多9比特的块。
  • AILinearFunctionSynthesis:用于 线性函数 电路(CXSWAP 门的块)。目前支持最多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:收集 SWAPCX 块作为 LinearFunction 对象,并存储原始子电路以便在合成后进行比较。
  • CollectPermutations:收集 SWAP 电路块作为 Permutations

这些定制收集传递限制了收集的子电路的大小,以便它们能够被AI合成传递支持,因此建议在路由传递之后和合成传递之前使用它们以获得更好的整体优化。

自定义日志

库已准备好让用户记录他们想要的日志消息。为此,用户只需将以下代码添加到他们的代码中

import logging

logging.getLogger("qiskit_ibm_transpiler").setLevel(logging.X)

其中 X 可以是:NOTSETDEBUGINFOWARNINGERRORCRITICAL

引用

如果您在研究中使用了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 (30.2 kB 查看哈希值)

上传于 来源

构建发行版

qiskit_ibm_transpiler-0.7.0-py3-none-any.whl (33.6 kB 查看哈希值)

上传于 Python 3

由以下支持