在经典计算编程领域,软件框架是一种具有通用软件功能的抽象形式。使用这些软件框架的开发者们可以根据特定的功能需求对框架代码重新改写后,为特 定应用提供定制化的服务。在大数据时代,经典计算的算力在海量数据面前的略 显单薄。而量子计算因其纠缠与叠加特性在算力加速方面脱颖而出。业界对于量子编程软件的研究与设计普遍继承了经典程序设计思路,以最大限度的发挥量子 计算的计算能力与优势。
目前,国内外已有许多科技企业纷纷推出量子编程框架软件,如量子计算开源软件框架 ProjectQ、IBM 公司的开源量子编程开发工具包 Qiskit、谷歌开源量子算法框架 Criq、Amazon Braket SDK、启科量子的量子编程框架 QuTrunk 等。本文主要以Amazon Braket SDK量子软件开发包和启科量子的QuTrunk量子编程框架为例进行介绍。
量子编程框架则更着眼于当前技术条件下量子程序的快速开发。量子编程框架通常以传统编程语言为宿主语言,在上面添加描述量子计算体系的变量、函数、对象等元素,然后通过对这些元素的程序处理,实现量子算法并开发出量子软件。量子编程框架中也常常包含了常用量子算法软件库,方便量子程序的高效开发。同时,由于宿主语言的存在,量子编程框架技术可以很方便地实现量子和经典的混合编程。
常用的量子编程框架包括 QPanda、QDK、Cirq、Qiskit、ProjectQ、HiQ以及Forest、Amazon Braket SDK、QPanda、QuTrunk等。由于量子编程框架是在经典宿主程序语言下引入量子计算的元素和概念,把量子芯片看作一个特殊的设备或对象,因此这对于开发者来说也是相对熟悉的开发范式。量子编程框架开发的程序经过编译后,其中经典程序代码部分转化成机器指令并后续在经典处理器上执行,而描述量子算法的量子线路代码部分则通常转化为量子中间表示,并后续发送给量子芯片控制系统处理。
公司 | 量子编程框架 | 支持经典语言类型 |
---|---|---|
微软 | QDK | C# |
IBM | Qiskit | Python |
谷歌 | Cirq | Python |
Xanadu | Strawberry Fields | Python |
Rigetti | Forest | Python |
亚马逊 | Braket SDK | Python |
华为 | HiQ | Python/C++ |
本源量子 | QPanda | Python/C++ |
启科量子 | QuTrunk | Python |
量子编程框架类软件用来编写运行在量子计算机中的量子算法和程序,经过封装后还可提供常用的量子计算组件和量子算法库,进行量子程序快速开发。
Amazon Braket 是亚马逊推出的一种全托管式Amazon Web Services(AWS)解决方案,可帮助研究人员和开发人员探索潜在的应用和评估当前的量子计算技术。它允许用户从零开始设计自己的量子算法,或者从一组预先构建的算法库中进行选择。定义算法后,Amazon Braket就会提供一个完全托管的模拟服务来帮助排除故障和验证。
Amazon Braket 可以分为三个方面[ 《什么是Amazon Braket?》(概念澄清):
(1)Build, 安装了 Amazon Braket SDK 的 Jupyter 环境,进行量子编程。
(2)Test, 在模拟器中执行量子线路,Braket 支持 4 种 Simulator, 其中 local simulator 可以在本地模拟量子环境。
(3)Run, 可以在真实量子环境中运行量子算法。目前 AWS 量子环境提供商有 D-Wave, IonQ, OQC. 因为量子计算机噪音影响目前无法完全去除,AWS 提供了 hybrid 的量子环境,通过QPU协同CPU工作,通过 PennyLane 开源库,支持 hybrid 算法。
Amazon Braket工作原理[ 《Amazon Braket Developer Guide》
(1)学习
Amazon Braket 提供分步指导、教程和资源库,可帮助您快速开始尝试使用量子计算。
(2)设计
要设计量子算法,您可以直接通过 Amazon Braket 控制台使用完全托管的 Jupyter 笔记本。示例笔记本可允许您访问预安装开发人员工具、示例算法和文档,从而快速上手。
(3)测试
您可以使用传统硬件上运行的模拟器,简化代码诊断和设计优化,从而加快算法开发。Amazon Braket 以完全托管服务方式来运行模拟,自动设置所需的计算实例,运行模拟,将结果发布至 Amazon S3,并在完成时关闭资源。
(4)运行
您可以在自己所选择的量子硬件上执行量子算法,且只需按实际使用量付费。如果您选择运行混合量子算法,Amazon Braket 可以自动设置所需的传统计算资源,并管理传统任务与量子任务之间的工作流程。
(5)分析
完成后,系统将会自动通知您,并将结果存储在 Amazon S3 中。Amazon Braket 会将完成状态和运行时间等事件日志和性能指标发布至 Amazon CloudWatch。
Amazon Braket功能点
名称 | 说明 |
---|---|
QPU | 1.QPU资源有限,任务采取排队机制,不会立刻返回运算结果, 提供API获取任务执行状态;2.目前支持 quantum annealing: (D-Wave) 和 gate-model(ionq, Rigetti,OQC) |
Simulator | 1.本地Simulator(免费),集成在Braket SDK中;2.On-demand Simulator(收费),更高效的模拟服务,支持更多的qubit,embedded simulator等; 3.Nosie模拟,支持两种介入方式:初始化量子线路时介入以及线路运行过程中介入。 |
notebook | 1.可直接创建集成了 Braket SDK的notebook instance; 2.也可下载Braket SDK,在本地部署jupyter。 |
Braket Moment属性 | moment属性的目的是以门为单位,切割一个 circuit,获取 circuit 在某个门操作完成后,当下 相应qubit的状态,从而分析算法的运行过程 |
Task batching | 1.local simulator 不支持;2.On-demand simulator & QPU支持, 允许circuit 并行(并行价格更高) |
Task Result | 1.有统一的结果查询入口,方便历史结果查询;2.结果持久化到s3; 3.结果内容包括:task id, task status,device arn, timestamp |
Hybrid jobs | 1.不同Region,支持的QPU不同,不能跨Region访问当前Region不支持的QPU; 2.可选择预装了PennyLane (Tensorflow, PyTorch)的container; 3.支持BYOC, 通过 Dockerfile, 自定义 container; 4.创建job instance(EC2), 上传算法代码,Job结束后,ec2资源自动释放 |
Notification | 联合SNS, 可以知道任务执行状态以及QPU变化状态。 |
Braket Task Flow[ 《Amazon Braket Developer Guide》]
(1)为了便于客户定义、提交和监控他们的任务,Amazon Braket提供预装的托管 Jupyter notebook。
(2)Amazon Braket开发工具包。您可以直接在SDK中构建量子电路,或者对于退火设备,定义退火问题和参数。Amazon BraketSDK 还提供了一个插件D-Wave’sOcean 工具套件这样你就可以在原生编程了D-Wave设备。定义任务后,您可以选择要在其上执行的设备并将其提交到Amazon Braket API。
(3)根据您选择的设备,任务将排队直到设备可用并将任务发送到 QPU 或模拟器执行。
(4)Amazon Braket允许您访问五种不同类型的QPU(D-Wave,IonQ,OQC,Xanadu,Rigetti) 和三个按需模拟器 (SV1,DM1,TN1)。您的任务处理完毕后,Amazon Braket将结果返回到AmazonS3 存储桶,数据存储在您的AWS账户。
(5)同时,SDK 会在后台轮询结果,并在任务完成时将其加载到 Jupyter 笔记本中。您还可以在上查看和管理您的任务任务页面中的一页Amazon Braket控制台或使用控制台或使用GetQuantumTask
的操作Amazon Braket API。Amazon Braket与集成Amazon Identity and Access Management 、Amazon CloudWatch,Amazon CloudTrail 和Amazon EventBridge 用于用户访问管理、监控和记录以及基于事件的处理
Amazon Braket Python SDK 是一个量子软件开发包,它提供了一个框架,可以使用该框架通过亚马逊 Braket 与量子计算硬件设备进行交互。
使用Amazon Braket在基于不同技术(包括D-Wave,IonQ和Rigetti的系统)选择的量子处理器上运行其量子算法。模拟和量子硬件作业均通过统一的开发经验进行管理,客户只需为使用的计算资源付费。其中,Amazon Braket SDK的一部分免费提供了本地模拟器,该本地模拟器适用于运行中小型模拟(通常最多25-qubit)。客户可以在使用Amazon EC2计算资源的量子计算机模拟器上运行,测试其算法并对其进行故障排除。准备就绪后,客户便可以在自己选择的量子计算机上运行其算法,而无需聘请多个提供商或采用单一技术。
对于需要高性能计算资源的更大,更复杂的算法(最多34-qubit),可以将模拟任务提交给Braket服务,使用Braket模拟器的成本取决于每个模拟任务的持续时间,以每小时的费率计费,以一秒为增量,最终以执行模拟所花费的时间做结算。
本地安装 Jupyter 即可进行量子线路编程。
安装 AWS Braket SDk,
pip install amazon-braket-sdk
AWS 可以支持本地simulor,以及具有高效和支持更多qubit的simulator服务
(1)Moment 属性, Braket 有一个 pseudo-time概念,定义为moment, 含义是一个 qubit 在当下的moment,执行一个门操作。moment属性的目的是以门为单位,切割一个 circuit,从而获取 circuit 在某个moment 时的临时状态,从而分析算法的运行过程。代码如下图所示:
(2)Braket SDK 返回结果类型:Braket 返回结果支持多种类型,针对不同的后端平台,返回结果类型也有所不同,具体如下表所示:
(3)Verbatim compilation compiler 不做优化,算法的每一步都准确翻译,保证算法的执行与设计一致,(编译阶段,即将circuit中的门操作翻译成QPU native gate阶段,Braket compiler默认会做优化),该功能使用场景:例如benchmark 硬件的性能等
(4)支持OpenQASM 3.0 标准
(6)Hybrid jobs, Braket 支持PennyLane的 embedded simulators, embedded simulator GPU。
(7)Hybrid jobs, Braket 针对 hybrid algorithms 提供了Hybrid jobs, 创建 job 时可上传量子算法的脚本,以及其他相关参数,job结果可持久化到s3中,也可在console, cloud watch中查看。
启科量子自主研发一款量子编程框架 QuTrunk,为量子编程开发提供了一个通用的软件环境。QuTrunk 使用 Python 作为宿主语言,利用 Python 的语法特性实现针对量子程序的 DSL(领域专用语言),所有支持 Python 编程的 IDE 均可安装使用 QuTrunk。
QuTrunk 基于量子逻辑门、量子线路等概念提供量子编程所需的各类 API。 这些 API 分别由相应的模块实现,比如 QCircuit 实现量子线路功能,Qubit 实现量子比特,Qureg 实现量子寄存器,Command 对应每个量子门操作的指令, Backend 代表运行量子线路的后端模块,gate 模块实现了各类基础量子门操作。 同时 QuTrunk 还可以作为其他上层量子计算应用的基础,比如:量子算法、量子可视化编程、量子机器学习等。
目前 QuTrunk 以 QuSprout 作为后端。QuSprout 也是启科量子自研的一款基 于经典计算资源的量子计算模拟软件,支持支持多线程、多节点、GPU 加速,也可预安装在 QuBox 中。QuTrunk 为量子编程工作提供了量子编程框架,建立起一套统一的量子编程规范,进而实现量子程序开发的“降本增效”。
QuTrunk的架构如下图所示,用户可以利用QuBranch进行Python语言的直接编译,模块化的设计能够让用户根据实际情况调整编译器门组,更好的完成自定义设计。目前,QuTrunk框架默认以BackendLocal做为后端,同时提供Python版本的本地后端。
同时也支持扩展更多后端,理论上只要是对外开发了量子计算访问接口的后端,QuTrunk都可以进行兼容如,IBM、lonq等等。用户可以在QuTrunk进行量子编程,通过QuSL将量子程序转译成目标平台指令,然后选择不同的后端进行计算。
QuTrunk部署完成后,可以开始我们的第一个量子计算程序的编写及运行了
windows及Linux下执行ctrl+shift+p,macOS下执行command+shift+p,打开命令行,输入quan搜索,选择quan:python解释器切换。python解释器切换可切换全工作区或为单一项目切换python环境。
在需要保存的目录下新建一个目录,示例中Qun-Demo,在IDE开始界面,选择打开文件夹,然后选中新建的文件夹打开,显示如下:
从开始界面,选择新建python文件,并保存为demo.py,下面的代码为bell_pair算法例子:
步骤1:环境准备
from qutrunk.circuit import QCircuit
from qutrunk.circuit.gates import H, CNOT, Measure
量子线路:以上代码模块中core.circuit提供量子线路功能。
量子逻辑门操作:from qutrunk.circuit.gates import H, CNOT, Measure可以准备H门、CNOT门和测量操作。
步骤2:初始化量子线路,分配量子寄存器
qc = QCircuit()
qr = qc.allocate(2)```python
步骤3:应用量子逻辑门
H * qr[0]
CNOT * (qr[0], qr[1])
Measure * qr[0]
Measure * qr[1]
# print circuit
qc.print()
打印线路:量子线路部分代码编辑好之后,直接打印量子线路。(用Printer.+自定义函数。)
根据逻辑门操作预测所得结果:|00〉+|11〉态。
步骤4:Bell Pair量子线路运行及结果返回
# run circuit
res = qc.run(shots=1024)
# print result
print(res.get_measure())
print(res.get_counts())
目前QuTrunk已经通过运行代码直接可以输出量子线路图。
步骤5:输出运行结果
*qreg q[2]
creg c[2]
H * q[0]
MCX(1) * (q[0], q[1])
Measure * q[0]
Measure * q[1]
[{"00": 505}, {"11": 519}]*
定义量子寄存器:以上定义量子寄存器是通过qreg操作完成的。指令为qreg q[2]表示定义一个名为q的2位量子寄存器;同理,指令creg c[2]表示定义一个名为c的经典寄存器。
测量结果:测量结果为[{“00”: 505}, {“11”: 519}]。该结果表示量子线路运行次数分别为505、519,共计运行1024次。对以上程序进行多次运行,发现结果都不相同,比如第二、三次的运行结果分别为[{“00”: 507}, {“11”: 517}]、[{“00”: 528}, {“11”: 496}]。
打开IDE,先初始化量子编程工作区:windows上按ctrl+shift+p,macOS上command+shift+p打开命令行,输入quan搜索,选择quan:初始化量子编程工作区,执行初始化。启动初始化可视化编程工作区功能,将为用户建立一个虚拟工作区用于可视化编程。
再次按ctrl+shift+p/comand+shift+p,输入quan搜索,可以看到量子可视化编程已经出现,选择“quan:量子可视化编程“启动量子编程可视化功能。该功能允许用户生成多个可视化编程的qdoor文件,并且切换不同的qdoor文件生成不同的量子电路图,亦允许您使用编程的方式或者使用可视化拖拽的方式编辑电路图,将量子门图入电路图中生成电路图,将量子门从电路图中拖出可删除量子门。目前支持H、NOT、Sdg、Toffoli、Tdg、X、Y、Z、P、Rx、Ry、Rz、R、SqrtX、T、Measure,其中X、Y、Z、P、Rx、Ry、Rz允许添加一个控制位,Rx、Ry、Rz允许变更旋转角。并提供了关键字高亮,代码提示,代码自动完成等功能。借助Qutrunk的能力用户可以查看当前量子电路图的量子态统计。
在可视化编程页面,用户可以通过托拉拽的方式选择各图形化编程元素加入或者删除完成编程,删除只需将元素脱出窗外松开即可,可视化编程示例如下:
随着量子技术的不断发展,量子编程框架也在被人们不停的完善,使它更易于使用,兼容性也越来越好。通过上文的介绍,我们可以看到量子编程框架为开发人员提供了一个编程环境,简化了很多繁琐的基础步骤,使底层技术的复杂性不再是用户的问题,从而能够让更多的人可以参与到量子技术的研发上来,有利于推动量子技术的发展。