跳转到主要内容

已弃用:使用 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服务转换电路。

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

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

这些自定义收集通过限制了收集子电路的大小,以确保它们由AI合成通过支持,因此建议在路由通过之后和合成通过之前使用它们,以获得更好的整体优化。

自定义日志

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

import logging

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

其中X可以是:NOTSETDEBUGINFOWARNINGERRORCRITICAL

引用

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

上传时间:

构建分布

qiskit_transpiler_service-0.4.10-py3-none-any.whl (29.3 kB 查看哈希值)

上传时间: Python 3

由以下支持