You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同时使用LibTorch与PyTorch报错:Key already registered with the same priority: C10

解决LibTorch与PyTorch嵌入时的C10重复注册问题

问题描述

VS22环境下的C应用集成Python实现的Torch模型,C端使用libtorch_win_shared_with_deps-1.13.1+cpu,Python端使用PyTorch 1.13.1。通过pybind11嵌入Python并导入torch模块时,触发报错:

Key already registered with the same priority: C10

单独使用LibTorch或PyTorch均正常运行,推测核心原因是同一底层DLL被C++和Python重复加载,导致C10核心组件的注册冲突。复现代码如下:

#include <Python.h>
#include <pybind11/embed.h>
#include <torch/torch.h>

int main()
{
    pybind11::scoped_interpreter guard{};
    pybind11::module_ test = pybind11::module_::import("torch");
}

注:当前项目规模较大,暂不考虑使用CMake重构。

解决方案

方法1:调整加载顺序,优先让Python加载PyTorch DLL

修改代码执行顺序,先初始化Python并导入torch模块,再加载LibTorch相关组件。这样Python会先加载PyTorch的底层DLL,后续LibTorch会复用已加载的实例,避免重复注册:

#include <Python.h>
#include <pybind11/embed.h>

int main()
{
    // 先初始化Python并导入torch,加载PyTorch的DLL
    pybind11::scoped_interpreter guard{};
    pybind11::module_ torch_module = pybind11::module_::import("torch");
    
    // 再引入LibTorch头文件并初始化
    #include <torch/torch.h>
    
    // 后续编写LibTorch相关业务代码
}

方法2:配置LibTorch为动态链接模式

在VS22项目属性中调整LibTorch的链接设置,强制其动态加载DLL,与Python的PyTorch共享同一依赖:

  • C/C++ → 常规 → 附加包含目录:添加LibTorch的include路径
  • 链接器 → 常规 → 附加库目录:添加LibTorch的lib路径
  • C/C++ → 预处理器 → 预处理器定义:添加TORCH_API_INCLUDE_EXTENSION_H和USE_DLOPEN
  • 链接器 → 输入 → 附加依赖项:仅添加动态库文件(如torch.lib、c10.lib),排除静态库

方法3:临时修改PyTorch DLL名称(应急方案)

找到Python环境中Lib\site-packages\torch\lib下的c10.dll、torch_cpu.dll等核心DLL,复制一份并修改名称(例如c10_py.dll、torch_cpu_py.dll),然后修改Python端torch模块的加载逻辑,使其加载重命名后的DLL。此方法属于临时 workaround,可能引发其他依赖问题,仅在紧急场景下使用。

内容的提问来源于stack exchange,提问作者Aku

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:17:21