在扩大规模前设置资源预算¶
先用小规模程序检查规划结果,再增加站点数、轨迹数或并发点数。单个状态数组只是内存的一部分;求解器工作区、缓冲区和工作线程副本也会占用空间。
| 设置 | 可以控制什么 |
|---|---|
max_memory_bytes、memory_fraction |
规划时的内存预算;不是操作系统级内存隔离 |
dtype |
振幅精度与元素大小;complex64 为 8 字节,complex128 为 16 字节 |
workers |
扫描或轨迹的并发规划;不是内核线程数 |
trajectories |
轨迹估计样本数;与测量 shots不同 |
| 返回概率、状态等选项 | 返回和保存的数据量;不免除演化本身需要的状态 |
完整态矢量含 2^N 个复数,密度矩阵含 4^N 个。轨迹通常保存一批纯态,并受分块和并发策略约束。不能只用“单态字节数×轨迹数”替代实际峰值规划。
查看六站点的真实规划¶
"""检查 Hybrid workload 的资源规划和实际执行配置。
Planner 会在分配大型状态数组前比较候选 method。最终 plan 会给出状态表示、Hilbert
维数、内存估算、worker 数、tolerance 和拒绝原因,结果中另有实际采用的配置。
"""
from __future__ import annotations
import json
from cascaqit import (
AHSProgram,
AtomRegister,
Circuit,
HybridProgram,
LocalBackend,
Waveform,
)
from cascaqit.simulators import SimulationOptions
def main() -> None:
"""运行六 site D-A-D workload,并对照规划值与实际应用值。"""
sites = 6
analog = AHSProgram(
AtomRegister.line(count=sites, spacing=7.0),
program_id="lesson.hybrid.resource.analog",
).drive(
rabi=Waveform.linear(0.1, 0.6, duration=0.1),
detuning=Waveform.constant(-0.1, duration=0.1),
phase=0.0,
)
program = (
HybridProgram("lesson.hybrid.resource")
.digital("prepare", Circuit(sites).h(0).cx(0, 1))
.analog("evolve", analog)
.digital("correct", Circuit(sites).rz(0.2, sites - 1))
.measure_all()
)
result = (
LocalBackend(analog_time_steps=4)
.run(
program,
shots=16,
seed=105,
options=SimulationOptions(
integrator="fixed_step_krylov",
dtype="complex64",
max_steps=4,
workers=2,
),
)
.result()
)
plan = result.metadata["simulation_plan"]
execution = result.metadata["simulation_execution_config"]
payload = {
"track": "hybrid_researcher",
"level": "expert",
"lesson": "resource_planning",
"facts": {
"logical_sites": plan["logical_sites"],
"method_selected": plan["method_selected"],
"candidate_statuses": {
item["method"]: item["status"] for item in plan["candidates"]
},
"hilbert_dimension": plan["hilbert_dimension"],
"state_bytes": plan["estimate"]["state_bytes"],
"estimated_peak_bytes": plan["estimate"]["estimated_peak_bytes"],
"workers_requested": plan["metadata"]["workers_requested"],
"workers_applied": execution["workers"],
"estimated_peak_positive": plan["estimate"]["estimated_peak_bytes"] > 0,
"execution_dtype": execution["dtype"],
"tolerance_applied": execution["tolerance_applied"],
"state_bytes_returned": result.metadata["state_bytes_returned"],
},
"boundaries": {
"hardware_execution": False,
"cloud_execution": False,
"network_accessed": False,
"credentials_loaded": False,
},
}
print(json.dumps(payload, sort_keys=True))
if __name__ == "__main__":
main()
python examples/user/tracks/hybrid_researcher/05_expert_resource_planning_zh.py
{
"boundaries": {
"cloud_execution": false,
"credentials_loaded": false,
"hardware_execution": false,
"network_accessed": false
},
"facts": {
"candidate_statuses": {
"density_matrix": "rejected",
"state_vector": "selected",
"subspace": "rejected",
"trajectory": "rejected"
},
"estimated_peak_bytes": 20992,
"estimated_peak_positive": true,
"execution_dtype": "complex64",
"hilbert_dimension": 64,
"logical_sites": 6,
"method_selected": "state_vector",
"state_bytes": 512,
"state_bytes_returned": false,
"tolerance_applied": false,
"workers_applied": 1,
"workers_requested": 2
},
"lesson": "resource_planning",
"level": "expert",
"track": "hybrid_researcher"
}
六站点 complex64 态矢量占 512 字节,完整密度矩阵占 32768 字节;两者都不是进程峰值。比较 state_bytes 与 estimated_peak_bytes,并读取 workers_requested 和 workers_applied。请求两个工作线程,不保证选定路径会使用两个内核线程。
资源拒绝时,先看候选方法的原因代码和估算。减少站点或并发通常比单纯减少 shots更能缓解状态存储压力。降低 dtype前应做精度对照;切换到阻塞子空间前必须确认物理假设成立。
本例固定步积分的 tolerance_applied 为 false。需要检查误差时,按方法与精度指南调整时间分辨率或适用的自适应容差。保存接受的资源计划和实际执行设置;某台机器的可用内存估计不是所有笔记本的最低配置。