2019年底云计算江湖来了一波量子计算的小高潮,先是11月4日微软发布了Azure Quantum服务,12月AWS又在ReInvent 2019上发布Amazon Braket,让码农们各种激动。我还写了一篇文章:AWS每年的大招又来了,第一个就介绍了AWS这个量子计算的新产品。只可惜那个时候都是预览版,小白是无法直接上手使用的。直到一年以后的8月,AWS终于官宣了这个产品的GA,可以在美东(北弗吉尼亚)和美西(北加州和俄勒冈)三个区域使用,真是千呼万唤始出来。相比于隔壁的Azure Quantaum一直需要申请早鸟使用,也是快了那么一点点。

【AWS征文】小白终于也能玩上真正的量子计算了!

量子计算扫盲篇

Braket这个名字还是很有讲究的,来自于著名的量子物理学家保罗·狄拉克(Paul Adrien Maurice Dirac,1902年8月8日-1984年10月20日)1939年提出的“bra-ket”符号,也叫狄拉克(Dirac)符号。他把括号Bracket这个词一分为二,左边是bra,右边是ket,分别表示左矢和右矢,是一种简单地表示量子状态的方法。

【AWS征文】小白终于也能玩上真正的量子计算了!

再往下的数学物理我就基本上搞不懂了,翻翻20年前的大学物理课本好像也看不懂啥,当然量子物理不是我今天要谈的内容,关键是量子计算!量子计算(Quantum Computing)主要是利用量子力学的原理来处理信息,这和我们经典计算机是不一样的。经典计算机使用的是硅材料芯片,而量子计算机使用的是原子、离子、光子或电子等材料。

要搞明白量子计算,有几个关键的概念是必须理解的:叠加(Superposition),量子测量(Quantum measurement),纠缠(Entanglement)和量子比特(Qubits)。

一个中年大叔,在健身房里锻炼身体,要么向左转,要么向右转。用计算机的语言来说,我的状态要么是0,要么是1,不能同时向左或向右,即同时是0又是1。但是如果我是一个量子粒子,我就可以以一定的概率向左转,又有一定的概率向右转,我是无数个介于0或者1状态的线性组合,直到美女教练来看我,才能知道我的状态到底是0还是1。我这种介于0或者1的状态,就是叠加。美女教练来看我的时候,我要么向左,要么向右,而不是同时在左或者右的状态,就叫做量子测量。我因为教练的美貌,崩塌(collapsed)成了某个确定的状态。

如果美女教练看上了我,她选择跟我的状态保持一致或者相反,如果我的状态是0,那么她的状态就是0或1,无论天涯海角,无论海枯石烂,不管多少光年之外,只要我坍塌了,她同时也坍塌,这种关系就叫做量子纠缠。

【AWS征文】小白终于也能玩上真正的量子计算了!
对量子计算机软件设计而言,最重要的基础是量子比特(qubit),对应的就是经典计算机里的bit。经典计算机里的bit是0或者1,而处于叠加态的qubit则是有一定概率是0,有一定概率是1,比如说我们可以设置70/30的概率,也就意味着这个叠加态的qubit有70%的概率是0,30%的概率是1,这种概率的状态对计算产生了巨大的优势。对于处于叠加态的2个qubits而言,每个qubits可以是0,1或者同时,也就意味着可以同时表示4个值,即00,01,10,11,而不像经典计算机里同时只能表示一个值,这对计算的速度和效率会产生巨大的优势。例如下面将会提到的拥有2048个量子位的D-Wave量子计算机,同时可以表示2^2048个值,大约是3.23E+616,也就是3后面跟着616个零,这个恐怖的数字超出了人类的想象。

写到这里,我想起了得到上老喻的《人生算法》课上的内容,其实我们的人生说到底,无非是各种不同的概率组合而已,量子计算,也是在玩概率的游戏。量子计算机是不是未来可以真正地模拟人生呢?

【AWS征文】小白终于也能玩上真正的量子计算了!

Amazon Braket的样子

Amazon Braket定义了一个新的概念叫做QPU(Quantum Processing Unit),抽象了量子计算的处理单元,提供了三种不同的量子硬件,包括:

1,D-Wave,运行着2048个量子比特(qubits)的量子退火处理器。量子退火使用一个物理过程来寻找一个低能量配置,编码一个优化问题的解决方案。这个和下面基于门的量子比特技术是完全不同的技术。下图是Amazon的提供的D-Wave 2000Q的真实样子。

【AWS征文】小白终于也能玩上真正的量子计算了!

2,IonQ,提供了基于门的11个量子比特的离子阱计算机。单个离子通过周围电极产生的电磁阱保持在真空中,使用激光脉冲来执行栅极操作。具有相对较长的相干时间和良好的连通性。这是IonQ的样子。

【AWS征文】小白终于也能玩上真正的量子计算了!

3,Rigetti,提供基于超导量子位的通用门计算机。用30个在低温下工作的超导量子比特。超导量子比特具有易耦合,电子控制和快速门等优点。Rigeti 16Q Aspen-4看上去是下面这样的。

【AWS征文】小白终于也能玩上真正的量子计算了!

好吧,我承认对于上面几个关于量子计算机硬件的介绍,我还是不是特别明白,看图片感觉上反正是各种高大上的样子,具体的物理过程其实我也不需要懂,还是赶紧去看看AWS Braket到底是什么样子的吧。

登陆到AWS的Console上,可以看到Braket已经可以直接申请了。完成之后,就能看到刚才介绍的三种不同的硬件和AWS提供的模拟器SV1。我们可以通过创建虚拟机,跑Python Notebook的实例,在模拟器SV1或者是真实的环境上运行量子算法。

【AWS征文】小白终于也能玩上真正的量子计算了!

【AWS征文】小白终于也能玩上真正的量子计算了!

Amazon提供了开源的Braket Python的SDK(https://github.com/aws/amazon-braket-sdk-python ),可以用于编写量子计算的代码。我个人觉得最简单的还是在Console里直接创建Notebook的虚拟机,免去了配置环境的麻烦。这个虚拟机自动部署了Anaconda 3.0的环境和Braket Python SDK,并提供了一些Braket的算法示例,用于测试和学习。

【AWS征文】小白终于也能玩上真正的量子计算了!

下面我们来看一段最简单的python代码,用来模拟两个量子位之间的最大纠缠贝尔态,在AWS的Braket里可以随意切换模拟器或者使用Rigetti/IonQ的硬件执行。

贝尔态是爱尔兰物理学家约翰·斯图尔特·贝尔提出的描述两个量子比特四种最大的纠缠态,即00,01,10,11。具体的物理我就不说了,反正我也不是专家,不能不懂装懂。结论很简单,就是在最大纠缠的状态下,两个量子比特的测量结果“一定相同”或者“一定不同”。下面的代码构建了如下图所示的一个回路,实现了贝尔态。

【AWS征文】小白终于也能玩上真正的量子计算了!

首先是导入相关的库:

# general imports
import boto3
import numpy as np
import matplotlib.pyplot as plt
# magic word for producing visualizations in notebook
%matplotlib inline
import string
import time

# AWS imports: Import Braket SDK modules
from braket.circuits import Circuit, Gate, Instruction, circuit, Observable
from braket.devices import LocalSimulator
from braket.aws import AwsDevice, AwsQuantumTask

接下来定义相应的账号和S3的存储桶信息,然后定义相应的阿达马门(Hadamard Gate)和量子非门(CNOT Gate):

aws_account_id = boto3.client("sts").get_caller_identity()["Account"]
my_bucket = f"amazon-braket-{aws_account_id}" # the name of the bucket
my_prefix = "simulation-output" # the name of the folder in the bucket
s3_folder = (my_bucket, my_prefix)
# define circuit
bell = Circuit().h(0).cnot(0, 1)
# print circuit
print(bell)
T  : |0|1|

q0 : -H-C-
        |
q1 : ---X-

T  : |0|1|

先在本地模拟器上测试:

# set up device: Local Simulator
device = LocalSimulator()
# run circuit (execute single TASK)
result = device.run(bell, shots=1000).result()
# get measurement shots
counts = result.measurement_counts
# print counts
print(counts)

Counter({'00': 515, '11': 485})

这个输出表示1000个测量里,有515个是00状态,485个是11状态。我们也可以画个图来显示一下。

# plot using Counter
plt.bar(counts.keys(), counts.values());
plt.xlabel('bitstrings');
plt.ylabel('counts');

【AWS征文】小白终于也能玩上真正的量子计算了!

接下来我们修改一点代码,让代码在云上的模拟器上运行,也就是SV1,他拥有34个量子位。修改很简单,改一句话就好了。

【AWS征文】小白终于也能玩上真正的量子计算了!


# set up the managed simulator
device = AwsDevice("arn:aws:braket:::device/quantum-simulator/amazon/sv1")

【AWS征文】小白终于也能玩上真正的量子计算了!

结果也是类似的,运行完了以后,在Console的Task里就会出现刚才执行的任务情况。

【AWS征文】小白终于也能玩上真正的量子计算了!

在S3的Bucket里面也会出现刚才运行的结果,这是个result.json文件,记录了1000次量子测量的结果,并记录纠缠的结果。
【AWS征文】小白终于也能玩上真正的量子计算了!

接下来就是激动人心的真实硬件运行了。其实这些硬件资源还是特别紧张的,在我测试的时候,除了D-Wave可以用以外,IonQ要1天以后才有资源,Rigetti也要10小时以后,不过我们可以通过代码的方式,创建任务,等机器空出来了,就可以执行获得结果了。

【AWS征文】小白终于也能玩上真正的量子计算了!

# set up device
ionq = AwsDevice("arn:aws:braket:::device/qpu/ionq/ionQdevice")

# run circuit with a polling time of 5 days
ionq_task = ionq.run(bell, s3_folder, shots=1000, poll_timeout_seconds=5*24*60*60)

# get id and status of submitted task
ionq_task_id = ionq_task.id
ionq_status = ionq_task.state()
# print('ID of task:', ionq_task_id)
print('Status of task:', ionq_status)

这里我们设置了5天的超时,任务会在5天内执行完成,否则就不执行了,当然可以预期结果也是比较类似的。在真实的量子计算机上出现了四种状态,即00,01,10,00,这在经典的模拟计算机上是没有的,结果如下:

【AWS征文】小白终于也能玩上真正的量子计算了!

【AWS征文】小白终于也能玩上真正的量子计算了!

量子纠缠也是量子计算里非常有趣的特性,任何关于量子计算的教材里都会提到,比如Azure Quantum的教程里也有类似的内容,只是微软用的是Q#(qdk)来实现的。(https://docs.microsoft.com/en-us/quantum/tutorials/explore-entanglement ),同样可以在Jupyter或者Visual Studio Code里运行,也是实现了H门和CNOT门。

【AWS征文】小白终于也能玩上真正的量子计算了!

总结

AWS并不是第一个提供量子云服务的厂商,但是是我能摸到的第一个。IBM在2016年就推出了22个量子位的量子计算服务,之前我也说了微软在AWS之前推出了Azure Quantum,只是我辈小白不能用而已。微软的服务也有IonQ的硬件,还有Honeywell和Quantum Circuits(QCI)的硬件,Honeywell最近推出的硬件包含64个量子位。

事实上到今天为止量子计算还是实验性质的,传统计算机能做所有量子计算机能做的事情,只是可能在特定领域慢一点而已。前天又有一条新闻说Google继去年实现量子优越性以后,对化学反应进行了模拟,在Science上又发表了一篇新文章《超导量子比特量子计算机的 Hartree-Fock 近似模拟》(Hartree-Fock on a Superconducting Qubit Quantum Computer),又解锁了量子计算的新技能。相信要不了多久,量子计算将会进入我们的日常生活,新一代的码农或许又有了更多改变世界的机会。

【AWS征文】小白终于也能玩上真正的量子计算了!

关于作者

Hotcan,80后技术老炮儿
云计算和数字化技术的创业者
创业公司被收购之后,继续求索云和数字化技术

历史