tensorflow 为什么TFlite python API比C++快?

mwngjboj  于 2023-03-19  发布在  Python
关注(0)|答案(1)|浏览(178)

我正在做一个需要使用TFlite C++ API的项目。我以前用Python做过。但是,问题是使用C++ API从模型推理比Python推理慢5倍。2模型是mediapipes hand和palmtflite模型。3我能知道C推理比Python推理慢的原因吗?4有什么方法可以使它更快吗?下面我附上了相关部分的Python和C代码。非常感谢。
Python推理:

self.interp_joint.set_tensor(self.in_idx_joint, img_norm.reshape(1, 224, 224, 3))
joints = self.interp_joint.get_tensor(self.out_idx_joint)

C++推理:

float* input_data_ptr = hand_landmarks_interpreter->typed_tensor<float>(in_idx_hand);
memcpy(input_data_ptr, img_norm.data, img_norm.total() * img_norm.elemSize());
hand_landmarks_interpreter->Invoke();
TfLiteIntArray *output_dims = hand_landmarks_interpreter->tensor(out_idx_hand)->dims;
auto output_size = output_dims->data[output_dims->size - 1];
float* result = hand_landmarks_interpreter->typed_tensor<float>(out_idx_hand);

注:花费大量时间的部分是invoke命令。在这两种情况下,图像都被重新整形为正确的大小(224,224,3),并且它们是CV_32FC3类型。
CMakeLists.txt内容(我正在Visual Studio代码环境中使用cmake构建我的项目。):

cmake_minimum_required(VERSION 3.16)
project(main C CXX)

set(TENSORFLOW_SOURCE_DIR "C:/MyApps/Tensorflow/tensorflow_src" CACHE PATH
  "Directory that contains the TensorFlow project"
)

if(NOT TENSORFLOW_SOURCE_DIR)
  get_filename_component(TENSORFLOW_SOURCE_DIR
    "C:/MyApps/Tensorflow/tensorflow_src"
    ABSOLUTE
  )
endif()

find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR})

add_subdirectory(
  "C:/MyApps/Tensorflow/tensorflow_src/tensorflow/lite"
  "${CMAKE_CURRENT_BINARY_DIR}/tensorflow-lite"
  EXCLUDE_FROM_ALL
)

add_compile_options(-static-libgcc -static-libstdc++)

set(SOURCES main.cpp hand_tracker.cpp non_max_suppression_fast.cpp
             ${PROJECT_SOURCE_DIR}/hand_tracker.h ${PROJECT_SOURCE_DIR}/non_max_suppression_fast.h)
             
set(CMAKE_CXX_STANDARD 11)
add_executable(main
  ${SOURCES}
)

target_link_libraries(main
  tensorflow-lite
  ${OpenCV_LIBS}
)
ahy6op9u

ahy6op9u1#

默认情况下,当运行C时,你的实现可能只使用一个CPU内核。然而,在Python中,负载分布在多个内核上。这使得执行速度显著加快!上次我没有时间研究如何在使用C的CPU上更快地进行推理,我只是将所有内容导出为Python库并在那里运行它:/但是,也许有人可以给予更多关于如何使用多个内核运行推理的见解(或者我抽出时间去查找)。

相关问题