亚马逊AWS官方博客

Amazon Braket Hybrid Jobs 的介绍 – 设置、监控并高效运行混合量子经典工作负载

我发现量子计算非常有趣! 在最简单的层面上,它利用量子位或 qubit 扩展了具有 01 值的的概念。量子位可以具有两种不同(量子)状态的组合。

量子位的两个特征使它们变得非常有趣:

  • 当您查看量子位的值时,您只能得到两种可能状态中的一种,其概率取决于自身状态的组合方式。
  • 多个量子位可以“连接”在一起(这称为量子纠缠),从而通过改变一个量子位的状态,即使只是通过读取其值,也可以改变其他量子位的状态。

这些特征来自量子力学描述的低水平属性,量子力学是物理学的基础理论,它在原子和亚原子尺度上描述了自然的物理特性。幸运的是,我们不需要获得量子力学学位就可以使用量子计算,就像我们不需要精通半导体就可以使用普通计算机一样。

研究人员正在使用量子位设计新算法,这些算法有可能比传统计算机所能实现的要快得多。为了加快量子计算的科学研究和软件开发,我们在 re:Invent 2019 中推出了 Amazon BraketAmazon Braket 是一项完全托管的量子计算服务,使您可以在模拟器和量子计算机上构建、测试和运行量子算法。

混合算法和量子处理单元 (QPU)
量子算法将在许多不同领域产生变革,它需要执行数十万到数百万个量子门。不幸的是,当前一代的 QPU 受噪声影响,造成了错误,在错误接管之前,将操作限制在几百或数千个量子门。

为了帮助解决此问题,我们可以从机器学习中汲取灵感:我们不使用固定量子电路,即实现算法的逻辑,而是通过调整调节电路的参数来“学习”算法,从而更有可能通过适应特定设备中的噪声来解决给定问题(将它们视为“自学习量子算法”)。

这与计算机视觉类似:机器学习算法通过迭代调整神经网络的参数来“学习”正确的功能,而不是通过手工制作功能来区分狗和猫(众所周知,这对于计算机来说非常困难)。

量子计算中一个快速发展的研究领域使用 QPU,即量子计算机使用的处理器,就像在机器学习中使用 GPU 一样:将量子电路参数化,用一些值进行初始化,然后在 QPU 上运行。就像神经网络中的权重一样,这些参数随后会根据计算结果进行迭代调整。这些所谓的混合算法依赖于经典计算机和 QPU 之间的快速迭代计算。

架构图。

要运行混合算法,您需要手动设置经典基础设施,安装所需的软件,并在混合算法期间管理量子和经典计算流程之间的交互。然后,您需要构建自定义监控解决方案来可视化算法的进度,以确保算法按预期收敛到解决方案,或者在必要时进行干预以调整算法的参数。

另一项重大挑战在于,QPU 是共享的非弹性资源,您需要与他人竞争访问权限。这可能会减慢算法的执行速度。来自另一个客户的单个大型工作负载可能会导致算法停止,从而可能将您的总运行时间延长数小时。这不仅造成不便,而且还会影响结果的质量,因为当今的 QPU 需要定期重新校准,这可能会使混合算法的进度无效。在最糟糕的情况下,算法会失败,从而浪费预算和时间。

Amazon Braket Hybrid Jobs 介绍
今天,我很高兴地向大家介绍 Amazon Braket Hybrid Jobs,它是 Amazon Braket 的一项新功能,它简化了设置、监控和高效执行混合量子经典算法的过程。Jobs 是完全托管式的,因此您可以避免进行大量的基础设施和软件管理,并且可以自信地快速、可预测地执行算法,同时按需优先访问 QPU。

创建作业时,Amazon Braket 会启动作业实例(提供基于 Amazon Elastic Compute Cloud (Amazon EC2) 实例的 CPU 环境),执行算法(使用量子硬件或模拟器),并在作业完成后释放资源,以使您只需为实际使用量付费。您还可以为算法定义自定义指标,这些指标由 Amazon CloudWatch 自动记录,并在算法运行时近乎实时地显示在 Amazon Braket 控制台中。这为您提供了有关算法进展情况的实时洞察,从而有机会根据需要调整算法并更快地进行创新。

架构图。

要将混合算法作为作业运行,您可以使用 Amazon Braket 开发工具包PennyLane(用于混合量子计算的开源库)定义您的算法。接下来通过几个示例了解它在实践中是如何工作的。

使用 Amazon Braket Hybrid Jobs
在构建可训练的量子算法之前,首先让我们运行一系列固定量子运算,我们将其称为量子任务。我使用 Python 和 Amazon Braket 开发工具包来定义一个构造所谓的 bell 状态电路,这种状态有 50% 的概率解析为两种状态。这种量子计算相当于扔硬币。

下面是 algorithm_script.py 文件的内容:

import os

from braket.aws import AwsDevice
from braket.circuits import Circuit
from braket.jobs import save_job_result


def start_here():

    print("Test job started!")

    device = AwsDevice(os.environ["AMZN_BRAKET_DEVICE_ARN"])

    results = []
    
    bell = Circuit().h(0).cnot(0, 1)
    for count in range(5):
        task = device.run(bell, shots=100)
        print(task.result().measurement_counts)
        results.append(task.result().measurement_counts)

    save_job_result({ "measurement_counts": results })
    
    print("Test job completed!")

此脚本使用环境变量 AMZN_BRAKET_DEVICE_ARN 对我在创建作业时选择的设备进行实例化。

量子计算是概率性的。因此,需要对电路进行多次评估才能获得准确的结果。一次运行被称为一次尝试。尝试次数越多,结果的准确性越高。在这种情况下,电路运行 100 次。

我使用 save_job_result 函数来存储我的作业结果,这样我就可以在结束时分析它们。

在 Amazon Braket 控制台中,我选择左侧面板上的 Jobs,然后选择 Create job(创建作业)。首先,我给作业指定一个名称。

控制台屏幕截图。

然后,我用算法传递文件。混合算法的 CPU 组件在容器中运行,我可以选择要使用的容器映像。例如,我可以使用包含我的算法所依赖的软件的预构建容器映像,如 PennyLaneTensorFlowPyTorch,或者自带自定义映像。我选择 Base 容器映像是因为我没有外部依赖项。

我将所有其他设置保留为默认值。这样一来,我使用 SV1 模拟器,而不是量子硬件来运行量子任务。

一段时间后,作业完成,我按照指向 Amazon Simple Storage Service (Amazon S3) 控制台的链接下载结果。如预期的那样,对于五个任务中的每个任务,结果均显示 0011 状态的比例大约为 50:50。由于量子计算的概率性质,比例略有不同。

{
    "braketSchemaHeader": {
        "name": "braket.jobs_data.persisted_job_data",
        "version": "1"
    },
    "dataDictionary": {
        "measurement_counts": [
            {
                "00": 51,
                "11": 49
            },
            {
                "00": 44,
                "11": 56
            },
            {
                "11": 51,
                "00": 49
            },
            {
                "00": 56,
                "11": 44
            },
            {
                "00": 49,
                "11": 51
            }
        ]
    },
    "dataFormat": "plaintext"
}

这个示例非常基础,因为除了启动任务之外,我没有运行任何经典逻辑。为了看到真正的价值,让我们来看看它是如何与混合算法一起工作的,在混合算法中,我们可以在任务之间迭代地调整量子电路的参数。

将 Amazon Braket Hybrid Jobs 与混合算法结合使用
对于更高级的示例,我使用了一个众所周知的实际混合算法示例,称为 量子近似优化算法 (QAOA),该示例包含在 Amazon Braket 在从 Braket 控制台创建笔记本时提供的示例中。QAOA 是一种量子算法,可为组合优化问题生成近似解。您也可以在此 GitHub 存储库中找到示例。

在这种情况下,我使用 QAOA 来解决 Max-Cut 问题:将图的节点分成两部分时,连接两个部分之间的节点的最大边数量是多少? 例如,在下图中,有六个节点由八条边连接。粗黄线通过交叉六条边将节点分成两组。

在 QAOA 示例中,在传统计算环境(例如 EC2 实例)中,使用 TensorFlowPyTorch 等工具优化了用于运行连续几轮量子任务的参数的调整。在其中一个笔记本单元格中,我可以选择使用哪个接口来以我对机器学习训练所做的类似方式来调整参数以及其他超参数。

然后,Braket 作业协调算法的经典计算部分和量子计算部分的运行以及它们之间的参数和结果的交换。看着算法收敛时,我可以坐下来放松一下,准备像以前一样从 S3 检索结果以进行更深入的分析。

在本地模式下运行混合算法
为了快速测试和调试混合算法,Amazon Braket SDK 可以在本地模式下运行作业。在本地模式下,Braket 作业在计算机本地运行(例如,手提电脑)。通过这种方式,您可以在算法开发过程中获得快速反馈并快速迭代。

要在本地模式下运行作业,您只需将 AwsQuantumJob 替换为 LocalQuantumJob。请注意,AwsQuantumJobbraket.aws 中导入,而 LocalQuantumJob 是从 braket.jobs.local 中导入的。

可用性和定价
Amazon Braket Hybrid Jobs 现已在推出 Amazon Braket 的所有 AWS 区域提供。有关更多信息,请参阅 AWS 区域服务列表

使用 Amazon Braket Hybrid Jobs,您只需为您使用的资源付费。无需部署、配置和管理传统基础设施,即可轻松地进行迭代实验和改进算法。有关更多信息,请参阅 Amazon Braket 定价页面

您可以开始将量子计算机用作主要工具来理解和改进混合算法并测试其在行业和研究使用案例中的适用性,而不是依赖理论研究。通过这种方式,您可以专注于研究,而不必为实验设置和协调这些不同的计算资源。

在开发这项新功能的过程中,我们与客户和合作伙伴进行了交谈,以了解他们的需求。“作为应用程序开发人员,Braket Hybrid Jobs 为我们提供了与客户一起探索混合变分算法潜力的机会”,QCWare 工程主管 Vic Putz 说。“我们很高兴能扩展与 Amazon Braket 的集成,能够在自定义容器中运行我们自己的专有算法库意味着我们可以在安全的环境中快速实现创新。Amazon Braket 的运营成熟度以及优先访问不同类型的量子硬件的便利性意味着我们可以放心地将这一新功能构建到我们的堆栈中。”

使用 Amazon Braket Hybrid Jobs 简化混合量子经典工作负载的运行。

Danilo