我正在尝试使用cpp tflite API在开发板上查询模型。该代码已使用usb棒进行了测试,并且可以正常运行,但是,在开发板上,我在此行遇到了错误:
model_interpreter_ = coral::BuildEdgeTpuInterpreter(*model_, this->edgetpu_context_.get());
这是错误:
INFO: Initialized TensorFlow Lite runtime.
ERROR: Failed to retrieve TPU context.
ERROR: Node number 0 (edgetpu-custom-op) failed to prepare.
使用python API,相同的模型可以正常工作。
开发板上是否支持tflite cpp API?
在开发板上,我拥有最新版本(12-1) 这就是我构建tflite lib的步骤:
在本地为arm64构建tflite(使用构建通用脚本,与所描述的here不同),我使用了分支v.2.0。 *原因是缺乏在开发板上构建的虚拟内存和磁盘空间。
在开发板上安装了flatbuffer。
编辑: 我能够从开发板上的tensorflow分支v2.0构建tflite,进行更新以链接到本地构建的lib,仍然出现相同的错误...
编辑2: 我能够使用tflite编译后的tf-r1.15复制相同的行为。我也尝试添加@Nam Vu建议的打印一些可用tpus。所以这是一个代码片段:
cout << "check num available tpus\n";
cout << available_tpus.size() << "\n";
cout << "get edge session\n";
this->edgetpu_context_ = edgetpu::EdgeTpuManager::GetSingleton()->OpenDevice();
cout << "check num available tpus again:\n";
cout << available_tpus.size() << "\n";
cout << "get model buffer\n";
this->model_ = tflite::FlatBufferModel::BuildFromFile(model_path.c_str());
cout << "build model interpeter\n";
this->model_interpreter_ = coral::BuildEdgeTpuInterpreter(*model_, this->edgetpu_context_.get());
导致:
Hello
check num available tpus
3689348814741910324
get edge session
check num available tpus again:
3689348814741910324
get model buffer
build model interpeter
Segmentation fault
答案 0 :(得分:0)
想知道是否由于某种原因无法检测到tpu,您可以尝试以下方法吗:
const auto& available_tpus = edgetpu::EdgeTpuManager::GetSingleton()->EnumerateEdgeTpu();
cout << available_tpus.size() << "\n"; // hopefully we'll see 1 here
然后创建上下文:
std::shared_ptr<edgetpu::EdgeTpuContext> edgetpu_context =
edgetpu::EdgeTpuManager::GetSingleton()->OpenDevice(
available_tpus[0].type, available_tpus[0].path);