跳转至

如何用Python进行云平台的编程实验?

对于量子云平台高阶玩家来说,使用网站提交实验的过程费时费力。针对一些较为复杂或有其他调用需求的量子线路,仅通过图形模式或图形模式中的代码书写是不够的,所以我们提供了SDK调用的模式,使用python就能进行云平台编程。

具体实现方法如下:

1.1 准备量子计算云平台登录信息

(以下loginkey只是示例,请前往您的“个人中心”获取: https://quantumctek-cloud.com/user.html

from ezQgd import *
account = Account(login_key='opecT+SO+QFjLXREUU2f8paSJNtTytPPV8Dbbd2T8Zg=', machine_name='gd_qc1')

#创建实例,设置用户SDK密钥,选择量子计算机
#用户使用时,请务必更新上述key,否则上述key会被定时更新而示例程序不可以。

#用户的密钥(SDK密钥),请在用户中心查看。https://quantumctek-cloud.com/user

#设置量子计算机代码,可以是物理机、应答机或仿真器
#当前可选机器名称:gd_qc1 (“祖冲之号”同等规模的超导量子计算机)
#                gd_test (应答机,用于验证实验流程。)
#有部分机型需要权限才可以设置或调用。
#其中应答机为程序验证专用,提交试验后立即完成实验,线路返回结果为固定值,仅供验证程序的逻辑功能。

#账号注册:https://quantumctek-cloud.com/
#账号权限申请:电子邮件联系service@quantumctek-cloud.com,标题“账号权限申请”,正文内请务必清晰提供账号名称,所希望使用的机型、比特数量及比特编号等。
#(注,不要提供密码,任何工作人员也不会向你索要密码。)

1.2 量子程序编写

本文档介绍的是QCIS指令集,如您使用的是QASM,我们也提供QASM转QCIS的功能:

qcis=account.convert_qasm_to_qcis(qasm)
print(qcis)

量子程序有多种书写方式,也有多种运行方式,作为基础教程,本案直接提供一个示例线路,细节请参考教程全文: https://docs.quantumctek-cloud.com/

#手动书写第一个量子程序:Bell态制备
#强烈建议设计线路时,直接考虑比特拓扑结构的影响。而不用程序做比特映射操作。
qcis_circuit = '''
H Q0
X Q6
H Q6
CZ Q0 Q6
H Q6
M Q0
M Q6
'''

#qcis_circuit = [qcis_circuit]*10
#以上为高阶功能,看第4章讲解

print(qcis_circuit)
#可以通过多种方法自行产生待提交的程序。
#以上指令意义请自行补课
QCIS指令集

#自2023年7月12日起,量子芯片的起始比特编号有1改为0,所以,此前用户写的程序,需要对比特编号减1,才能继续运行,否则会出现拓扑结对不上的问题。

1.3 将程序提交到量子计算云平台

作为入门教程,可以只通过最简单的submit_job()参数来提交一个实验,更多参数见进阶教程: https://docs.quantumctek-cloud.com/en/Advanced/4/

query_id=submit_job(circuit=None, exp_name='exp0', parameters=None, values=None, num_shots=12000, lab_id=None, exp_id=None, version='version01', is_verify=True)
- circuit, 量子线路,对于新实验必须提供。
- exp_name, 实验集合名称,对于未提供lab_id时,将根据exp_name创建实验集合, 但submit_job函数不返回新建的实验集合ID, 仅建议在快速运行实验时使用。对于同时提供lab_id和exp_name时,exp_name将被忽略。
- parameters, values,线路中变量的替换,用于混合编程,见后继教程讲解。
- num_shot, 实验线路的运行次数,量子实验的特点,拿到的结果是多次实验的统计结果。数据范围1~10万。 - lab_id, 实验集合id,相当于实验目录。 - exp_id, 实验版本id,不提供线路(circuit)时,可以通过提交exp_id,运行此前保存过的线路。 - version,实验线路名称。 - query_id, 返回值,字符类型。用于表征实验运行的id,用于查询实验结果。如果为0/空,则说明实验提交出现异常。

circuit, parameters, values接受list类型,详细用法参加进阶教程。
submit_job可以由多个基础函数组合而成,参数定义及更丰富的使用形式请参见高阶教程。

query_id = account.submit_job(circuit=qcis_circuit,num_shots=1000)
#对于最简的实验提交,只需要提供实验线路即可。
#但如果想设计自动化程序,各个参数尽量明确复制,并且version等参数在同一个集合内不能重名,也要提前用时间或计数等形式提前产生好。
#因submit_job函数参数较多,建议采用指定参数传参的形式。
#submit_job可以有更多设置,还请关注我们的教程更新。
print(query_id)

1.4 读取实验结果

前面步骤已经将准备好的实验提交到量子计算云平台的量子计算机上并执行,只需通过query_id回读实验结果即可。
建议考虑用try函数来运行submit_job,对于意外状况,可以直接重新提交失败的实验,以保证全自动程序的运行。
当query_id不为0时,利用query_experiment()可以进行下一步查询工作。当查询结果返回为0时,也是出现意外,可以尝试二次查询。

 if query_id:
    result=account.query_experiment(query_id, max_wait_time=360000)
    #result约定的格式如下:(最新更新见用户手册FAQ部分)
    #返回值为list,包含若干字典形式,
    #key:"results"为线路执行的原始数据,共计1+num_shots个数据,第一个数据为测量的比特编号和顺序,其余为每shot对应的结果。
    #key:"probability"为线路测量结果的概率统计,经过实时的读取修正后的统计结果。
    #当测量比特大于15个时,"probability"为空,请用户根据原始数据,配合当时量子计算机的读出保真度自行做修正。相关修正函数在高阶教程中有示例。用户也可以自己完善修正函数。
    #最大等待时间单位为秒,不传递时默认为30秒。因量子程序的执行会有排队的情况,而量子计算机本身有自动校准的时间,如果想跑全自动的程序,等待时间最好大于两者。

    #以下是实验结果的显示、使用与保存。
    #打印,显示结果
    print(result)
    #实验结果为原始数据,数据较长。这里不打印,如有兴趣观察实验结果结构,可以选择打印。
    #每次shot的比特测量结果数据,便于灵活使用,如果需要统计结果,可见高阶教程。
    #选出、处理部分结果示例
    value = result
    #print(value)
    #实验结果为原始数据,数据较长。这里不打印,如有兴趣观察实验结果结构,可以选择打印。
    #保存结果
    f = open("./results.txt",'w')
    f.write(str(value))
    f.close()
    print("实验结果已存盘。")
else :
    #实验未运行成功,需要后继重新提交等处理
    print("实验运行异常,需要重新提交或运行")
如果需要保存此时量子计算的参数作为后期参考,如读取修正等,可以运行以下指令:

res=account.download_config()
#机器完整参数将以json文件形式存储在当前目录。
print(res)

同时,网站也提供了可以进行python编程调用SDK的编程环境,进入方法为:1. 直接进入“编程实验室”或者2. 创建“我的实验合集”再新建“编程实验”。

编程实验室使用的是Jupyter Hub的环境,可以使用python封装调用量子计算指令或编译语言。如果您需要线下实验,则需安装运行环境,由于国盾量子计算云平台已经预装了所有环境,所以可以直接运行实验代码。