我正在尝试使用tensorflow c ++ api(仅限CPU)运行SqueezeDet。我已经冻结了tensorflow图并从C ++加载了它。就检测质量而言,一切都很好,但性能要比python慢得多。这可能是什么原因?
简化后,我的代码如下所示:
int main (int argc, const char * argv[])
{
// Initializing graph
tensorflow::GraphDef graph_def;
// Folder in which graph data is located
string graph_file_name = "Model/graph.pb";
// Loading graph
tensorflow::Status graph_loaded_status = ReadBinaryProto(tensorflow::Env::Default(), graph_file_name, &graph_def);
if (!graph_loaded_status.ok())
{
cout << graph_loaded_status.ToString() << endl;
return 1;
}
unique_ptr<tensorflow::Session> session_sqdet(tensorflow::NewSession(tensorflow::SessionOptions()));
tensorflow::Status session_create_status = session_sqdet->Create(graph_def);
if (!session_create_status.ok())
{
cout << "Session create status: fail." << endl;
return 1;
}
while ()
{
/* create & preprocess batch */
session.Run({{ "image_input", input_tensor}, {"keep_prob", prob_tensor}}, {"probability/score", "bbox/trimming/bbox"}, {}, &final_output);
/* do some postprocessing */
}
}
我试过的
1)使用优化标志-全部打开,没有警告。
2)使用批处理:性能有所提高,但是python和C ++之间的差距仍然很大(在batch_size = 20的情况下,运行会话需要1s对比2.4s)。
任何帮助将不胜感激。
我在这个问题上花了很多时间(大部分是因为我犯了愚蠢的错误),但是我终于解决了。现在,我想在这里发布我的经验,因为它可能有用。
因此,我建议您采取以下步骤来跟着遇到相同问题的人进行跟踪(尽管其中有些非常明显):
0)正确进行分析!确保使用的工具在多核/ GPU /任何设置下均可靠。
1)检查tensorflow和所有相关软件包是否已启用所有优化。
2)优化冻结后的图形。
3)如果在训练和推理期间使用不同的批次大小,请确保已删除模型中的所有依赖项!请注意,否则,在结果质量方面,您将不会收到错误消息或什至更差的性能,您只会遇到神秘的减速!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句