google-coral - 无法让 USB 在具有 Coral Edge TPU 的 Raspberry-Pi 零上工作
问题描述
我已经为 Raspi-0 交叉编译了 libedgetpu,我可以运行一个最小的 C++ 程序。但是,它没有检测到任何 TPU。(Coral TPU 通过 USB 端口连接到 Pi-0)。
pi@raspberrypi:~ $ lsusb
Bus 001 Device 004: ID 1a6e:089a Global Unichip Corp.
Bus 001 Device 003: ID 0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
我在代码中添加了一些调试语句,这是输出:
pi@raspberrypi:/tmp $ LD_LIBRARY_PATH=. ./minimal
1...
######## BuildFromFile..
libedgetpu/tflite/edgetpu_manager_direct.cc:242 #### EnumerateEdgeTpuInternal 1
libedgetpu/driver/driver_factory.cc:130 #### DriverFactory::GetOrCreate 1
libedgetpu/tflite/edgetpu_manager_direct.cc:250 #### EnumerateEdgeTpuInternal 2
libedgetpu/driver/driver_factory.cc:48 #### DriverFactory::Enumerate 1
libedgetpu/driver/driver_factory.cc:58 #### DriverFactory::Enumerate device_list.size:0
libedgetpu/tflite/edgetpu_manager_direct.cc:252 #### EnumerateEdgeTpuInternal 2, count:0
libedgetpu/tflite/edgetpu_manager_direct.cc:284 #### EnumerateEdgeTpuInternal 4
available_tpus.size: 0
2
libedgetpu/tflite/edgetpu_manager_direct.cc:242 #### EnumerateEdgeTpuInternal 1
libedgetpu/driver/driver_factory.cc:130 #### DriverFactory::GetOrCreate 1
libedgetpu/tflite/edgetpu_manager_direct.cc:250 #### EnumerateEdgeTpuInternal 2
libedgetpu/driver/driver_factory.cc:48 #### DriverFactory::Enumerate 1
libedgetpu/driver/driver_factory.cc:58 #### DriverFactory::Enumerate device_list.size:0
libedgetpu/tflite/edgetpu_manager_direct.cc:252 #### EnumerateEdgeTpuInternal 2, count:0
libedgetpu/tflite/edgetpu_manager_direct.cc:284 #### EnumerateEdgeTpuInternal 4
3
INFO: Initialized TensorFlow Lite runtime.
3.1
3.2
3.3
ERROR: Failed to retrieve TPU context.
ERROR: Node number 0 (edgetpu-custom-op) failed to prepare.
Failed to allocate tensors.
Done
这是我的 main.cc
#include <iostream>
#include <memory>
#include "edgetpu.h"
#include "tensorflow/lite/builtin_op_data.h"
#include "tensorflow/lite/interpreter.h"
#include "tensorflow/lite/interpreter.h"
#include "tensorflow/lite/kernels/register.h"
#include "tensorflow/lite/model.h"
namespace {
std::unique_ptr<tflite::Interpreter> BuildEdgeTpuInterpreter(
const tflite::FlatBufferModel& model,
edgetpu::EdgeTpuContext* edgetpu_context)
{
tflite::ops::builtin::BuiltinOpResolver resolver;
resolver.AddCustom(edgetpu::kCustomOp, edgetpu::RegisterCustomOp());
std::unique_ptr<tflite::Interpreter> interpreter;
if (tflite::InterpreterBuilder(model, resolver)(&interpreter) != kTfLiteOk) {
std::cerr << "Failed to build interpreter." << std::endl;
}
std::cout << "3.1\n";
// Bind given context with interpreter.
interpreter->SetExternalContext(kTfLiteEdgeTpuContext, edgetpu_context);
std::cout << "3.2\n";
interpreter->SetNumThreads(1);
std::cout << "3.3\n";
if (interpreter->AllocateTensors() != kTfLiteOk) {
std::cerr << "Failed to allocate tensors." << std::endl;
}
return interpreter;
}
}//namespace
int main(int argc, char**argv)
{
const std::string model_path = "/tmp/mobilenet_v1_1.0_224_quant_edgetpu.tflite";
std::cout << "1...\n";
std::unique_ptr<tflite::FlatBufferModel> model =
tflite::FlatBufferModel::BuildFromFile(model_path.c_str());
const auto& available_tpus = edgetpu::EdgeTpuManager::GetSingleton()->EnumerateEdgeTpu();
std::cout << "available_tpus.size: " << available_tpus.size() << "\n"; // hopefully we'll see 1 here
std::cout << "2\n";
std::shared_ptr<edgetpu::EdgeTpuContext> edgetpu_context =
edgetpu::EdgeTpuManager::GetSingleton()->OpenDevice();
std::cout << "3\n";
std::unique_ptr<tflite::Interpreter> model_interpreter =
BuildEdgeTpuInterpreter(*model, edgetpu_context.get());
std::cout << "Done\n";
return 0;
}
现在我没有使用 bazel 构建,而是制作了自己的 CMakeLists.txt。
#mkdir buildPi
#cd buildPi
#cmake -DCMAKE_TOOLCHAIN_FILE=/home/dev/oosman/pi/Toolchain-RaspberryPi.cmake ../
#make VERBOSE=1 -j8
#https://www.pyimagesearch.com/2019/04/22/getting-started-with-google-corals-tpu-usb-accelerator/
#on raspi0: sudo apt-get install python3-edgetpu
#https://coral.ai/models/
cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
set(PROJ minimal)
PROJECT(${PROJ})
set(CMAKE_C_FLAGS "-Wall -pthread")
set(CMAKE_C_FLAGS_DEBUG "-g -O0")
set(CMAKE_C_FLAGS_RELEASE "-O3")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -std=c++14 -lstdc++") #c++17 does not work with absl
set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
set(CMAKE_BUILD_TYPE Debug)
set(TFLITE_ENABLE_XNNPACK OFF)
set(CMAKE_SYSTEM_PROCESSOR "armv6")
set(TENSORFLOW_DIR "${CMAKE_SOURCE_DIR}/../tensorflow")
add_definitions(-DDARWINN_PORT_USE_EXTERNAL=1)
include_directories(
${CMAKE_SOURCE_DIR}/
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/bazel-build
${TENSORFLOW_DIR}/
${TENSORFLOW_DIR}/tensorflow/
${TENSORFLOW_DIR}/tensorflow/lite/
${TENSORFLOW_DIR}/tensorflow/lite/tools/optimize/
${CMAKE_BINARY_DIR}/tensorflow/src/tf/
${CMAKE_BINARY_DIR}/tensorflow/src/tf/tensorflow/lite/tools/make/downloads/flatbuffers/include/
${CMAKE_SOURCE_DIR}/googletest/googletest/include
${CMAKE_SOURCE_DIR}/googletest/googlemock/include
${CMAKE_BINARY_DIR}/glog_install/include
)
link_directories(
${CMAKE_BINARY_DIR}
${CMAKE_SOURCE_DIR}/../libusb/buildpi
/home/dev/oosman/pi/x-tools/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/usr/lib/
)
add_subdirectory(tensorflow/tensorflow/lite)
add_library(edgetpu
./api/allocated_buffer.cc
./api/layer_information.cc
./api/tensor_util.cc
./api/driver_factory.cc
./api/buffer.cc
./api/driver_options_helper.cc
./api/watchdog.cc
./driver_shared/time_stamper/driver_time_stamper.cc
./tflite/custom_op_user_data_direct.cc
./tflite/custom_op_data.cc
./tflite/edgetpu_manager_direct.cc
./tflite/edgetpu_c.cc
./tflite/edgetpu_delegate_for_custom_op.cc
./tflite/edgetpu_context_direct.cc
./tflite/custom_op_direct.cc
./tflite/edgetpu_context_factory.cc
./tflite/custom_op.cc
./tflite/edgetpu_delegate_for_custom_op_tflite_plugin.cc
./driver/mmio_driver.cc
./driver/memory/mmio_address_space.cc
./driver/memory/dual_address_space.cc
./driver/memory/buddy_allocator.cc
./driver/memory/mmu_mapper.cc
./driver/memory/buddy_address_space.cc
# ./driver/memory/fake_dram_allocator.cc
# ./driver/memory/fake_mmu_mapper.cc
./driver/memory/nop_address_space.cc
./driver/request.cc
./driver/instruction_buffers.cc
./driver/mmio/coherent_allocator.cc
./driver/device_buffer.cc
./driver/executable_util.cc
./driver/aligned_allocator.cc
./driver/registers/socket_registers.cc
./driver/registers/registers.cc
./driver/package_verifier.cc
./driver/beagle/beagle_top_level_handler.cc
./driver/beagle/beagle_pci_driver_provider.cc
./driver/beagle/beagle_pci_driver_provider_linux.cc
# ./driver/beagle/beagle_pci_driver_provider_windows.cc
./driver/beagle/beagle_usb_driver_provider.cc
./driver/beagle/beagle_kernel_top_level_handler.cc
./driver/beagle/beagle_top_level_interrupt_manager.cc
./driver/kernel/kernel_interrupt_handler.cc
./driver/kernel/kernel_mmu_mapper.cc
./driver/kernel/kernel_coherent_allocator.cc
./driver/kernel/kernel_registers.cc
./driver/kernel/kernel_event_handler.cc
# ./driver/kernel/windows/kernel_event_handler_windows.cc
# ./driver/kernel/windows/kernel_registers_windows.cc
# ./driver/kernel/windows/kernel_event_windows.cc
# ./driver/kernel/windows/kernel_coherent_allocator_windows.cc
./driver/kernel/kernel_wire_interrupt_handler.cc
./driver/kernel/linux/kernel_registers_linux.cc
./driver/kernel/linux/kernel_event_linux.cc
./driver/kernel/linux/kernel_event_handler_linux.cc
./driver/kernel/linux/kernel_coherent_allocator_linux.cc
./driver/interrupt/interrupt_controller.cc
./driver/interrupt/top_level_interrupt_manager.cc
./driver/interrupt/wire_interrupt_handler.cc
./driver/interrupt/grouped_interrupt_controller.cc
./driver/dma_info.cc
./driver/driver_factory.cc
./driver/single_queue_dma_scheduler.cc
./driver/scalar_core_controller.cc
./driver/dma_info_extractor.cc
./driver/single_tpu_request.cc
./driver/device_buffer_mapper.cc
./driver/driver_factory_default.cc
./driver/run_controller.cc
./driver/driver.cc
## ./driver/driver_helper.cc
./driver/dma_chunker.cc
./driver/package_registry.cc
./driver/usb/usb_io_request.cc
./driver/usb/libusb_options_default.cc
# ./driver/usb/libusb_options_windows.cc
./driver/usb/local_usb_device.cc
./driver/usb/usb_dfu_commands.cc
./driver/usb/usb_standard_commands.cc
./driver/usb/usb_driver.cc
./driver/usb/usb_dfu_util.cc
./driver/usb/usb_registers.cc
./driver/usb/usb_ml_commands.cc
./driver/driver_factory_darwin.cc
./driver/allocator.cc
./driver/real_time_dma_scheduler.cc
# ./driver/driver_factory_windows.cc
# ./port/fileio_windows.cc
./port/timer_darwin.cc
# ./port/timer_windows.cc
./port/posix_time.cc
./port/blocking_counter.cc
./port/shared_mutex.cc
./port/default/status_macros.cc
## ./port/default/builddata.cc
./port/default/port_from_tf/status.cc
./port/default/port_from_tf/statusor.cc
./port/default/port_from_tf/logging.cc
./port/default/stringprintf.cc
./port/timer_linux.cc
)
target_link_libraries(edgetpu
tensorflow-lite
)
add_executable(minimal
main.cc
)
target_link_libraries(minimal
dl
edgetpu
tensorflow-lite
usb
udev
)
我注意到它调用
这是一个纯虚函数。存在两个子类,但没有调用它们的 Enumerate 方法:
BeagleUsbDriverProvider::Enumerate()
BeaglePciDriverProvider::Enumerate()
我相信应该调用 BeagleUsbDriverProvider::Enumerate()。但是没有实例化 BeagleUsbDriverProvider 对象。
我在这里想念什么?
解决方案
我想出了答案,这很愚蠢,该库必须构建为共享库:
add_library(edgetpu SHARED
...
之后我得到了一些链接器错误并通过添加so文件的路径来修复它们,它工作了!
推荐阅读
- shopify - Shopify Liquid - 字符串上的 Forlooping
- javascript - node-mysql2 finally 块和 connection.end() 不想被调用
- jmeter-4.0 - 用于 Cognito 应用程序的 JMeter 脚本问题
- r - 如何使用 dplyr 重命名列,其中新列名和原始列名都是变量
- sympy - 如何使用具有多个不等式的求解集
- elasticsearch - 将数据从一台elasticsearch服务器迁移到另一台时,如何解决elasticdump api中的缩进错误?
- c# - 如何使用 XSLT href 链接中的参数调用控制器操作
- c - 循环阻塞函数
- php - 实施 Magento 版本中的问题。2.2.2 关于子域
- java - 春季启动配置问题