上一章: 量子性能分析
本源量子云服务
在复杂的量子线路模拟中,需要利用高性能计算集群或真实的量子计算机。使用云计算代替本地计算可以降低用户的计算成本,并提供更优的计算体验。
本源量子云平台通过本源司南量子操作系统将任务提交到远程部署的量子计算机或计算集群,并接收返回的结果。该过程如下图所示。
Origin Quantum Cloud platform
pyqpanda3 封装了多种量子计算服务,支持将计算指令发送到本源的计算服务器集群或真实量子芯片,并获取计算结果。具体流程如下图所示。
Quantum Cloud Services
用户首先需要注册并访问最新的本源量子云计算网站:本源量子云。
Quantum Origin
接下来,点击右上角的工作台进入量子计算访问界面。
在界面上,您可以看到各种计算服务,包括虚拟计算和真实量子计算。然后,您需要获取 api_token 和其他相关信息。 api_token 是每个用户访问量子云计算资源的唯一标识符,可在个人账户中心获取。
Quantum Origin
api_token 是访问量子计算资源的重要凭证,请妥善保管。
在 pyqpanda3 中,我们使用 QCloudService 来构建量子云服务并获取计算后端。用户需要提供自己的 api_key。
Python
apikey = "XXXXXXXX"
service = QCloudService(apikey)
请从 https://account.originqc.com.cn/ 获取您的真实 api_token,然后查询所有支持的计算后端。
backends = service.backends()
以下是一些常用的计算后端及其对应的量子比特数。
- 注解
- 名称带有
amplitude
后缀的后端表示其使用超算集群模拟量子计算,其他名称代表真实的量子芯片后端。
+----------------------------------------------------------+
|后端名称 |后端类型 | 最大量子比特数
+----------------------------------------------------------+
|full_amplitude |模拟器 | 33
+----------------------------------------------------------+
|single_amplitude |模拟器 | 200
+----------------------------------------------------------+
|partial_amplitude |模拟器 | 64
+----------------------------------------------------------+
|origin_wukong |物理量子芯片 | 72
-----------------------------------------------------------+
请注意,计算后端会不定期更新。
可以通过后端名称获取具体的计算后端。目前,芯片后端支持最新的本源 Wukong 72 量子比特芯片。
backend = service.backend("origin_wukong")
如果在任务执行过程中发生错误,可以选择启用日志功能以查看详细信息。
Python
apikey = "XXXXXXXX"
service = QCloudService(apikey)
service.setup_logging(LogOutput.CONSOLE)
service.setup_logging(LogOutput.FILE, "test.log")
高性能计算集群云服务
所有虚拟机均通过 run
方法提交量子计算任务至超算集群,例如全振幅计算。
Python
from pyqpanda3.qcloud import QCloudService, QCloudOptions, QCloudJob, QCloudResult
prog = QProg()
prog << H(0) << CNOT(0, 1) << measure(0, 0) << measure(1, 1)
api_key = "XXXXXXXXXXXXXXX"
service = QCloudService(api_key=api_key)
backend = service.backend("full_amplitude")
job = backend.run(prog, 1000)
job.job_id 可用于获取任务 ID。
print("job id : ", job.job_id())
所有任务均支持同步和异步提交方式,示例如下。
真实量子设备
真实芯片的接口使用方式类似,可以根据后端名称获取计算后端。
提交计算任务的 run
方法支持批量任务。
Python
prog = QProg()
prog << H(0) << CNOT(0, 1) << measure(0, 0) << measure(1, 1)
api_key = "302e020100301006d0202010104"
service = QCloudService(api_key=api_key)
backend = service.backend("origin_wukong")
options = QCloudOptions()
job = backend.run([prog, prog], 1000, options)
probs_list = job.result().get_probs_list()
for result in probs_list:
print(result)
运行结果如下:
{'00': 0.3166741132736206, '01': 0.013481048867106438, '10': 0.06137626618146897, '11': 0.6084685921669006}
{'00': 0.35036635398864746, '01': 0.013929451815783978, '10': 0.06072771921753884, '11': 0.5749766230583191}
异步方式如下:
Python
prog = QProg()
prog << H(0) << measure(0, 0) << measure(1, 1)
api_key = "302e020100d8772eb9705e844394453a3c8a/6327"
service = QCloudService(api_key=api_key)
backend = service.backend("origin_wukong")
options = QCloudOptions()
job = backend.run([prog, prog], 1000, options)
import time
while True:
status = job.status()
if status == JobStatus.FINISHED:
break
time.sleep(5)
for result in job.result().get_probs_list():
print(result)
运行结果如下:
{'00': 0.37110814452171326, '01': 0.1298290193080902, '10': 0.36970818042755127, '11': 0.12935470044612885}
{'00': 0.3805724084377289, '01': 0.12036558985710144, '10': 0.3791339993476868, '11': 0.11992792785167694}
QCloudOptions 可用于配置芯片上的计算任务运行选项,包括是否启用映射、量子线路优化以及结果修正等。
Python
options = QCloudOptions()
options.set_amend(True)
options.set_mapping(True)
options.set_optimization(True)
QCloudJob 用于对历史已提交任务进行查询。
Python
prog = QProg()
prog << H(0) << measure(0, 0) << measure(1, 1)
api_key = "302e020100301006072a8648ce3d0201"
service = QCloudService(api_key=api_key)
job = QCloudJob("4F01DFBDD46E3571D304FCD4463B9D10")
result = job.result()
for result_list in result.get_probs_list():
print(result_list)
结果如下:
{'0x0': 0.5374209880828857, '0x1': 0.4625789225101471}
量子云服务同样支持指令集任务,可以通过 to_instruction 接口将量子程序编译到指定后端支持的指令集上,然后直接运行run_instruction.
prog = QProg()
prog << CZ(9, 10)
prog << CZ(10, 11)
prog.append(measure(9,9))
online_key = "30410201003013060722a8648ce3d03010704273025020101042082f8dab977f87edc6547ef4309478deaf1b7e323b6958bc75602462555efa1b3/12457"
service = QCloudService(online_key)
service.setup_logging()
backend = service.backend("72")
options = QCloudOptions()
options.set_amend(False)
ins = prog.to_instruction(backend.chip_backend())
job = backend.run_instruction([ins,ins], 1000, options)
chip_info = backend.chip_info()
result = job.result()
print(result.get_probs_list())
输出如下:
[{'0x0': 0.7249999761581421, '0x1': 0.2749999940395355}, {'0x0': 0.75, '0x1': 0.25}]
ChipInfo 表示每个单量子逻辑门及双量子逻辑门的保真度等信息。
Python
api_key = "302e020100301006072a8648ce3d020106052b8104001c0417"
service = QCloudService(api_key)
backend = service.backend("origin_wukong")
chip_info = backend.chip_info()
topo = chip_info.get_chip_topology()
single_qubit_info_list = chip_info.single_qubit_info()
for qubit_info in single_qubit_info_list:
print(qubit_info)
double_qubits_info_list = chip_info.double_qubits_info()
for double_qubits in double_qubits_info_list:
print("double qubits ", double_qubits.get_qubits(),
"fidelity : ", double_qubits.get_fidelity())
输出如下:
+---------------------------------------------------------------------------------------------------------------+
|Qubit ID |Single Gate Fidelity|Readout Fidelity |Frequency |T1 |T2
+----------------------------------------------------------------------------------------------------------------+
|0 |0.995 |0.9234 |4764 |9.254 |1.128
+----------------------------------------------------------------------------------------------------------------+
+----------------------------------------------------------------------------------------------------------------+
|Qubit ID |Single Gate Fidelity|Readout Fidelity |Frequency |T1 |T2
+----------------------------------------------------------------------------------------------------------------+
|1 |0.9973 |0.9417 |4041 |17.436 |1.844
+----------------------------------------------------------------------------------------------------------------+
......
double qubits [38, 44] fidelity : 0.9831
double qubits [44, 50] fidelity : 0.0
double qubits [39, 45] fidelity : 0.0
double qubits [45, 46] fidelity : 0.9519
double qubits [45, 51] fidelity : 0.9589
double qubits [40, 46] fidelity : 0.0
double qubits [45, 46] fidelity : 0.9519
double qubits [46, 47] fidelity : 0.0
double qubits [41, 47] fidelity : 0.964
......
- 单量子门保真度代表执行单量子比特操作时的误差偏移。
- 单量子门读出误差代表读取量子比特测量结果时的误差偏移。
- 频率代表单量子比特操作的频率。
- T1 和 T2 代表相干时间,以微秒为单位。
- 双量子比特保真度代表执行双量子比特操作时的误差偏移。
- 注解
- 批量计算的最大任务数为 200。如果超过该数量,需要拆分为多个任务提交。
- 在使用服务前,请确保用户具有相应权限并拥有足够的计算资源,否则可能会出现“无权限”或“计算资源不足”等错误。更多详情请参考:https://qcloud.originqc.com.cn/zh/computerServices。
- 如果在使用过程中遇到任何问题,请提交用户反馈。我们会尽快处理您的问题。