首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >中美量子技术产业区别对比(下)

中美量子技术产业区别对比(下)

作者头像
量子发烧友
发布2023-02-24 15:28:24
发布2023-02-24 15:28:24
1.6K0
举报
文章被收录于专栏:量子发烧友量子发烧友

接上篇:

中美量子技术产业区别对比(上)

(二)中美产品情况对比

通过兰德公司的这份报告,我们知道美国和中国目前在量子技术领域的竞争越来越激烈,并且在三个主要的应用领域中都有自己的研究成果和产品。探讨完中美两个国家的量子技术在宏观层面的区别后,接下来,我们将通过展示几个中美企业的具体产品和开源代码,来对比它们在产品技术层面上的不同。让我们分别看看它们产品的区别。

1. IBM 公司产品

2017年IBM公司开放了自家的量子计算云平台(IBM Quantum),允许用户通过网络使用IBM的量子计算机。平台的普通账号是免费申请的,通过此平台,用户可以通过云端体验量子计算机的功能。

在这个网站上,可以根据自己的喜好学习量子计算,IBM有提供分步教程和量子编程指南,无论你是新手还是相关从业人员,都能很快的掌握网站工具的使用;并且还能够通过网站查看 IBM 量子系统的状态、拓扑、校准数据和访问详细信息,让你更为直观地了解量子计算机的工作原理。

1.1 Quantum Composer(图形化量子编程工具)

此外,我们还能够使用 IBM 设计研发的图形化量子编程工具——IBM Quantum Composer进行教学和学习,这个工具可以让我们通过拖放操作构建量子电路,能够直观的看到电路的变化如何影响量子位的状态或显示测量概率或状态向量模拟的直方图;通过它构建的量子电路可以在真正的量子硬件或者模拟器上运行它们,以此来了解设备噪声的影响;IBM Quantum Composer不需要手动编写代码,而是自动生成OpenQASM 或 Python 代码,其行为方式与 Quantum Composer 创建的电路相同。

如何用Quantum Composer构建电路并可视化量子位状态(上图)

1.2 开源软件开发工具包——Qiskit

为了完善量子研究人员与应用程序开发的生态系统,IBM 推出了 Qiskit 项目,即支持量子计算机编程与使用的开源软件开发工具包。该软件工具套件的功能性在不断增加,目前能让使用者打造量子计算程序,并让它们在 IBM 真实的量子处理器或是可在线存取的量子仿真器上执行。

Qiskit 优化模型支持简单、高效率的优化问题建模,利用 IBM 的 Decision Optimization CPLEX (DOcplex) 建模工具。程序设计师只需要以他们平常的方式来写程序。现在软件开发者不需要顾虑电子零组件相关的问题,例如逻辑组件与 MOSFT。同样的,新发表的模型利用了一个标准量子电路数据库的优化资源,属于抽象编程的某个层级。

Qiskit 为量子电路层级的程序提供了一组程序代码工具,赋予远程访问的后台设备执行和管理功能。该模型开发的目的是在短时间内推动量子计算机算法的研发与基准检验,可借助Qiskit 提供基础的量子算法,解决不同类型的问题。

接下来我们看看如何安装 Qiskit 以及使用它完成更多类型的工作:

安装命令

可以直接使用 pip 命令安装 Qiskit 包:

代码语言:javascript
复制
pip install qiskit

若要使用其中的一些可视化功能,可以安装可视化包:

代码语言:javascript
复制
pip install qiskit[visualization]

检查安装

Qiskit 包含一列不同的元素,运行qiskit.__version__ 返回 qiskit-terra 包的版本,因为 qiskit 是来自 qiskit-terra 包。

可以使用 qiskit.__qiskit_version__ 查看所有 Qiskit 包元素的版本。

安装好之后我们就可以使用 Qiskit 进行编程了,使用 Qiskit 的基本流程为:

1. Build:构造量子线路表示要解决的问题

2. Execute:选择后台,执行实验

3. Analyze:计算汇总统计,构造实验结果

这里用一个简单的例子看一下它的使用方法:

代码语言:javascript
复制
import numpy as np
from qiskit import(
QuantumCircuit,
execute,
Aer)
from qiskit.visualization import plot_histogram

# Use Aers qasm_simulator
simulator = Aer.get_backend('qasm_simulator')

# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(2, 2)

# Add a H gate on qubit 0
circuit.h(0)

# Add a CX (CNOT) gate on control qubit 0 and target qubit 1
circuit.cx(0, 1)

# Map the quantum measurement to the classical bits
circuit.measure([0,1], [0,1])

# Execute the circuit on the qasm simulator
job = execute(circuit, simulator, shots=1000)

# Grab results from the job
result = job.result()

# Returns counts
counts = result.get_counts(circuit)
print("\nTotal count for 00 and 11 are:",counts)

# Draw the circuit
circuit.draw()

# Plot a histogram
plot_histogram(counts)

运行结果如下:

完成上述程序大致需要经过6个步骤:

  1. 导入需要的包

上面的程序中,需要导入的包主要有下面几个:Quantumcurcuit:这个包是量子系统的操作指南,它包含了各个需要的量子操作 excute:这个包用来执行量子电路 Aer:这个包用来指定使用何种方法在后台运行上面的量子电路 plot_histogram:这个包用来建立直方图。

2. 初始化变量

代码语言:javascript
复制
circuit = QuantumCircuit(2,2)

这个代码的第一个参数表示输入零态量子比特的个数,第二个参数表示输入零态经典比特的个数。这句代码表示创建了一个有两个量子比特,两个经典比特输入的量子电路。

3. 添加需要的门

代码语言:javascript
复制
circuit.h(0)
circuit.cx(0, 1)
circuit.measure([0,1], [0,1])

QuantunCircuit.h(0):为 qubit 0 添加一个 Hadamard 门,该门将输入态转换为叠加态。

QuantumCircuit.cx(0, 1):添加一个从 qubit 0 作用到 qubit 1 的 C-NOT 门。

QuantumCircuit.measure([0,1], [0,1]):将第一个列表中对应位置 qubit 的测量结果,保存到第二个列表对应位置的经典 bit 中。整体表示,对 qubit 0 和 qubit 1 进行测量,将他们的结果分别保存到 bit 0 和 bit 1 中。

4. 查看设计电路

代码语言:javascript
复制
circuit.draw()

使用qiskit.circuit.QuantumCircuit.draw()可以查看上面设计的电路。下面是构建的线路

在这个量子电路中,上面的是qubit 0,下面的是qubit 1,整个线路从左到右运行,比特从左到右依次通过,每个门。

默认的 QuantumCircuit.draw() 和 qiskit.visualization.circuit_drawer() 使用文本模式,可以根据本地环境选择其他的展示方式,默认使用在 ~/.qiskit/settings.conf 的配置文件中指定的 circuit_drawer = * 绘图方式,也可以在 QuantumCircuit.draw() 中使用字符串指定绘图的方式,可以指定的方式包括:

5. 模拟实验

Qiskit Aer 是一个高性能的量子线路模拟框架,它提供了很多模拟后台使用,如果 Aer 出错了,可以使用 Qiskit Terra 中的 Basic Aer 来代替,即使用下面的导入包:

代码语言:javascript
复制
import numpy as np
from qiskit import(
QuantumCircuit,
execute,
BasicAer)

下面的代码使用qasm_simulator运行量子线路,使用Aer.get_backend()指定模拟器。

代码语言:javascript
复制
simulator = Aer.get_backend('qasm_simulator')  #指定模拟器
job = execute(circuit, simulator, shots=1000)  #执行量子线路
result = job.result()
counts = result.get_counts(circuit)
print("\nTotal count for 00 and 11 are:",counts)

"""
Total count for 00 and 11 are: {'00': 504, '11': 496}
"""

execute是可以指定三个参数,分别是运行的量子线路名(circuit)、使用哪个模拟器(simulator)、执行多少次(shots,默认为1024次)。可以通过result.get_counts(circuit)获取指定线路的运行结果。

6. 图形化得到的结果

代码语言:javascript
复制
plot_histogram(counts)

可以使用plot_histogram函数,以直方图的形式展示线路执行的结果。


以上就是使用Qiskit建立量子电路,并进行实验结果构建的整个过程。

2.AWS云计算

Amazon Web Services (AWS) 是世界上最大的公共云平台,由亚马逊推出。目前AWS利用全球数据中心提供超过200项功能齐全范围广泛的服务。这些服务包括计算能力、人工智能、区块链、量子技术、物联网、增强现实等等,甚至还有专为卫星设计的Amazon地面站服务。很多初创公司、大型企业和一些政府机构都在使用 AWS 来降低成本、提高敏捷性进行创新。

在量子技术方面,AWS为用户提供了Braket服务,Amazon Braket是一项完全托管式量子计算服务,旨在帮助加快量子计算的科学研究和软件开发。通过Braket,用户可以使用一组一致的开发工具处理不同类型的量子计算机和电路模拟器,更快地构建量子软件。

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算法。

通过本地安装Jupyter即可进行量子线路的编程,首先我们需要安装AWS Braket SDK:

代码语言:javascript
复制
pip install amazon-braket-sdk

安装好Braket后,我们可以在本地模拟量子环境,可以利用Jupyter在本地运行Bell算法,示例如下:

代码语言:javascript
复制
import matplotlib.pypiot as plt
%matplotlib inline

# ANS imports: Import Braket SDK modules
from braket.circuits import Circuit
from braket.devices import LocalSimulator

bell = Circuit ).h(0).cnot (control = 0,target = 1)

# set up device
device = LocalSimulator()

# run circuit
result = device.run (bell,shots=1000).result()
# get measurement shots
counts = result.measurement_counts

print(counts)

最终得到结果:

代码语言:javascript
复制
Counter({'00':501,'11':499})

如果需要可视化结果,可以使用可视化库进行显示:

代码语言:javascript
复制
import matplotlib.pyplot as plt
plt.bar (counts.keys (), counts.values ())
plt.xlabel('bitstrings')
plt.ylabel('counts')

得到结果:

代码语言:javascript
复制
Text(0,0.5,'counts')

3. 本源量子产品

本源量子云平台(qcloud )上线于2017年10月,目前公司已对外开放6比特超导量子计算机“本源悟源”,依托于这台由本源推出的完全自主知识产权的超导量子计算机,用户可以通过云的方式进行访问,在云平台进行编程,实现运行量子计算程序和编写量子应用的功能。云平台共有真实量子计算云、仿真开发云、应用推广云、科普教育云与量子社区云组成。

3.1 本源量子云的几大功能

1. 真实量子计算云:本源量子拥有对标谷歌、IBM 的超导量子计算机(本源悟源),以及对标英特尔的半导体量子计算机(本源悟本),为客户提供先进的量子计算服务。

2.仿真开发训练云:本源量子提供业界最全的全振幅、部分振幅、单振幅、含噪声等量子虚拟机计算服务,为量子计算开发者提供最专业的开发训练环境。

3. 应用推广云:本源量子将最新的量子计算技术与金融分析、生化模拟、人工智能、大数据等领域相结合,为行业提供丰富的应用解决方案。

4.科普教育云:为了普及量子计算教育,本源量子提供了业界最优质的量子计算学习资源,无论您是从业人员还是爱好者,总能找到适合自己的学习资源。

5.量子社区云:与小伙伴一起探讨量子计算问题,紧跟大牛了解最新量子计算知识,本源量子为从业者搭建量子计算沟通交流平台。

其中,本源量子推出的仿真开发训练云,也利用图形化的方式来反映量子电路,通过拖拽量子逻辑门就能够搭建量子电路,并能够支持多个逻辑门成组操作,编辑效率可以大大提升,对于量子编程新手或者其他领域的开发者学习量子相关知识非常有帮助。

3.2 本源量子开源SDK——QPanda-2

QPanda-2 是由本源量子开发的开源量子计算编程框架。其支持主流的量子逻辑门操作,并且可对不同平台下的量子程序进行针对性优化,可适配多种量子芯片。QPanda-2 使用C++语言作为经典宿主语言,并支持以QRunes和QASM书写的量子语言。

目前,QPanda 2.0支持本地仿真运行模式,最高可支持到32位,它集成了量子虚拟机,封装了主流的量子算法。可在无芯片支持的情况下验证量子应用的可靠性和有效性。加上增加了控制流的概念使得量子程序可进行逻辑判断,从而符合高级语言的编程习惯。

QPanda-2 提供基于量子编程的开发环境,可以被应用于各类量子算法(Quantum algorithm )的编程实现,或用于部署于各类量子计算机或量子虚拟机进行计算,还可以应用于量子计算领域的研究和产品开发。

同样的,让我们来看看QPanda-2如何来搭建量子电路:

接口介绍

在QPanda-2中,QCircuit类是一个仅装载量子逻辑门的容器类型,它也是QNode中的一种,初始化一个QCircuit对象有以下两种

C++风格

代码语言:javascript
复制
QCircuit cir = QCircuit();

C语言风格

代码语言:javascript
复制
QCircuit cir = CreateEmptyCircuit();

代码语言:javascript
复制
QCircuit cir = createEmptyCircuit();

并可以通过如下方式向QCircuit尾部填充节点

代码语言:javascript
复制
QCircuit << QGate;

QGate是量子逻辑门类型。

同时,也可以对目标线路施加装置共轭和受控操作,QCircuit类型有两个成员函数可以做转置共轭操作:dagger、setDagger。

setDagger的作用是根据输入参数更新当前量子线路的dagger标记,在计算时计算后端会根据dagger判断当前量子逻辑门是否需要执行转置共轭操作。举个例子:

代码语言:javascript
复制
QCircuit cir;
cir.setDagger(true);

该函数需要一个布尔类型参数,用来设置当前逻辑门是否需要转置共轭操作。

dagger的作用是复制一份当前的量子线路,并更新复制的量子线路的dagger标记。举个例子:

代码语言:javascript
复制
QCircuit cir;
QCircuit cir_dagger = cir.dagger();

除了转置共轭操作,您也可以为量子线路添加控制比特,.QCircuit类型有两个成员函数用于添加控制比特:control、setControl。

setControl的作用是给当前的量子线路添加控制比特,例如:

代码语言:javascript
复制
QCircuit cir;
cir.setControl(qvec);

control的作用是复制当前的量子线路,并给复制的量子线路添加控制比特,例如:

代码语言:javascript
复制
QCircuit cir;
QCircuit cir_control = cir.control(qvec);

上述都需要接收一个参数,参数类型为QVec,QVec是qubit的vector容器类型。

实例

代码语言:javascript
复制
#include "QPanda.h"
USING_QPANDA

int main(void)
{
init();
auto qvec = qAllocMany(4);
auto cbits = cAllocMany(4);
auto circuit = createEmptyCircuit();
auto prog = createEmptyQProg();

// 构建量子线路
circuit << H(qvec[0]) << CNOT(qvec[0], qvec[1])
<< CNOT(qvec[1], qvec[2]) << CNOT(qvec[2], qvec[3]);

// 设置量子线路共轭转置
circuit.setDagger(true);

// 构建量子程序,将量子线路插入到量子程序中
prog << H(qvec[3]) << circuit << Measure(qvec[0], cbits[0]);

// 量子程序运行1000次,并返回测量结果
auto result = runWithConfiguration(prog, cbits, 1000);

// 打印量子态在量子程序多次运行结果中出现的次数
for (auto &val : result)
{
std::cout << val.first << ", " << val.second << std::endl;
}

finalize();
return 0;
}

运行结果为:

代码语言:javascript
复制
0000, 510
1000, 490

构建模块化的量子线路

在比特数量比较多,量子算法比较复杂的情况下,可能我们需要把多个比较小的量子线路组成成一整个大的量子程序,QPanda-2可以以一种比较方便的模式去构建这种模块。

  1. 用于生成量子线路(量子程序)的函数

QPanda中最常见的做法是用C++函数来定义一个量子线路模块。它通常具有一个QCircuit或者QProg类型的返回值。例如:

代码语言:javascript
复制
QCircuit foo(Qubit* qubit1, Qubit* qubit2)
{
QCircuit cir;
cir << H(qubit2) << CNOT(qubit1, qubit2) << H(qubit2);
return cir;
}

这样的一个函数代表了一个模块(如图),当以不同的qubit1和qubit2作为输入的时候,它相当于把这个模块放置在了量子线路的不同位置。

2. Qubit分配(qAlloc)与映射

QPanda-2 中量子比特是用一个 Qubit* 的指针对象进行表示的。Qubit 本身不包含任何和量子态相关的数据,它只是一个用于映射物理量子比特的对象。qAlloc 这个函数可以从量子芯片未用到的量子比特池中申请一个量子比特。qAllocMany 则可以申请到一批。示例:

代码语言:javascript
复制
Qubit* q=qAlloc();
QVec qs=qAllocMany(3);

如图:

3. 使用编写好的模块

前面写好的foo,就可以被用于不同的量子比特上,以构建一个更大的量子程序,例如我们可以把这一段线路作用在q和qs上:

代码语言:javascript
复制
QProg prog;
prog << foo(q, qs[0]) << foo(qs[1],qs[2]) << foo(qs[2], q);

这样,这个量子程序对应了下面这个量子线路:

4. 利用QVec(vector)构建模块的方式

QVec继承了vector类,因此它可以覆盖所有vector所包含的功能(operator[],size(),push_back,iterator……),当然也可以利用C++11的新式for循环。

下面这个程序利用了一组量子比特(数量不定)去构建一个量子线路,对这组量子比特中每一个,都作用一个Hadamard门。

代码语言:javascript
复制
QCircuit foo2(QVec qs)
{
QCircuit cir;
for (auto qubit: qs){
cir << H(q);
}
return cir;
}

如果qs中只有一个量子比特,那这个线路就是:

如果qs中有N个量子比特,那这个线路自然就是:

所以,下面这个量子程序代表了如下图所示的量子模块:

代码语言:javascript
复制
QCircuit foo2(QVec qs)
{
QCircuit cir;
cir << H(q[0]);
for (int i=1;i<qs.size();++i)
{
cir << CNOT(q[i-1], q[i]);
}
return cir;
}

(三)总结

通过上述几个实例,我们可以看到美国和中国的企业在量子技术科学中的发展情况。我们可以发现无论中美,都在依托于自身的量子计算机硬件,发展自己的开源项目,搭建量子技术云服务,为各行各业提供完善的开源SDK。其目的在于抢占量子领域的市场,培养开发者的使用习惯,扩大自身的市场份额。

但相对地,中美之间也有许多差别,比如在云计算平台的搭建上,IBM 已经在布局在更大的高校教育市场,而本源量子在这一方面的目标似乎不是特别的明显;在硬件方面,IBM 产出了能够控制127个量子比特数的量子计算机,本源目前能够控制的数量则为6个。

目前,量子领域作为一个蓝海平台,有越来越多的研究者投入其中,相信在不久的将来,量子领域会随着他们的贡献和产出,迎来行业内的“大爆发”,已在领域内的研究机构和企业,也应该抓住机遇,进行布局,将量子技术推向新的高度。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量子发烧友 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档