我正在编写一个围绕tensorflow 1.2 C API的c ++包装器(用于推理目的,如果重要的话)。由于我的应用程序是一个多进程和多线程的应用程序,其中资源是显式分配的,我想限制Tensorflow只使用一个线程。
目前,运行一个允许批量处理的简单推理测试,我看到它正在使用所有CPU内核。我已经尝试使用C和C ++的混合来限制新会话的线程数,如下所示(原谅我的部分代码片段,我希望这是有道理的):
tensorflow::ConfigProto conf;
conf.set_intra_op_parallelism_threads(1);
conf.set_inter_op_parallelism_threads(1);
conf.add_session_inter_op_thread_pool()->set_num_threads(1);
std::string str;
conf.SerializeToString(&str);
TF_SetConfig(m_session_opts,(void *)str.c_str(),str.size(),m_status);
m_session = TF_NewSession(m_graph, m_session_opts, m_status);
但我认为它没有任何区别 - 所有核心仍然得到充分利用。
我正确使用C API吗?
(我目前的工作是编译Tensorflow,硬编码线程数为1,这可能会起作用,但显然不是最好的方法......)
- 更新 -
我也尝试过添加:
conf.set_use_per_session_threads(true);
没有成功。仍然使用多个核心......
我也尝试以高日志冗长运行,并获得此输出(仅显示我认为相关的内容):
tensorflow/core/common_runtime/local_device.cc:40] Local device intraop parallelism threads: 8
tensorflow/core/common_runtime/session_factory.cc:75] SessionFactory type DIRECT_SESSION accepts target:
tensorflow/core/common_runtime/direct_session.cc:95] Direct session inter op parallelism threads for pool 0: 1
一旦我使用TF_NewGraph()实例化新图形,就会出现“parallelism threads:8”消息。虽然我没有找到在此图分配之前指定选项的方法......
我有同样的问题,并通过在创建我的应用程序创建的第一个TF会话时设置线程数来解决它。如果未使用选项对象创建第一个创建的会话,则TF将创建工作线程作为计算机上的核心数* 2。
这是我使用的C ++代码:
// Call when application starts
void InitThreads(int coresToUse)
{
// initialize the number of worker threads
tensorflow::SessionOptions options;
tensorflow::ConfigProto & config = options.config;
if (coresToUse > 0)
{
config.set_inter_op_parallelism_threads(coresToUse);
config.set_intra_op_parallelism_threads(coresToUse);
config.set_use_per_session_threads(false);
}
// now create a session to make the change
std::unique_ptr<tensorflow::Session>
session(tensorflow::NewSession(options));
session->Close();
}
传递1以将内部和内部线程的数量限制为1。
编辑:重要说明:此代码在从主应用程序(谷歌样本培训师)调用时工作但当我将其移动到专用于包裹tensorFlow的DLL时停止工作。 TF 1.4.1忽略我传递的参数并旋转所有线程。我想听听你的意见......