小白终于也能玩上真正的量子计算了!
点击蓝字关注,一起探讨更好玩的IT世界
2019年底云计算江湖来了一波量子计算的小高潮,先是11月4日微软发布了Azure Quantum服务,12月AWS又在ReInvent 2019上发布Amazon Braket,让码农们各种激动。我还写了一篇文章:AWS每年的大招又来了,第一个就介绍了AWS这个量子计算的新产品。只可惜那个时候都是预览版,小白是无法直接上手使用的。直到一年以后的8月,AWS终于官宣了这个产品的GA,可以在美东(北弗吉尼亚)和美西(北加州和俄勒冈)三个区域使用,真是千呼万唤始出来。相比于隔壁的Azure Quantaum一直需要申请早鸟使用,也是快了那么一点点。
量子计算扫盲篇
Braket这个名字还是很有讲究的,来自于著名的量子物理学家保罗·狄拉克(Paul Adrien Maurice Dirac,1902年8月8日-1984年10月20日)1939年提出的“bra-ket”符号,也叫狄拉克(Dirac)符号。他把括号Bracket这个词一分为二,左边是bra,右边是ket,分别表示左矢和右矢,是一种简单地表示量子状态的方法。
Amazon Braket的样子
Amazon提供了开源的Braket Python的SDK(https://github.com/aws/amazon-braket-sdk-python),可以用于编写量子计算的代码。我个人觉得最简单的还是在Console里直接创建Notebook的虚拟机,免去了配置环境的麻烦。这个虚拟机自动部署了Anaconda 3.0的环境和Braket Python SDK,并提供了一些Braket的算法示例,用于测试和学习。
下面我们来看一段最简单的python代码,用来模拟两个量子位之间的最大纠缠贝尔态,在AWS的Braket里可以随意切换模拟器或者使用Rigetti/IonQ的硬件执行。
贝尔态是爱尔兰物理学家约翰·斯图尔特·贝尔提出的描述两个量子比特四种最大的纠缠态,即00,01,10,11。具体的物理我就不说了,反正我也不是专家,不能不懂装懂。结论很简单,就是在最大纠缠的状态下,两个量子比特的测量结果“一定相同”或者“一定不同”。下面的代码构建了如下图所示的一个回路,实现了贝尔态。
首先是导入相关的库:
# 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)
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');
# set up the managed simulator
device = AwsDevice("arn:aws:braket:::device/quantum-simulator/amazon/sv1")
结果也是类似的,运行完了以后,在Console的Task里就会出现刚才执行的任务情况。
在S3的Bucket里面也会出现刚才运行的结果,这是个result.json文件,记录了1000次量子测量的结果,并记录纠缠的结果。
接下来就是激动人心的真实硬件运行了。其实这些硬件资源还是特别紧张的,在我测试的时候,除了D-Wave可以用以外,IonQ要1天以后才有资源,Rigetti也要10小时以后,不过我们可以通过代码的方式,创建任务,等机器空出来了,就可以执行获得结果了。
# 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,这在经典的模拟计算机上是没有的,结果如下:
量子纠缠也是量子计算里非常有趣的特性,任何关于量子计算的教材里都会提到,比如Azure Quantum的教程里也有类似的内容,只是微软用的是Q#(qdk)来实现的。(https://docs.microsoft.com/en-us/quantum/tutorials/explore-entanglement),同样可以在Jupyter或者Visual Studio Code里运行,也是实现了H门和CNOT门。
总结
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),又解锁了量子计算的新技能。相信要不了多久,量子计算将会进入我们的日常生活,新一代的码农或许又有了更多改变世界的机会。
曾今,伏案只识技术世界
而后,抬头遍历创业之艰
现如今
不惑之年
以创业者眼光,再探技术世界
长按二维码关注,一起窥探云上世界
🔻
关于作者
Hotcan,80后技术老炮儿
云计算和数字化技术的创业者
创业公司被收购之后,继续求索云和数字化技术
历史文章
免责申明:
本公众号不以盈利为目的,内容仅供参考,个人及所属公司对发布的信息不作任何保证和承诺。如需转载,请您注明出处和保持信息完整性。如有未注明作者及出处信息或图片,请版权所有者联系我们,我们将及时补上,感谢您的辛勤创作。