实时解码对于容错量子计算机至关重要。通过使解码器与量子处理器(QPU)同时以低延迟运行,我们能在相干时间内对设备施加校正,从而防止错误累积,避免所获结果的可靠性下降。这一过程既可通过真实的量子设备在线实现,也可借助模拟量子处理器离线完成。
为帮助解决这些问题并探索更优的解决方案,NVIDIA CUDA-Q QEC 0.5.0 版本推出了一系列改进,包括支持在线实时解码、新增 GPU 加速算法解码器、构建支持高性能 AI 解码器推理的基础设施、实现滑动窗口解码器功能,以及扩展更多 Python 接口。
我们将在本博文中介绍所有这些改进,并深入探讨如何利用它们推动量子纠错研究,或在量子计算机上实现实时解码。
使用 CUDA-Q QEC 实现实时解码
用户可在四阶段工作流程中执行此操作,依次为:DEM 生成、解码器配置、解码器加载与初始化,以及实时解码。
首先,我们描述设备在运行期间出现错误时的行为方式。通过使用辅助函数,可以根据量子代码、噪声模型和电路参数生成检测器错误模型(DEM)。该函数将构建一个完整的 DEM,用以映射错误机制与综合症模式之间的关系。
# Step 1: Generate detector error model
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 文件中,以确保解码器能够正确解读综合征测量值。
# Create decoder config
config = qec.decoder_config()
config.id = 0
config.type = "nv-qldpc-decoder"
config.block_size = dem.detector_error_matrix.shape[1]
. . .
# check out nvidia.github.io/cudaqx/examples_rst/qec/realtime_decoding.html
. . .
在执行电路之前,用户需要加载 YAML 文件,解析 CUDA-Q QEC 的相关信息,在解码器中配置相应的实现,并将其注册到 CUDA-Q 运行时。
# Save decoder config
with open("config.yaml", 'w') as f:
f.write(config.to_yaml_str(200))
现在,用户可以开始执行量子电路。在 CUDA-Q 内核内部,解码 API 与解码器进行交互。当测量逻辑量子比特的稳定子时,相应的症状会被送入解码器进行处理。一旦需要纠错,解码器便会建议对逻辑量子比特施加相应的量子操作。
# Load config and run circuit
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
# Simple 3x7 parity check matrix for demonstration
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)
# Configure relay parameters
srelay_config = {
'pre_iter': 5, # Run 5 iterations with gamma0 before relay legs
'num_sets': 3, # Use 3 relay legs
'stopping_criterion': 'FirstConv' # Stop after first convergence
}
# Create a decoder with 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)")
# Decode a syndrome
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
# Note: The AI decoder doesn't use the parity check matrix.
# A placeholder matrix is provided here to satisfy the 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)
# Create TensorRT decoder from ONNX model
decoder = qec.get_decoder("trt_decoder", H,
onnx_load_path="ai_decoder.onnx")
# Decode a syndrome
syndrome = np.array([1.0, 0.0, 1.0], dtype=np.float32)
result = decoder.decode(syndrome)
print(f"Predicted error: {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 文档。