在上个月的 Google I/O 大会上,Google发布了TensorFlow Serving 的首个主要版本。Noah Fiedel 对其中的一些新特性做了详细的介绍,并给出了他对该项目未来发展的一些看法。
TensorFlow Serving 1.0 的特性包括:多种批量处理(Batching)选项;一个用于生命周期管理的模型管理器;为同一模型的多版本同时提供服务;支持子任务;数据源定义标准化,用于可插拔、可调用的模型存储。
Fiedel 报告针对的是数据科学与工程场景,这一应用场景时常是云山雾罩的,相对于软件工程的最新发展,尤其是在可移植性、可再生性和弹性等关键的非功能性需求上,依然要落后十到二十年。但是对于模型的可重生性和可移植性而言,配置和元数据仍然正在被标准化,在软件工程中出现的一些最佳实践,依然尚未融入到机器学习的普适工业标准中。
TensorFlow Serving 的目标就是要解决其中的一些挑战,并将标准化作为其核心编程模型和平台发展的一部分。
Fidel 在报告中指出,TensorFlow 社区中的一个核心挑战,是如何将模型从磁盘上取出并被服务调用,进而实现为可重生流水线的一部分。TensorFlow Serving 允许用户原生地推出同一模型的多个版本,并同时地运行它们,而且可在不额外使用独立 CI/CD 工具的情况下还原更改。
TensorFlow Serving 1.0 将会在小版本上与所有的 TensorFlow 的发布保存同步,同时也通过 apt-get 提供得到维护的 Debian 软件包。
TensorFlow Serving 具有三个主要组件。第一个组件是一系列的 C++ 软件库,支持使用标准的“保存并导出”格式保存和加载 TensorFlow 模型。第二个组件是一个通用的“配置驱动”核心平台,提供了与其它机器学习平台在某种层次上的互操作性,但是报告中并未对此做详细介绍。核心平台中打包了可执行的二进制和托管服务,其中二进制使用了据估计最优的默认设置,并经实践得以改进。第三个组件是通过 Cloud ML 所提供的一些商业选项。
核心平台关注的是低延迟的请求和响应时间,以及更优的计算时间分配。对于 GPU/TPU 和 CPU 密集型任务,TensorFlow Serving 使用独立的线程库对请求做小批量(mini-batching)处理,提供了更少的往返调用,以及更高效的资源分配。
软件库是经过优化的,主要针对使用“读取- 拷贝- 更新”(read-copy-update)模式的高性能处理、服务器启动时的模型快速加载以及引用计数(reference count)指针。软件库为指针提供了容错,以追踪指定时刻一个模型在图模型中的执行状态。
TensorFlow Serving 提供非阻塞的模型加载和推理服务,这是通过独立的线程池处理的。具有队列的小批量(Mini-batching)处理是 TensorFlow Serving 中的一个重要概念。其中,异步请求被一并小批量处理,并传递给一个 TensorFlow Session,由该 Session 去协调 Manager 处理请求。推理请求也被一并小批量处理,以降低延迟。请求处理使用 ServableHandle 实现,ServableHandle 是一个指向特定客户请求的指针。
SessionBundle 模型格式已被弃用,取而代之的是新的 SavedModel 格式。TensorFlow Serving 中引入了 MetaGraph 这一概念,其中包括处理器架构的信息,经训练的模型将运行在该处理器架构上。MetaGraph 包含了模型的词汇、嵌入(Embedding)、训练权重及其它一些模型参数。SavedModel 对象由 MetaGraphs 组成,设计为可移植的并且可调用的工件(Artifact)。SavedModel 抽象可用于训练、部署服务(Serving)和离线评估,并可在新的 CLI 上运行。SignatureDef 是 SavedModel 的一个组件,帮助实现图模型中各层的标注(Annotate) 和特征化。
TensorFlow Serving 提供了数据源(Source)库的 API,并为模型类型提供了 SourceAdapter。Source 模块为 SavedModels 发射出 Loader,并估计内存需求情况。Source API 发射元数据到 Manager 模块,由 Manager 模块为模型加载数据,并加载该模型本身。Fiedel 指出,通过封装通用代码模式为一个用于注入(Injection)的配置文件,新的 ServerCore 实现将模板(Biolerplate)的代码行数(LOC,Line Of Code)从约 300 行减少到 10 行。
新的 Inference API 为通用用例提供了多个可重用的组件。其中,Predict 组件用于预测配置和部署服务(Serving),Regress 组件用于回归模型,Classify 组件用于分类算法,Multi-inference 组件用于将 Regress 组件和 Classify 组件的 API 组合在一起使用。
现在 TensorFlow Serving 还支持 Multi-headed inferencing。Multi-headed inferencing 是新出现于机器学习领域中的一个研究热点,试图解决存在并发一致请求的问题。通过去除被识别为错误的或重复的请求,Mutil-headed Inferencing 可进一步提高小批量处理(Mini-batch)的效率。 一些产生错误的数据源所生成的输入量非常大,并且代价高昂。具有对这样数据源的弹性,有助于阻止资源消费和数据质量上的负面级联效应。
Google 推荐使用针对 GCP 客户做了优化的静态二进制,以更好地利用对 gRPC 函数默认设置的最优估计。为使用户可尽快上手 TensorFlow Serving ,1.0 版本还提供了 Docker 镜像以及 K8 教程。
查看英文原文: TensorFlow Serving 1.0 Release Detailed at Google I/O
评论