我将一个很小的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_;
};
答案 0 :(得分:0)
几件事:
如果您使用的是浮点模型,那么最近发布的XNNPACK后端应该为较大的批处理大小和x86设备提供一些改进。另请参见blog post宣布在TF 2.3中的支持以及最新的夜间版本。目前,您必须在构建时选择加入,但我们希望默认情况下在不久的将来为更多设备和型号启用此后端。