聚合与拆分
本章节主要介绍了量子线路聚合与拆分、QUBO分解的设计。
量子线路聚合
量子线路聚合的功能是将多个量子线路聚合成一个量子线路,通过聚合减少编译和执行开销,降低用户等待时间,提高系统整体并发量和效率。
(1)关键概念
量子线路聚合支持三种模式:
None模式 (AGGREGATION_TYPE_NONE):不进行聚合,每个源码单独编译执行,结果直接返回
Internal模式 (AGGREGATION_TYPE_INTERNAL):作业内聚合。 单个Flow中多个源码编译为一个量子线路,执行后按原源码个数分割结果返回
External模式 (AGGREGATION_TYPE_EXTERNAL):作业间聚合。 多个Flow(父作业流/Parent + 子作业流/Sub)通过Prefect的暂停/恢复机制协调执行,父作业流编译聚合所有源码,执行后将结果分割返回给各子作业流
(2)关键数据结构
class AggregationInput(RunInput):
"""Prefect pause_flow_run等待的输入数据结构"""
is_parent: bool # 标记是否为Parent Flow
sub_jobs: dict | None # Sub Flow的参数字典,key为job_id,value为job_info
sub_results: list[Any] | None # Sub Flow的执行结果
class SourceCodeInfo:
"""源码信息和聚合元数据"""
aggregation_type: str # 聚合类型:None/internal/external
src_code_list: list[dict] # 源码列表,每个元素为{job_id-index: source_code}的字典
sub_flow_list: list[str] # External模式下的Sub Flow ID列表
(3)三种聚合模式的实现
None模式流程:
create_src_code_info(): 遍历每个源码,创建独立的{job_id-index: source_code}字典
run_code(): 逐个执行每个源码,返回单个job_results
结果处理:job_results直接添加到job_results_list
Internal模式流程:
create_src_code_info(): 将源码按MAX_AGGREGATION_JOBS分组,每组作为一个{job_id-index: source_code}字典
run_code(): 每组源码聚合编译为单个量子线路,执行一次获得聚合结果
get_internal_aggregated_results():
使用mapping_dict(记录每个源码对应的qubit数)和split_dict()分割结果
为每个源码创建独立的job_results副本,填入对应的results子集
返回结果列表
结果处理:extend()添加所有分割后的结果到job_results_list
External模式流程(关键的多Flow协调):
提交阶段(task_manager):
调用process_aggregation_job()启动监听线程
监听Redis中以REDIS_CHANNEL_JOB_AGG_PREFIX前缀的消息
Parent Flow暂停阶段(job_engine):
create_src_code_info(): 创建单个src_code_list,待后续更新
发送flow_agg_info到Redis,携带flow_run_id和aggregation_type
调用pause_flow_run(wait_for_input=AggregationInput)暂停,等待aggregation_info
Task Manager匹配Sub Jobs(task_manager._process_aggregation_job):
查询所有SCHEDULED状态且tags=[AGGREGATION_TYPE_EXTERNAL]的Flow
匹配条件:
circuit_aggregation == external
backend相同
work_pool_name相同
数量 < MAX_AGGREGATION_JOBS
将匹配的sub flow的参数构建为AggregationInput.sub_jobs
轮询检查Parent是否已进入PAUSED状态(最多等待JOB_AGG_FLOW_PAUSE_WAIT_TIMEOUT秒)
调用resume_flow_run(flow_run_id, run_input=aggregation_params)恢复Parent, 其中aggregation_params为{"is_parent": True, "sub_jobs": {...}}
Parent Flow恢复执行(job_engine):
aggregation_info = pause_flow_run()返回(包含sub_jobs映射)
检查is_parent:为False则返回(Sub Job处理),为True则继续
update_src_code_info(): 将Sub Jobs的源码添加到src_code_info.src_code_list,并追踪sub_flow_list
执行run_code(),编译所有源码(Parent+Sub)聚合为单个量子线路
结果处理(job_engine):
get_external_aggregated_results():
使用mapping_dict记录的job_id与qubit数映射分割结果
第一个(Parent)的结果保留在job_results中
其余(Sub)的结果组织为sub_results字典,key为job_id,value为该Sub的job_results副本
返回包含sub_results的merged job_results
发送flow_agg_info到Redis,携带cancel=True和sub_flow_list,通知Task Manager取消Sub Flow
Sub Job处理(job_engine):
Sub Job暂停后aggregation_info.is_parent=False,直接返回None
Sub Job的结果通过db_job_callback在数据库层处理
(4)三种聚合模式总体对比
以下是三种聚合模式的并行流程对比:
三种模式的流程对比(包图)
(5)聚合模式决策流程
系统根据circuit_aggregation参数进行模式选择:
聚合模式选择决策流程
(6)详细流程图
下图展示三种模式的完整执行流程,包含环节分组和参与者职责:
量子线路聚合三种模式详细流程图
(7)External模式协调时序图
External模式的关键是多Flow之间的协调。以下时序图展示了Parent和Sub Flow的完整交互过程:
External模式多Flow协调时序图
(8)关键算法与设计细节
split_dict() - 按Qubit边界分割结果
利用mapping_dict记录的qubit count信息,将测量结果按bitstring长度分割:
# 输入:orig_dict = {"00": 100, "01": 50, "10": 30, "11": 20}
# mapping_dict = {job0: 2, job1: 2} # 各占2个qubit
# split_len = [2, 2]
# split_dict按第一维(index 0-1)、第二维(index 2-3)分割key
# 输出结果列表,每个元素对应一个job的bitstring
get_internal_aggregated_results() - 内聚合结果分割
输入作业聚合执行的结果 + mapping_dict
处理:使用split_dict分割,为每个源码创建独立副本
输出:结果列表,列表长度 = src_code_list长度
get_external_aggregated_results() - 外聚合结果处理
输入:聚合执行的结果 + mapping_dict(包含Parent+Sub)
处理:
使用split_dict分割
第一个结果保留为Parent的job_results
其余结果组织为sub_results字典
Sub Job的job_id通过job_id.rsplit("-", 1)[0]还原
输出:单个merged job_results,包含results和sub_results
与DB更新的集成
Parent result: 直接写入DB,job_status=COMPLETED
Sub results: 通过db_job_callback()在result中传递,DB层merge处理
故障场景:Parent失败 → 所有Sub自动取消;Sub开始前被取消 → Parent发送cancel信号
(9)约束与限制
MAX_AGGREGATION_JOBS: 单次聚合的最大job数量
JOB_AGG_FLOW_PAUSE_WAIT_TIMEOUT: Parent暂停最长等待时间(10秒)
External模式Sub必须与Parent backend/pool相同
Internal模式多个源码编译为单个线路,要求门集兼容
不支持嵌套聚合(子聚合作业不能再聚合)
量子线路拆分
量子线路拆分目的是解决通用量子计算机受限于量子比特数量,无法直接求解大电路问题而设计的。 支持将用户提交的大电路作业分解为量子计算机能够支持最大比特规模的一系列子电路作业, 经过量子计算机求解后重构为大电路的执行结果。
大电路作业通过电路拆分再求解的具体流程:
电路切割时序图:
电路切割时序图
QUBO分解
QUBO拆分(也称QUBO分解)目的是解决伊辛机受限于量子比特数量,无法直接求解大QUBO问题而设计的。 支持将用户提交的大QUBO作业分解为伊辛机能够支持最大比特规模的子QUBO作业, 并基于QUBO分解算法进行解的合并于重构,结合优化更新算法最终获取最优解。
大QUBO作业通过QUBO分解算法求解问题的具体流程:
QUBO分解时序图:
QUBO分解时序图