在Qiskit IBM Runtime会话中使用QuantumKernelTrainer遇RecursionError
问题分析与排查
核心问题定位
你遇到的RecursionError大概率是Qiskit Machine Learning底层代码的 deepcopy 逻辑缺陷,而非你的实现错误——当TrainableFidelityQuantumKernel关联了含噪声模型的Sampler时,QuantumKernelTrainer内部调用copy.deepcopy()会陷入循环引用的递归拷贝。
最小复现代码验证
from qiskit_ibm_runtime import Sampler, Options from qiskit.providers.fake_provider import FakeVigo from qiskit_machine_learning.kernels import TrainableFidelityQuantumKernel from qiskit_machine_learning.kernels.trainable_kernel_trainer import QuantumKernelTrainer from qiskit.circuit.library import ZZFeatureMap import numpy as np # 构建带噪声模型的Sampler选项 fake_backend = FakeVigo() noise_model = fake_backend.noise_model sampler_options = Options(noise_model=noise_model) sampler = Sampler(options=sampler_options) # 构建可训练量子核 feature_map = ZZFeatureMap(feature_dimension=2) trainable_kernel = TrainableFidelityQuantumKernel(feature_map=feature_map, sampler=sampler) # 准备训练数据 X_train = np.random.rand(5, 2) y_train = np.array([0, 1, 0, 1, 0]) # 初始化训练器并触发错误 trainer = QuantumKernelTrainer(trainable_kernel) trainer.fit(X_train, y_train)
错误栈关键片段
RecursionError: maximum recursion depth exceeded while calling a Python object ... File "/usr/lib/python3.8/copy.py", line 153, in deepcopy y = copier(x, memo) File "/usr/lib/python3.8/copy.py", line 215, in _deepcopy_list append(deepcopy(a, memo)) File "/usr/lib/python3.8/copy.py", line 153, in deepcopy y = copier(x, memo) ... File "/path/to/qiskit_machine_learning/kernels/trainable_kernel_trainer.py", line XX, in _fit kernel_copy = deepcopy(self._quantum_kernel)
临时解决方案
- 避免直接在Sampler中传入噪声模型:改用
Sampler绑定真实噪声后端,而非手动配置noise_model参数# 替换原Sampler初始化代码 from qiskit_ibm_runtime import QiskitRuntimeService service = QiskitRuntimeService() noisy_backend = service.backend("ibmq_quito") # 或其他含噪声后端 sampler = Sampler(backend=noisy_backend) - 手动规避deepcopy:如果必须手动指定噪声模型,可在训练前临时移除
sampler的noise_model,训练完成后再恢复(需注意线程安全)
结论
该问题属于Qiskit Machine Learning的潜在bug——当TrainableFidelityQuantumKernel的Sampler实例包含循环引用的噪声模型对象时,QuantumKernelTrainer的deepcopy操作会触发无限递归。建议提交issue到Qiskit Machine Learning仓库跟进修复。
内容的提问来源于stack exchange,提问作者Rober
相关产品推荐
相关产品推荐

