架构

TensorFlow Serving 是一个灵活、高性能的机器学习模型服务系统,专为生产环境而设计。TensorFlow Serving 使得部署新算法和实验变得容易,同时保持相同的服务器架构和 API。TensorFlow Serving 提供与 TensorFlow 模型的开箱即用集成,但可以轻松扩展以服务其他类型的模型。

关键概念

要了解 TensorFlow Serving 的架构,您需要了解以下关键概念

可服务对象

可服务对象是 TensorFlow Serving 中的核心抽象。可服务对象是客户端用来执行计算(例如,查找或推理)的底层对象。

可服务对象的规模和粒度是灵活的。单个可服务对象可能包含从查找表的单个分片到单个模型到推理模型元组的任何内容。可服务对象可以是任何类型和接口,从而实现灵活性和未来的改进,例如

  • 流式结果
  • 实验性 API
  • 异步操作模式

可服务对象不管理自己的生命周期。

典型的可服务对象包括以下内容

  • TensorFlow SavedModelBundle (tensorflow::Session)
  • 用于嵌入或词汇查找的查找表

可服务对象版本

TensorFlow Serving 可以在单个服务器实例的生命周期内处理一个或多个可服务对象的版本。这使得可以随着时间的推移加载新的算法配置、权重和其他数据。版本使多个版本的可服务对象能够同时加载,从而支持逐步推出和实验。在服务时,客户端可以请求特定模型的最新版本或特定版本 ID。

可服务对象流

可服务对象流是可服务对象版本的序列,按版本号递增排序。

模型

TensorFlow Serving 将模型表示为一个或多个可服务对象。机器学习模型可能包含一个或多个算法(包括学习到的权重)以及查找表或嵌入表。

您可以将复合模型表示为以下任一内容

  • 多个独立的可服务对象
  • 单个复合可服务对象

可服务对象也可能对应于模型的一部分。例如,大型查找表可以跨多个 TensorFlow Serving 实例进行分片。

加载器

加载器管理可服务对象的生命周期。加载器 API 使得通用基础设施独立于特定的学习算法、数据或产品用例。具体来说,加载器标准化了加载和卸载可服务对象的 API。

来源

来源是查找并提供可服务对象的插件模块。每个来源提供零个或多个可服务对象流。对于每个可服务对象流,来源为每个可加载版本提供一个加载器实例。(来源实际上与零个或多个来源适配器链接在一起,链中的最后一个项目会发出加载器。)

TensorFlow Serving 的来源接口可以从任意存储系统发现可服务对象。TensorFlow Serving 包含常见的参考来源实现。例如,来源可以访问 RPC 等机制,并可以轮询文件系统。

来源可以维护跨多个可服务对象或版本共享的状态。这对于使用版本之间增量(差异)更新的可服务对象很有用。

期望版本

期望版本表示应该加载并准备好的可服务对象版本的集合。来源一次为单个可服务对象流通信此可服务对象版本的集合。当来源向管理器提供新的期望版本列表时,它会取代该可服务对象流的先前列表。管理器会卸载列表中不再出现的任何先前加载的版本。

请参阅 高级教程,了解版本加载在实践中的工作原理。

管理器

管理器处理可服务对象的完整生命周期,包括

  • 加载可服务对象
  • 提供可服务对象
  • 卸载可服务对象

管理器监听来源并跟踪所有版本。管理器尝试满足来源的请求,但可能会拒绝加载期望版本,例如,如果所需的资源不可用。管理器也可能会推迟“卸载”。例如,管理器可能会等待直到更新版本完成加载后再卸载,这基于始终保证至少加载一个版本的策略。

TensorFlow Serving 管理器提供了一个简单、狭窄的接口 - GetServableHandle() - 供客户端访问加载的可服务对象实例。

核心

使用标准 TensorFlow Serving API,TensorFlow Serving 核心管理可服务对象的以下方面

  • 生命周期
  • 指标

TensorFlow Serving 核心将可服务对象和加载器视为不透明对象。

可服务对象的生命周期

tf serving architecture diagram

从广义上讲

  1. 来源为可服务对象版本创建加载器。
  2. 加载器作为期望版本发送到管理器,管理器加载它们并将其提供给客户端请求。

更详细地说

  1. 来源插件为特定版本创建加载器。加载器包含加载可服务对象所需的所有元数据。
  2. 来源使用回调通知管理器期望版本。
  3. 管理器应用配置的版本策略来确定要采取的下一步操作,这可能是卸载先前加载的版本或加载新版本。
  4. 如果管理器确定安全,它会向加载器提供所需的资源并告诉加载器加载新版本。
  5. 客户端向管理器请求可服务对象,要么显式指定版本,要么只是请求最新版本。管理器返回可服务对象的句柄。

例如,假设来源表示具有频繁更新的模型权重的 TensorFlow 图。权重存储在磁盘上的文件中。

  1. 来源检测到模型权重的最新版本。它创建一个包含指向磁盘上模型数据的指针的加载器。
  2. 来源通知动态管理器期望版本。
  3. 动态管理器应用版本策略并决定加载新版本。
  4. 动态管理器告诉加载器有足够的内存。加载器使用新权重实例化 TensorFlow 图。
  5. 客户端请求指向模型最新版本的句柄,动态管理器返回指向可服务对象最新版本的句柄。

可扩展性

TensorFlow Serving 提供了几个扩展点,您可以在其中添加新功能。

版本策略

版本策略指定单个可服务对象流中版本加载和卸载的顺序。

TensorFlow Serving 包含两种策略,可以满足大多数已知的用例。它们是可用性保留策略(避免留下零个加载的版本;通常在卸载旧版本之前加载新版本)和资源保留策略(避免同时加载两个版本,从而需要双倍的资源;在加载新版本之前卸载旧版本)。对于 TensorFlow Serving 的简单使用,其中模型的服务可用性很重要,而资源成本很低,可用性保留策略将确保在卸载旧版本之前加载并准备新版本。对于 TensorFlow Serving 的复杂使用,例如跨多个服务器实例管理版本,资源保留策略需要的资源最少(没有用于加载新版本的额外缓冲区)。

来源

新的来源可以支持新的文件系统、云产品和算法后端。TensorFlow Serving 提供了一些常见的构建块,使创建新的来源变得容易且快速。例如,TensorFlow Serving 包含一个实用程序,用于围绕简单来源包装轮询行为。来源与特定算法和数据托管可服务对象的加载器密切相关。

请参阅 自定义来源 文档,了解有关如何创建自定义来源的更多信息。

加载器

加载器是添加算法和数据后端的扩展点。TensorFlow 就是这样一个算法后端。例如,您需要实现一个新的加载器,以便加载、提供访问权限并卸载新类型的可服务机器学习模型的实例。我们预计将为查找表和其他算法创建加载器。

请参阅 自定义可服务对象 文档,了解如何创建自定义可服务对象。

批处理器

将多个请求批处理到单个请求中可以显着降低执行推理的成本,尤其是在存在 GPU 等硬件加速器的情况下。TensorFlow Serving 包含一个请求批处理小部件,它允许客户端轻松地跨请求批处理其特定于类型的推理,并将它们批处理到算法系统可以更有效地处理的批处理请求中。有关更多信息,请参阅 批处理指南