跳转到主要内容

IBM Quantum客户端,用于Qiskit运行时。

项目描述

Qiskit运行时IBM客户端

License CI Code style: black Coverage Status

Qiskit是一个开源SDK,用于在扩展量子电路、算符和原语级别与量子计算机交互。

Qiskit IBM 运行时环境 是 IBM 量子提供的一种新环境,它简化了量子计算并提供了对 IBM 量子硬件的 Qiskit 基本原语 samplerestimator 的最佳实现。它旨在通过包括近实时计算(如错误抑制和错误缓解)来使用额外的经典计算资源,以在量子处理器上更高效地执行量子电路。错误抑制的示例包括动态去耦、噪声感知编译、包括读出缓解、零噪声外推(ZNE)和概率错误消除(PEC)。

使用运行时服务,IBM 量子研究团队能够在他们的锂氢模拟中实现 120 倍的速度提升。更多信息,请参阅 IBM 研究博客

此模块提供了访问 IBM 量子平台或 IBM 云上的 Qiskit 运行时服务的接口。

安装

您可以使用 pip 安装此软件包。

pip install qiskit-ibm-runtime

账户设置

IBM 量子平台上的 Qiskit 运行时服务

您需要您的 IBM 量子 API 令牌以验证运行时服务。

  1. 通过访问 IBM 量子登录页面 创建 IBM 量子账户或登录到您现有的账户。

  2. 从您的 IBM 量子账户页面 复制(可选:重新生成)您的 API 令牌。

IBM 云上的 Qiskit 运行时服务

运行时服务现在是 IBM 云上的 IBM 量子服务的一部分。要使用此服务,您需要创建一个 IBM 云账户和一个量子服务实例。此指南包含了包括如何找到您的 IBM 云 API 密钥和云资源名称(CRN)在内的逐步说明,这些是您进行身份验证所需的。

将账户保存在磁盘上

一旦您有了账户凭证,您可以将它们保存在磁盘上,这样您就无需每次都输入它们。凭证保存在 $HOME/.qiskit/qiskit-ibm.json 文件中,其中 $HOME 是您的家目录。

:warning: 账户凭证以纯文本形式保存,因此只有在使用受信任的设备时才这样做。
from qiskit_ibm_runtime import QiskitRuntimeService

# Save an IBM Cloud account.
QiskitRuntimeService.save_account(channel="ibm_cloud", token="MY_IBM_CLOUD_API_KEY", instance="MY_IBM_CLOUD_CRN")

# Save an IBM Quantum account.
QiskitRuntimeService.save_account(channel="ibm_quantum", token="MY_IBM_QUANTUM_TOKEN")

账户保存在磁盘上后,您可以无需任何参数即可实例化服务。

from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()

从环境变量中加载账户

或者,该服务可以从中发现环境变量中的凭证。

export QISKIT_IBM_TOKEN="MY_IBM_CLOUD_API_KEY"
export QISKIT_IBM_INSTANCE="MY_IBM_CLOUD_CRN"
export QISKIT_IBM_CHANNEL="ibm_cloud"

然后无需任何参数即可实例化服务。

from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()

为当前 Python 会话启用账户

作为另一种选择,您还可以通过用您的凭证实例化服务来仅对当前会话启用一个账户。

from qiskit_ibm_runtime import QiskitRuntimeService

# For an IBM Cloud account.
ibm_cloud_service = QiskitRuntimeService(channel="ibm_cloud", token="MY_IBM_CLOUD_API_KEY", instance="MY_IBM_CLOUD_CRN")

# For an IBM Quantum account.
ibm_quantum_service = QiskitRuntimeService(channel="ibm_quantum", token="MY_IBM_QUANTUM_TOKEN")

基本原语

所有量子应用程序和算法都是在这些步骤的基础上构建的

  1. 将经典输入映射到量子问题
  2. 将问题转换为优化量子执行。
  3. 通过使用基本原语(估计器或采样器)执行量子电路。
  4. 后处理,以经典格式返回结果。

基本原语 是作为许多量子算法和应用程序构建块的基础级函数。基本原语接受向量化输入,其中单个电路可以与数组值规范一起分组。也就是说,一个电路可以针对 n 组参数集、n 个可观察量或两者(在估计器的情况下)的数组执行。每个组被称为基本统一块(PUB),可以表示为一个元组。

基本原语接口定义在 Qiskit 中。

IBM 运行时服务提供了这些基本原语,并具有额外的功能,例如内置的错误抑制和缓解。

在调用基本原语时,您可以指定几个不同的选项。有关更多信息,请参阅 基本原语选项

基本原语版本

2.0 版本的基元由 qiskit-ibm-runtime 0.21.0 版本引入。1.0 版本的基元不再支持。有关如何迁移到 V2 基元的说明,请参阅 迁移到 V2 基元。以下所有示例都使用 V2 基元。

采样器

此基元以用户电路列表(包括测量)作为输入,并返回采样输出。输出的类型由程序定义(通常是位数组),输出数据由经典寄存器名称分隔。

调用 采样器 基元

from qiskit import QuantumCircuit
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler

service = QiskitRuntimeService()

# 1. A quantum circuit for preparing the quantum state (|00> + |11>)/rt{2}
bell = QuantumCircuit(2)
bell.h(0)
bell.cx(0, 1)
bell.measure_all()

# 2: Optimize problem for quantum execution.
backend = service.least_busy(operational=True, simulator=False)
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(bell)

# 3. Execute using the Sampler primitive
sampler = Sampler(mode=backend)
sampler.options.default_shots = 1024  # Options can be set using auto-complete.
job = sampler.run([isa_circuit])
print(f"Job ID is {job.job_id()}")
pub_result = job.result()[0]
print(f"Counts for the meas output register: {pub_result.data.meas.get_counts()}")

估计器

此基元以电路和可观测量为输入,用于评估给定参数输入的期望值和标准误差。此估计器允许用户高效地计算和解释许多算法所需的量子算符的期望值。

调用 估计器 基元

from qiskit_ibm_runtime import QiskitRuntimeService, EstimatorV2 as Estimator
from qiskit.quantum_info import SparsePauliOp
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
import numpy as np

service = QiskitRuntimeService()

# 1. A quantum circuit for preparing the quantum state (|000> + e^{itheta} |111>)/rt{2}
theta = Parameter('θ')
circuit = QuantumCircuit(3)
circuit.h(0) # generate superposition
circuit.p(theta, 0) # add quantum phase
circuit.cx(0, 1) # condition 1st qubit on 0th qubit
circuit.cx(0, 2) # condition 2nd qubit on 0th qubit

# The observable to be measured
M1 = SparsePauliOp.from_list([("XXY", 1), ("XYX", 1), ("YXX", 1), ("YYY", -1)])

# batch of theta parameters to be executed
points = 50
theta1 = []
for x in range(points):
    theta = [x*2.0*np.pi/50]
    theta1.append(theta)

# 2: Optimize problem for quantum execution.
backend = service.least_busy(operational=True, simulator=False)
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)
isa_observables = M1.apply_layout(isa_circuit.layout)

# 3. Execute using the Estimator primitive
estimator = Estimator(backend)
estimator.options.resilience_level = 1  # Options can be set using auto-complete.
job = estimator.run([(isa_circuit, isa_observables, theta1)])
print(f"Job ID is {job.job_id()}")
pub_result = job.result()[0]
print(f"Expectation values: {pub_result.data.evs}")

以下代码将 50 个参数批量组合在一起,以单次作业执行。如果用户想找到优化可观测量的 theta,他们可以在 theta=np.pi/2 处绘制和观察它。为了提高速度,我们建议将结果批量组合在一起(注意,根据您的访问权限,您可能对可以发送的电路、对象和参数数量有限制)。

会话

在许多算法和应用中,估计器需要在每次迭代中迭代调用,而不产生队列延迟。为了解决这个问题,IBM 运行时服务提供了一个 会话。会话在会话中的第一个作业启动时开始,会话中的后续作业由调度器优先执行。

您可以使用 qiskit_ibm_runtime.Session 类来启动会话。考虑上面的相同示例,尝试找到最优的 theta。以下示例使用 黄金搜索方法 逐次找到最大化可观测量的最优 theta。

在会话中调用 估计器 基元

from qiskit_ibm_runtime import QiskitRuntimeService, Session, EstimatorV2 as Estimator
from qiskit.quantum_info import SparsePauliOp
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
import numpy as np

service = QiskitRuntimeService()

# 1. A quantum circuit for preparing the quantum state (|000> + e^{itheta} |111>)/rt{2}
theta = Parameter('θ')
circuit = QuantumCircuit(3)
circuit.h(0) # generate superpostion
circuit.p(theta,0) # add quantum phase
circuit.cx(0, 1) # condition 1st qubit on 0th qubit
circuit.cx(0, 2) # condition 2nd qubit on 0th qubit

# The observable to be measured
M1 = SparsePauliOp.from_list([("XXY", 1), ("XYX", 1), ("YXX", 1), ("YYY", -1)])

gr = (np.sqrt(5) + 1) / 2 # golden ratio
thetaa = 0 # lower range of theta
thetab = 2*np.pi # upper range of theta
tol = 1e-1 # tol

# 2: Optimize problem for quantum execution.
backend = service.least_busy(operational=True, simulator=False)
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)
isa_observables = M1.apply_layout(isa_circuit.layout)

# 3. Execute iteratively using the Estimator primitive
with Session(service=service, backend=backend) as session:
    estimator = Estimator(session=session)
    estimator.options.default_precision = 0.03  # Options can be set using auto-complete.
    #next test range
    thetac = thetab - (thetab - thetaa) / gr
    thetad = thetaa + (thetab - thetaa) / gr
    while abs(thetab - thetaa) > tol:
        print(f"max value of M1 is in the range theta = {[thetaa, thetab]}")
        job = estimator.run([(isa_circuit, isa_observables, [[thetac],[thetad]])])
        test = job.result()[0].data.evs
        if test[0] > test[1]:
            thetab = thetad
        else:
            thetaa = thetac
        thetac = thetab - (thetab - thetaa) / gr
        thetad = thetaa + (thetab - thetaa) / gr

    # Final job to evaluate Estimator at midpoint found using golden search method
    theta_mid = (thetab + thetaa) / 2
    job = estimator.run([(isa_circuit, isa_observables, theta_mid)])
    print(f"Session ID is {session.session_id}")
    print(f"Final Job ID is {job.job_id()}")
    print(f"Job result is {job.result()[0].data.evs} at theta = {theta_mid}")

此代码仅在九次迭代中使用返回 Job result is [4.] at theta = 1.575674623307102。这是对基元的一个非常强大的扩展。然而,在迭代调用之间使用过多的代码可能会锁定 QPU 并消耗过多的 QPU 时间,这是昂贵的。我们建议仅在需要时使用会话。采样器也可以在会话中使用,但还没有定义良好的示例。

实例

IBM 量子平台通道的访问由您分配的实例(以前称为提供者)控制。实例由枢纽、组和项目的分层组织定义。枢纽是给定层次结构(组织)的最高级别,其中包含一个或多个组。这些组随后填充了项目。枢纽/组/项目的组合称为实例。用户在任何时候都可以属于多个实例。

注意: IBM 云实例与 IBM 量子平台实例不同。IBM 云不使用枢纽/组/项目结构进行用户管理。要查看和创建 IBM 云实例,请访问 IBM Cloud Quantum Instances 页面

要查看您的实例列表,请访问您的 账户设置页面 或使用 instances() 方法。

您可以在初始化服务或提供者时,或在选择后端时指定实例。

# Optional: List all the instances you can access.
service = QiskitRuntimeService(channel='ibm_quantum')
print(service.instances())

# Optional: Specify the instance at service level. This becomes the default unless overwritten.
service = QiskitRuntimeService(channel='ibm_quantum', instance="hub1/group1/project1")
backend1 = service.backend("ibmq_manila")

# Optional: Specify the instance at the backend level, which overwrites the service-level specification when this backend is used.
backend2 = service.backend("ibmq_manila", instance="hub2/group2/project2")

sampler1 = Sampler(mode=backend1)    # this will use hub1/group1/project1
sampler2 = Sampler(mode=backend2)    # this will use hub2/group2/project2

如果您没有指定实例,则代码将按照以下顺序选择一个实例

  1. 如果您的账户只可以访问一个实例,则默认选择该实例。
  2. 如果您的账户可以访问多个实例,但只有一个是可以访问请求的后端的,则会选择可以访问的实例。
  3. 在其他所有情况下,代码将选择第一个除了ibm-q/open/main之外可以访问后端的实例。

访问您的IBM量子后端

后端是一种能够运行量子电路或脉冲计划的量子设备或模拟器。

您可以查询您有权访问的后端。返回实例的属性和方法提供有关后端的信息,例如量子比特数量、错误率和状态。

from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()

# Display all backends you have access.
print(service.backends())

# Get a specific backend.
backend = service.backend('ibm_brisbane')

# Print backend coupling map.
print(backend.coupling_map)

下一步

现在您已经设置好了,准备好查看一些教程

贡献指南

如果您想为qiskit-ibm-runtime做出贡献,请查看我们的贡献指南。此项目遵循Qiskit的行为准则。通过参与,您应遵守此准则。

我们使用GitHub问题来跟踪请求和错误。请使用我们的Slack进行讨论和简单问题。要加入我们的Slack社区,请使用ibm.com/quantum/qiskit上的邀请链接。对于更适合论坛的问题,我们在Stack Exchange中使用Qiskit标签。

作者和引用

Qiskit Runtime IBM客户端是由许多人在不同级别为该项目做出的贡献。如果您使用Qiskit,请根据所附的BibTeX文件进行引用。

许可

Apache License 2.0.

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分布

qiskit_ibm_runtime-0.30.0.tar.gz (2.8 MB 查看哈希值)

上传时间 来源

构建发行版

qiskit_ibm_runtime-0.30.0-py3-none-any.whl (2.9 MB 查看哈希值)

上传时间 Python 3

由以下支持