计算机系统应用教程网站

网站首页 > 技术文章 正文

Coral 迎来多项更新,为边缘 AI 注入更多精彩

btikc 2024-09-05 12:40:57 技术文章 9 ℃ 0 评论

文 / Carlos Mendon?a,Coral


冬天终于来了,而与之一起到来的是 Coral 新发布的 C++ Python API 及工具,还有针对 Edge TPU 优化的新模型,以及对基于 TensorFlow 2.0 工作流的进一步支持。

C++ :
https://github.com/google-coral/libcoral
Python API :
https://github.com/google-coral/pycoral
针对 Edge TPU 优化:
https://coral.ai/models


Coral (https://coral.ai) 是一个可用于构建本地 AI 产品的完整工具包。我们的设备端推理功能,以及借助 TensorFlow Lite 和 Edge TPU,支持您构建高效、私密、快速和离线的产品。

TensorFlow Lite 和 Edge TPU:
https://coral.ai/technology


之前,我们提供了 Python 和 C++ 版本的 API,从而让开发者可以利用 Edge TPU 来提高推理速度。通过对机器学习模型进行离线处理的方式,可以大大节省带宽和云计算成本。同时这样做也可以使数据保留在本地,保护用户的隐私。最近,我们一直在努力重构我们的 API,使其更加模块化、重用性更强并拥有更好的性能。与此同时,我们还在减少不必要的 API 抽象,并开放开发者所熟悉的更多原生 TensorFlow Lite API。


因此,在最新的版本中,我们现在提供了两个独立的复用库,每个库都依托于强大的 TensorFlow Lite API 构建而成,并且在自己的存储库中各自独立,其分别是适用于 C++ 的 libcoral 和适用于 Python 的 PyCoral

libcoral :
https://github.com/google-coral/libcoral
Python 的 PyCoral :
https://github.com/google-coral/pycoral


libcoral (C++)

与我们之前的一些 API 不同,libcoral 并不会隐藏 tflite::Interpreter。相反,我们会将这个原生的 TensorFlow Lite 类打造成一个头等组件,并提供一些额外的辅助 API,以在您处理常见模型(例如分类和检测)时,帮您简化代码。


使用新的 libcoral 库在 C++ 中执行推理时,开发者通常应该遵循以下模式:


1. 使用 Edge TPU 上下文创建 tflite::Interpreter 实例并分配内存

为简化这一步骤,libcoral 提供了 MakeEdgeTpuInterpreter() 函数:

// Load the model
auto model = coral::LoadModelOrDie(absl::GetFlag(FLAGS_model_path));

// Get the Edge TPU context
auto tpu_context = coral::ContainsEdgeTpuCustomOp(*model) ?
 coral::GetEdgeTpuContextOrDie() :
 nullptr;

// Get the interpreter
auto interpreter = coral::MakeEdgeTpuInterpreterOrDie(
 *model,
 tpu_context.get());


2. 配置 interpreter 的输入


3. 调用 interpreter:

interpreter->Invoke();

作为 Invoke() 的替代方案,您可以使用 InvokeWithMemBuffer()InvokeWithDmaBuffer() 函数来实现更高的性能,这两个函数可以分别处理输入数据而无需从另一个内存区域或从DMA文件描述符进行复制。


4. 处理 interpreter 的输出

为简化这一步骤,libcoral 提供了一些适配器,所需的代码更少:

auto result = coral::GetClassificationResults(
 	*interpreter,
 	/* threshold= */0.0f,
 	/*top_k=*/3);


上方是分类适配器的示例,开发者可以在其中指定最小置信度阈值,以及返回结果的数量上限。该 API 还具有一个检测适配器,该适配器拥有自己的结果过滤参数。


如需查看完整的示例应用源代码,请参阅 GitHub 上的 classify_image.cc,如需获取有关如何将 libcoral 集成到应用中的说明,请参考 GitHub 上的 README.md

GitHub 上的 classify_image.cc :
https://github.com/google-coral/libcoral/blob/master/coral/examples/classify_image.cc
GitHub 上的 README.md :
https://github.com/google-coral/libcoral/blob/master/README.md


我们还在此次的新版本中带来了对设备端再训练的更新,能够在更新的 ImprintingEngine 上将 imprinting 函数与推理解耦。新的设计让 imprinting 引擎能够直接与 tflite::Interpreter 一起使用。


为方便寻找主机上可用的 Edge TPU,libcoral 支持诸如 "usb:0" 或 "pci:1" 之类的标签。您可借此更加轻松地管理多 Edge TPU 系统的资源。


最后,我们做了很多性能上的改进,例如更高效的内存使用和基于内存而不是基于文件的抽象。此外,通过将 Abseil (https://abseil.io/) 库用于误差传播、通用接口和其他常见模式,API 的设计也更加一致,应该可以提供更一致和稳定的开发者体验。


PyCoral (Python)

新的 PyCoral 库(在新的 pycoral Python 模块中提供)遵循了 libcoral 引入的一些设计模式,并为我们的 C++ 和 Python API 带来了平衡。PyCoral 为分类和检测以及基于相同标签的 TPU 语义寻址设计了相同的 imprinting 解耦设计和模型适配器。


在 PyCoral 中,“运行推理”功能现在已完全委托给原生的 TensorFlow Lite 库,这是因为我们放弃了用于抽象 TensorFlow 解释器的模型“引擎”。借助这项更改,我们消除了由特定于 Coral 的 BasicEngine、ClassificationEngine 和 DetectionEngine 类(这些来自“Edge TPU Python 库”的 API 现已被弃用)所引入的代码重复。


要使用 PyCoral 执行推理,我们可以遵循与 libcoral 类似的模式:


1. 创建 interpreter:

interpreter = edgetpu.make_interpreter(model_file)
interpreter.allocate_tensors()


2. 配置 interpreter 的输入:

common.set_input(interpreter, image)


3. 调用 interpreter:

interpreter.invoke()


4. 处理 interpreter 的输出:

classes = classify.get_classes(interpreter, top_k=3)


如需获取完整详细的示例代码,请查看我们的 Python 版文档 (https://coral.ai/docs/edgetpu/tflite-python/)。


Coral Model Garden 更新

在这一版本中,我们通过 MobileDet 进一步扩展了 Coral Model Garden。MobileDet 指的是使用 TensorFlow 对象检测 API 的轻量级单发检测器系列,该系列在 Edge TPU 上实现了最先进的精度和延迟权衡。与 MobileNet 系列模型相比,MobileDet 是一种低延迟的检测模型,具有更高的准确性。


查看 Coral 为 Edge TPU 提供的完整
模型集合 (https://coral.ai/models),其中包括分类、检测、分割和专门为设备端训练准备的模型。


将我们的整个工作流和模型集合迁移到 TensorFlow 2 是一项长期工作。从这个版本的 Coral 机器学习 API 开始,我们将引入对基于 TensorFlow 2 的工作流的支持。目前,MobileNet v1 (ImageNet)、MobileNet v2 (ImageNet)、MobileNet v3 (ImageNet)、ResNet50 v1 (ImageNet) 和 UNet MobileNet v2 (Oxford pets) 均支持使用 TensorFlow 2 进行训练和转换。


Model Pipelining

libcoral 和 PyCoral 都已将 Model Pipelining 功能从测试状态升级到正式使用状态。借助 Model Pipelining 功能,我们能够分割大型模型,然后将其分配到多个 Edge TPU 上,从而大大加快模型的运行速度。


请参考对应文档以查看该 API 的
C++Python 版本示例。

C++ :
https://coral.ai/docs/reference/cpp/pipeline/
Python :
https://coral.ai/docs/reference/py/pycoral.pipeline/


我们会通过 Edge TPU 编译器完成模型分割,该编译器采用参数计数算法,可将模型分割成参数大小相近的片段。对于此算法无法提供所需吞吐量的情况,我们在这一版本中引入了一个新工具,该工具支持基于分析的算法,通过实际多次运行模型,然后根据观察到的延迟来划分片段,因此可能会得到更平衡的输出。


新的
profiling_partition 工具可以这样使用:

./profiling_partition \
  --edgetpu_compiler_binary $PATH_TO_COMPILER \
  --model_path $PATH_TO_MODEL \
  --output_dir $OUT_DIR \
  --num_segments $NUM_SEGMENTS


转载自:谷歌开发者官方账号【TensorFlow】原创文章

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表