简介
在生产环境部署模型预测的时候,在负载较高的情况下也对实时性、准确性、鲁棒性有很高的要求。现有很多的机器学习框架和系统都是针对模型训练而不是预测。本文中Clipper是一个通用的低延迟预测服务系统,通过模块化的架构来简化模型预测的部署。
Clipper 系统是一个分层的架构,
通过分层简化了预测服务栈,
并实现了预测服务的三个目标:低延迟、高吞吐、提高准确度。整体被分为了两层,
第一个是模型抽象层(model abstraction layer), 第二个是模型选择层(model
selection
layer)。抽象层提供了统一的API来屏蔽ML框架和模型的差异,实现模型对应用的透明;模型选择层在模型抽象层之上,动态选择模型进行预测并融合不同模型预测结果,从而提供更加准确和鲁棒的模型预测服务。
为了实现低延迟和高吞吐,Clipper中采用了非常多优化手段。在抽象层中,Clipper针对不同模型的预测进行了缓存,并针对请求延迟的情况进行自适应调整batch大小,最大化提升请求吞吐量。在模型选择层,为了提高预测的精度,Clipper采用了bandit方法,对不同模型预测的结果进行了集成,评估模型预测的不确定性;在降低延迟方面,也采用了优化落后者(straggle
mitigation)方法,预测过程中不等待最慢的模型的返回值。作者对Clipper用Rust进行了实现,添加了多机器学习框架的支持,
包括Spark MLlib, Scikit-Learn, Caffe, TensorFlow, HTK等。
系统架构详细说明
Clipper架构被分为了模型选择层和模型抽象层,抽象层负责提供统一的预测接口,保证资源的隔离,针对批处理的(batch
oriented)机器学习框架优化预测请求的负载。选择层负责将预测请求分发给不同的模型,基于反馈来组合预测结果,以此提高预测的准确度、评估不确定性、提供鲁棒的预测服务。
系统中预测请求先从请求方通过Clipper提供的REST或者RPC
API发送过来,Clipper收到请求以后选择层根据请求的类型和最近的反馈,将请求通过模型抽象层分发给具体的一个或者多个模型进行预测操作。模型抽象层在将请求分配给自适应批计算队列(adaptive
batching
queue)以前,会先检查请求在预测缓存区中是否存在。Adaptive-batching-queue保存了针对不同机器学习框架和模型进行调整过的预测请求,然后请求会通过RPC发送给保存具体的模型的容器进行处理。这里为了方便处理,我们把模型容器部署到不同的Docker容器中。预测完成以后,结果会按照请求的反向顺序先发送给抽象层,然后是模型选择层。模型选择层会根据收到的多个不同模型预测的结果生成最终的预测结果以及估计置信度,最后把结果返回给请求的终端。终端请求方也会统计预测的效果,并将收集到这些信息通过RPC/REST请求发送给模型选择层。模型选择层会根据收到的反馈信息来对预测进行调整。接下来来介绍模型抽象层和模型选择层。