为什么tflite模型在多批次推断中速度变慢

时间:2020-07-28 02:21:41

标签: c++ tensorflow-lite

我将一个很小的bert模块转换为tflite并使用tensorflow lite c ++ api运行推断。

当批处理大小为1时,tensorflow lite执行平均运行时间为0.6ms,而tensorflow则执行平均运行时间为1ms(默认线程为num);当批量大小为10时,tensorflow lite的平均运行时间为5ms,而tensorflow的平均运行时间为3ms。

当我尝试应用SetNumThreads(4)时,tensorflow lite似乎并没有在多线程速度上做任何事情。

尽管CPU的使用率从100%更改为200%,但SetNumThreads(4)和SetNumThreads(1)执行相同的运行时间。

我想知道这对于tflite在X86桌面上是否正常?

这是我的自定义tflite c ++代码的一部分

class Session {
public:
Session() {
  model_ = NULL;
  interpreter_ = NULL;
}

bool Open(const std::string &saved_model) {
model_ = tflite::FlatBufferModel::BuildFromFile(saved_model.c_str());
if (!model_) {
  return false;
}

tflite::InterpreterBuilder(*model_.get(), resolver_)(&interpreter_);

if (!interpreter_) {
  return false;
}
interpreter_->SetNumThreads(4);
return true;
}

bool Run(std::vector<int> &dims, int32_t *tok_id, int32_t *msk_id, int32_t *seg_id, float *output) const {
 int tok_index = interpreter_->inputs()[2];
 int msk_index = interpreter_->inputs()[1];
 int seg_index = interpreter_->inputs()[0];
 interpreter_->ResizeInputTensor(tok_index, dims);
 interpreter_->ResizeInputTensor(msk_index, dims);
 interpreter_->ResizeInputTensor(seg_index, dims);

 if(interpreter_->AllocateTensors() != kTfLiteOk) //remove AllocateTensors() did not change the runtime
     return false;
 int32_t bytes = dims[0] * dims[1] * sizeof(int32_t);
 int32_t* tok_tensor = interpreter_->typed_tensor<int32_t>(tok_index);
 memcpy(tok_tensor, tok_id, bytes);
 int32_t* msk_tensor = interpreter_->typed_tensor<int32_t>(msk_index);
 memcpy(msk_tensor, msk_id, bytes);
 int32_t* seg_tensor = interpreter_->typed_tensor<int32_t>(seg_index);
 memcpy(seg_tensor, seg_id, bytes);
 if(interpreter_->Invoke() != kTfLiteOk)
     return false;
 bytes = dims[0] * sizeof(float);
 float* result = interpreter_->typed_output_tensor<float>(0);
 memcpy(output, result, bytes);
 return true;
}

private:
std::unique_ptr<tflite::FlatBufferModel> model_;
std::unique_ptr<tflite::Interpreter> interpreter_;
tflite::ops::builtin::BuiltinOpResolver resolver_;
};

1 个答案:

答案 0 :(得分:0)

几件事:

  • TensorFlow Lite针对移动部署进行了优化,实际上,这通常意味着基于ARM的设备。尽管我们正在积极致力于TFLite的x86性能的改进,但推理延迟的改进可能不如ARM CPU上的一致。
  • TensorFlow Lite已针对移动大小的工作负载进行了优化,可能无法像标准TensorFlow一样针对较大的批处理大小或多线程进行优化。

如果您使用的是浮点模型,那么最近发布的XNNPACK后端应该为较大的批处理大小和x86设备提供一些改进。另请参见blog post宣布在TF 2.3中的支持以及最新的夜间版本。目前,您必须在构建时选择加入,但我们希望默认情况下在不久的将来为更多设备和型号启用此后端。