近日,Uber 在其官方博客宣布正式开源 Neuropod ,该工具是一个提供统一界面的库,用于从 C ++ 和 Python 的多个框架中运行深度学习模型。Uber 表示,Neuropod 使研究人员可以轻松地在所选择的框架内构建模型,同时还简化了这些模型的生产。

在工业和学术界,数据科学家在开发过程中使用多个框架的情况并不少见。例如,Uber 的高级技术小组(ATG)在过渡到 Facebook 的 PyTorch 之前整合了 Google 的 TensorFlow,这导致与 TensorFlow 一起运行时出现了内存损坏和调试问题。

为了解决这类问题,Uber 发布了 Neuropod,通过使框架在运行模型时看起来相同,从而防止了不兼容问题的出现,并为 TensorFlow,PyTorch,Keras 和 TorchScript 提供开箱即用的支持。

GitHub 地址: https://github.com/uber/neuropod

自 2019 年初内部发布以来,Neuropod 一直在快速部署新模型方面发挥了作用。去年,Uber 在其 ATG、AI 和其他核心业务中部署了数百种 Neuropod 模型。这些模型包括用于需求预测的模型、用于乘车的到达时间(ETA)预测、用于 Uber Eats 的菜单转录以及用于自动驾驶车辆的对象检测模型。

Neuropod 从问题定义的概念开始——对模型要解决的“问题”的正式描述。在这种情况下,问题可能是图像的语义分割或文本的语言翻译。通过正式定义问题,可以将其视为接口并抽象出具体的实现。每个 Neuropod 模型都实现问题定义,结果,解决相同问题的任何模型都可以互换,即使它们使用不同的框架也是如此。

Neuropod 的工作原理是:将现有模型包装在 Neuropod 包中,该软件包包含原始模型以及元数据、测试数据和自定义操作(如果有)。

使用 Neuropod,任何模型都可以从任何受支持的语言下执行。例如,如果用户想从 C ++ 运行 PyTorch 模型,Neuropod 将在后台启动一个 Python 解释器,并与之通信以运行模型。这是必需的,因为 PyTorch 模型需要运行 Python 解释器。此功能使开发者能够快速测试 PyTorch 模型,然后再尝试将其转换为 TorchScript ,该模型可以从 C ++ 本地运行。

Uber开源Neuropod:可统一AI框架并将模型转化为产品

Neuropod 当前支持从 Python 和 C ++ 运行模型。但是,为该库编写其他语言绑定很简单。例如,Uber 的 ML 平台 Michelangelo 使用 Neuropod 作为其核心 DL 模型格式,并实现了 Go 绑定以从 Go 运行其生产模型。

应用程序与框架无关的 API 进行交互,并且 Neuropod 将这些与框架无关的调用转换为对基础框架的调用。最后,Neuropod 导出模型并建立度量标准管道以将性能与定义的基准进行比较。

Uber 在博客中写道,Neuropod 仅仅是开始,未来将实现的一些功能包括:

  1. 版本选择:此功能使用户能够在导出模型时指定框架的所需版本范围。例如,一个模型可能需要 TensorFlow 1.13.1,而 Neuropod 将使用带有正确版本框架的 OPE 自动运行该模型,使用户可以在单个应用程序中使用多个框架和每个框架的多个版本。

  2. 封装操作:此功能使应用程序可以指定使用张量“完成”的时间。一旦张量被封装,Neuropod 可以在运行推理之前将数据异步传输到正确的目的地(例如本地 GPU 或工作进程等)。这有助于用户并行化数据传输和计算。

  3. Dockerized 工作进程:这样可以在模型之间提供更多的隔离。例如,使用此功能,即使需要不同 CUDA 版本的模型也可以在同一应用程序中运行。