CUDA-Q QEC 0.5.0:实时量子纠错解码新特性

4 阅读6分钟

实时解码在 CUDA-Q QEC 中成为现实

实时解码对于容错量子计算机至关重要。通过使解码器能够与量子处理单元(QPU)并发地以低延迟运行,我们可以在相干时间内将校正应用于设备。这可以防止误差累积,从而降低所得结果的价值。我们可以在线(使用真实的量子设备)或离线(使用模拟的量子处理器)完成此操作。

为了帮助解决这些问题并支持研究更好的解决方案,NVIDIA CUDA-Q QEC 0.5.0 版本包含了一系列改进。这些改进包括支持在线实时解码、新的 GPU 加速算法解码器、高性能 AI 解码器推理的基础设施、滑动窗口解码器支持以及更 Pythonic 的接口。

用户可以通过一个四阶段的工作流程来执行此操作。依次为:探测器错误模型生成、解码器配置、解码器加载和初始化以及实时解码。

首先,我们描述设备在运行期间的错误行为。使用辅助函数,我们可以从量子码、噪声模型和电路参数生成探测器错误模型(DEM)。该函数将生成一个完整的 DEM,将错误机制映射到症状模式。

# 步骤 1:生成探测器错误模型
print("步骤 1:生成 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 的有害对称性,从而防止其收敛。

用户可以轻松地用几行代码实例化一个 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 分支之前使用 gamma0 运行 5 次迭代
   '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("   使用 Relay-BP (gamma_dist, FirstConv 停止准则) 创建了解码器")

# 解码一个症状
syndrome = np.array([1, 0, 1], dtype=np.uint8)
decoded_result = decoder_relay.decode(syndrome)

AI 解码器推理

AI 解码器在处理特定错误模型方面越来越受欢迎,提供比算法解码器更好的准确性或更低的延迟。

用户可以通过生成训练数据、训练模型并将模型导出到 ONNX 来开发 AI 解码器。完成后,使用基于 NVIDIA TensorRT 的 CUDA-Q QEC 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"预测的错误: {result}")

我们还提供了一系列建议,通过创建预构建的 TensorRT 引擎来减少初始化时间。通过支持多种精度(int8、fp8、fp16、bf16 和 tf32)的 ONNX 文件,您可以探索一系列模型和硬件组合,以优化 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