草庐IT

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

热罐小角 2023-03-28 原文
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,分别表示左矢和右矢,是一种简单地表示量子状态的方法。

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

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

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

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

对量子计算机软件设计而言,最重要的基础是量子比特(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个零,这个恐怖的数字超出了人类的想象。

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

Amazon Braket的样子

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

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

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

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

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

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

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) 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');

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

# 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后技术老炮儿 云计算和数字化技术的创业者 创业公司被收购之后,继续求索云和数字化技术

历史

有关【AWS征文】小白终于也能玩上真正的量子计算了!的更多相关文章

  1. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  2. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  3. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  4. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  5. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  6. ruby-on-rails - 缺失区域;使用 :region option or export region name to ENV ['AWS_REGION' ] - 2

    我知道还有其他相同的问题,但他们没有解决我的问题。我不断收到错误:Aws::Errors::MissingRegionErrorinBooksController#create,缺少区域;使用:region选项或将区域名称导出到ENV['AWS_REGION']。但是,这是我的配置开发.rb:config.paperclip_defaults={storage::s3,s3_host_name:"s3-us-west-2.amazonaws.com",s3_credentials:{bucket:ENV['AWS_BUCKET'],access_key_id:ENV['AWS_ACCE

  7. ruby - 使用 Ruby,计算 n x m 数组的每一列中有多少个 true 的简单方法是什么? - 2

    给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in

  8. arrays - 计算数组中的匹配元素 - 2

    给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at

  9. ruby-on-rails - 如何计算 Ruby/Rails 中 JSON 对象的数量 - 2

    Ruby中如何“一般地”计算以下格式(有根、无根)的JSON对象的数量?一般来说,我的意思是元素可能不同(例如“标题”被称为其他东西)。没有根:{[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]}根包裹:{"posts":[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]} 最佳答案 首先,withoutroot代码不是有效的json格式。它将没有包

  10. ruby - 如何计算自 Ruby 中给定日期以来的周数? - 2

    目标我正在尝试计算自给定日期以来周的距离,而无需跳过任何步骤。我更喜欢用普通的Ruby来做,但ActiveSupport无疑是一个可以接受的选择。我的代码我写了以下内容,这似乎可行,但对我来说似乎还有很长的路要走。require'date'DAYS_IN_WEEK=7.0defweeks_sincedate_stringdate=Date.parsedate_stringdays=Date.today-dateweeks=days/DAYS_IN_WEEKweeks.round2endweeks_since'2015-06-15'#=>32.57ActiveSupport的#weeks

随机推荐