TensorFlow C++设置GPU设备报错:GPU设备工厂重复注册
我之前也碰到过一模一样的问题,在TensorFlow C++版本里设置默认GPU设备时触发了F tensorflow/core/common_runtime/device_factory.cc:77] Duplicate registration of device factory for type GPU with the same priority 210错误,Python版本却完全正常,折腾了好一阵才找到几个可行的方向,分享给你:
1. 排查库链接的重复引用问题
这个错误大概率和重复链接TensorFlow的GPU相关库有关。比如你的项目可能同时静态链接了TensorFlow核心库和GPU库,或者动态链接时不小心引入了多份GPU设备工厂的注册代码:
- 如果是CMake项目,检查
find_package(TensorFlow)的配置,确保只链接正确的GPU版本库,不要同时混入CPU版本的库。 - 确认编译链接参数里没有重复包含
libtensorflow_framework.so或libtensorflow_cc.so的GPU版本。
2. 换一种指定GPU的方式(推荐)
你当前是通过修改GraphDef设置默认设备,试试在创建Session前通过ConfigProto配置GPU选项,这种方式比修改GraphDef更可靠,也能避开设备注册冲突:
tensorflow::SessionOptions options; tensorflow::ConfigProto& config = options.config; config.set_allow_soft_placement(true); // 配置GPU可见性与参数 auto* gpu_options = config.mutable_gpu_options(); gpu_options->set_visible_device_list("3"); // 指定使用GPU编号3 gpu_options->set_allow_growth(true); // 按需分配显存 // 创建Session并加载模型 std::unique_ptr<tensorflow::Session> session(tensorflow::NewSession(options)); tensorflow::Status load_status = session->Create(graph_def); if (!load_status.ok()) { std::cerr << "Failed to create session: " << load_status.ToString() << std::endl; return load_status; }
3. 检查版本兼容性与编译环境
如果你的TensorFlow是自行编译的,要确保编译时的CUDA、cuDNN版本和运行环境完全匹配。另外,部分旧版本的TensorFlow C++ API存在多次初始化GPU设备时重复注册的bug,尝试升级到2.x系列的稳定后期版本可能会解决问题。
4. 避免重复初始化TensorFlow环境
确保你的程序全局只初始化一次TensorFlow环境,不要多次调用NewSession或重复加载模型时重复触发设备注册逻辑。如果是多线程/多实例场景,要做好全局初始化的控制。
另外你提到用root权限运行没用,确实这个问题和权限无关,主要还是库链接、API调用时机或版本的问题。
内容的提问来源于stack exchange,提问作者Pavle

