实时解码、算法性GPU解码器以及NVIDIA CUDA-Q QEC中的AI推理增强功能
实时解码对于容错量子计算机至关重要。通过使解码器能够与量子处理单元(QPU)并发地以低延迟运行,我们可以在相干时间内对设备应用纠错。这可以防止错误累积,从而避免降低所获结果的价值。我们可以通过真实量子设备在线执行此操作,或通过模拟量子处理器离线执行。
为了帮助解决这些问题并促进更好解决方案的研究,NVIDIA CUDA-Q QEC 0.5.0版本包含了一系列改进。这些改进包括对在线实时解码的支持、新的GPU加速算法性解码器、高性能AI解码器推理的基础设施、滑动窗口解码器支持以及更Pythonic的接口。
本文涵盖了所有这些改进,并深入探讨了如何使用它们来加速量子纠错研究,或用量子计算机实现实时解码。
实时解码在CUDA-Q QEC中成为现实
用户可以通过一个四阶段工作流来执行此操作。顺序依次为:DEM生成、解码器配置、解码器加载与初始化以及实时解码。
首先,我们表征设备在运行过程中错误的行为方式。通过使用一个辅助函数,我们可以从量子码、噪声模型和电路参数生成探测器错误模型(DEM)。该函数将生成一个完整的DEM,将错误机制映射到症状模式。
# 步骤 1:生成探测器错误模型
print("Step 1: Generating DEM...")
cudaq.set_target("stim")
noise = cudaq.NoiseModel()
noise.add_all_qubit_channel("x", cudaq.Depolarization2(0.01), 1)
dem = qec.z_dem_from_memory_circuit(code, qec.operation.prep0, 3, noise)
下一步是选择解码器并进行配置。我们将在后续章节中更详细地讨论新的解码器。
用户使用DEM配置解码器,然后将此配置保存到YAML文件中。该文件确保解码器能够正确解读症状测量值。
# 创建解码器配置
config = qec.decoder_config()
config.id = 0
config.type = "nv-qldpc-decoder"
config.block_size = dem.detector_error_matrix.shape[1]
...
# 查看 nvidia.github.io/cudaqx/examples_rst/qec/realtime_decoding.html
...
在执行电路之前,用户加载YAML文件。CUDA-Q QEC解读信息,在解码器中设置相应的实现,并将其注册到CUDA-Q运行时。
# 保存解码器配置
with open("config.yaml", 'w') as f:
f.write(config.to_yaml_str(200))
现在,用户可以开始执行量子电路。在CUDA-Q内核内部,解码API与解码器进行交互。当测量逻辑量子比特的稳定子时,症状被排队到相应的解码器,由解码器进行处理。当需要纠错时,解码器会建议对逻辑量子比特执行的操作。
# 加载配置并运行电路
qec.configure_decoders_from_file("config.yaml")
run_result = cudaq.run(qec_circuit, shots_count=10)
GPU加速的RelayBP
最近开发的一种解码器算法有助于解决置信传播解码器(一类流行的量子低密度奇偶校验算法解码器)的缺陷。BP+OSD(置信传播与有序统计解码)依赖于GPU加速的BP解码器,然后在CPU上使用有序统计后处理算法。如果BP失败,则OSD介入。这虽然可行,但使得针对实时错误解码所需的低延迟进行优化和并行化变得困难。
RelayBP通过引入记忆强度的概念来修改BP方法,在图中的每个节点处,控制每个节点记住或遗忘过去信息的程度。这抑制或打破了通常使BP陷入困境、阻碍其收敛的有害对称性。
图1. 在NVIDIA DGX GB200上测量的RelayBP FP32峰值解码吞吐量(迭代次数/秒),针对1-Gross和2-Gross量子纠错码的XYZ和XZ解码进行测量,保持症状复杂度恒定以隔离峰值性能。结果通过优化的CUDA-Q QEC 0.6.0版本收集。
用户只需几行代码即可轻松实例化RelayBP解码器,如下所示。
import numpy as np
import cudaq_qec as qec
# 用于演示的简单3x7奇偶校验矩阵
H_list = [[1, 0, 0, 1, 0, 1, 1], [0, 1, 0, 1, 1, 0, 1],
[0, 0, 1, 0, 1, 1, 1]]
H = np.array(H_list, dtype=np.uint8)
# 配置relay参数
srelay_config = {
'pre_iter': 5, # 在relay支路之前运行5次gamma0迭代
'num_sets': 3, # 使用3条relay支路
'stopping_criterion': 'FirstConv' # 首次收敛后停止
}
# 创建带有Relay-BP的解码器
decoder_relay = qec.get_decoder("nv-qldpc-decoder",
H,
use_sparsity=True,
bp_method=3,
composition=1,
max_iterations=50,
gamma0=0.3,
gamma_dist=[0.1, 0.5],
srelay_config=srelay_config,
bp_seed=42)
print(" Created decoder with Relay-BP (gamma_dist, FirstConv stopping)")
# 解码一个症状
syndrome = np.array([1, 0, 1], dtype=np.uint8)
decoded_result = decoder_relay.decode(syndrome)
AI解码器推理
AI解码器在处理特定错误模型方面越来越受欢迎,与算法性解码器相比,它们能提供更好的准确性或更低的延迟。
用户可以通过生成训练数据、训练模型并将模型导出为ONNX格式来开发AI解码器。完成此操作后,使用CUDA-Q QEC基于NVIDIA TensorRT的AI解码器推理引擎来运行低延迟的AI解码器。
CUDA-Q QEC最近引入了集成AI解码器推理与离线解码的基础设施。这意味着现在可以轻松地使用CUDA-Q QEC和模拟量子计算机运行任何保存为ONNX文件的AI解码器。
import cudaq_qec as qec
import numpy as np
# 注意:AI解码器不使用奇偶校验矩阵。
# 此处提供一个占位符矩阵以满足API要求。
H = np.array([[1, 0, 0, 1, 0, 1, 1],
[0, 1, 0, 1, 1, 0, 1],
[0, 0, 1, 0, 1, 1, 1]], dtype=np.uint8)
# 从ONNX模型创建TensorRT解码器
decoder = qec.get_decoder("trt_decoder", H,
onnx_load_path="ai_decoder.onnx")
# 解码一个症状
syndrome = np.array([1.0, 0.0, 1.0], dtype=np.float32)
result = decoder.decode(syndrome)
print(f"Predicted error: {result}")
我们还提供了一系列建议,通过创建预构建的TensorRT引擎来减少初始化时间。由于ONNX文件支持多种精度(int8, fp8, fp16, bf16和tf32),用户可以探索各种模型和硬件组合,以优化AI解码器的实际应用。
滑动窗口解码
滑动窗口解码器使解码器能够处理跨多个症状提取轮次的电路级噪声。这些解码器在接收到完整测量序列之前处理症状,这有助于减少整体延迟。其代价是可能会增加逻辑错误率。如何使用以及何时使用此工具,取决于给定量子处理器的噪声模型、纠错码参数和延迟预算。随着0.5.0版本中引入滑动窗口解码器,用户现在可以使用任何其他CUDA-Q解码器作为“内部”解码器进行实验。此外,用户可以通过简单的参数更改来改变窗口大小。
import cudaq
import cudaq_qec as qec
import numpy as np
cudaq.set_target('stim')
num_rounds = 5
code = qec.get_code('surface_code', distance=num_rounds)
noise = cudaq.NoiseModel()
noise.add_all_qubit_channel("x", cudaq.Depolarization2(0.001), 1)
statePrep = qec.operation.prep0
dem = qec.z_dem_from_memory_circuit(code, statePrep, num_rounds, noise)
inner_decoder_params = {'use_osd': True, 'max_iterations': 50, 'use_sparsity': True}
opts = {
'error_rate_vec': np.array(dem.error_rates),
'window_size': 1,
'num_syndromes_per_round': dem.detector_error_matrix.shape[0] // num_rounds,
'inner_decoder_name': 'nv-qldpc-decoder',
'inner_decoder_params': inner_decoder_params,
}
swdec = qec.get_decoder('sliding_window', dem.detector_error_matrix, **opts)
每个症状提取轮次必须产生恒定数量的测量值。解码器不会对底层噪声的时间相关性或周期性做出任何假设,因此用户在调查每轮噪声变化方面拥有最大的灵活性。
CUDA-Q QEC入门
CUDA-Q QEC 0.5.0为量子纠错研究人员和QPU操作员带来了广泛的工具,以加速实现容错量子计算机的研究。
要开始使用CUDA-Q QEC,您可以通过pip安装cudaq-qec并查阅CUDA-Q QEC文档。FINISHED