同时使用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
相关产品推荐
相关产品推荐

