保存与复用收缩序
保存网络、收缩序和切片信息,在数组值变化时重复执行;无切片时也可先编译,减少每次执行的准备工作。
本页目录
请先完成快速开始中的张量网络输入,准备示例使用的网络结构、维度和数值数组。
跨进程保存与加载
沿用快速开始中的网络和数组,或提供自己的输入。另一个进程可以加载已保存的收缩序和切片信息;数值数组仍需另外创建或加载。
from arctn import ArcTNExecutionPlan, arctn_plan
plan = arctn_plan(
inputs, output, size_dict,
preset="heavy", seed=0,
target_size=2**24, slicing_mode="fixed",
)
plan.save("plan.json")
loaded = ArcTNExecutionPlan.load("plan.json")
loaded.validate(inputs, output, size_dict, arrays=arrays)
result = loaded.execute(arrays, backend="native")
ArcTNExecutionPlan 保存规范化网络、SSA 收缩序和切片 index 集合,不保存数值数组。load() 与 execute() 都不会重新进行收缩序优化,加载后会按保存的收缩序和切片信息执行。
同一进程内编译并重复执行
unsliced = arctn_plan(
inputs, output, size_dict, preset="heavy", seed=0
)
compiled = unsliced.compile(backend="native")
arrays_1 = arrays
arrays_2 = [array * 2 for array in arrays]
result_1 = compiled.execute(arrays_1)
result_2 = compiled.execute(arrays_2)
print(compiled.stats())
- 每次
arrays的数量和 shape 必须与编译时的网络一致;同一次执行的全部数组必须使用同一种受支持 dtype。编译时不固定 dtype。 ArcTNExecutionPlan可保存为文件,不绑定执行后端;ArcTNCompiledContraction绑定执行后端,只在当前进程中使用。- 切片集合非空时不能调用
plan.compile();可使用plan.execute(),或调用plan.to_tree()交给 Cotengra 执行。
参数变化时复用收缩序
在 VQE、QAOA 或量子机器学习的参数迭代中,门的数值通常会变化,而电路连接结构可以保持不变。对固定的电路结构和可观测量,可先构建一次期望值网络,使用 arctn_plan 优化收缩序,再按新的参数更新门张量与对应的共轭张量。
无切片时,调用一次 plan.compile(),每组参数只需调用 compiled.execute(arrays)。已保存切片时,使用 plan.execute(arrays),沿已有收缩序执行全部切片,不重新寻路;但每次仍需准备执行所用的信息,不能使用当前的无切片编译接口。
复用要求张量顺序、每个张量各轴的 index 对应关系、维度和输出顺序一致,不只是量子比特数或数组 shape 一样。若前端化简、可观测量或电路结构的变化改变了这些信息,需要为新的网络重新优化收缩序。多个可观测量可分别保存各自网络的收缩序。
数值执行的结果还需由应用按算符系数求和,形成能量或模型输出;参数更新和训练循环不由保存的收缩序执行。Quimb 调用方式见 VQE 与 QAOA 示例。
复用的适用条件
先进行一次收缩序优化和编译,再用同一编译对象执行 次。若收缩序优化耗时为 、编译耗时为 、单次执行耗时为 ,总耗时近似为
反复调用 arctn_contract 会重复进行收缩序优化;复用已有收缩序可以省去这部分工作。无切片时,复用编译对象还能省去重复编译的开销。
这条关系只说明时间组成。跨库速度仍取决于相同网络、dtype、backend、线程设置和同步边界下的实测。