DJL Serving基于Deep Java Library构建。您可以访问DJL GitHub仓库了解更多信息。有关模块、依赖关系和类概述,请参考生成的图表。
DJL Serving大致分为四层:
前端 - 基于Netty的HTTP客户端,用于接收和管理传入请求;
工作流 - 一个系统,用于将多个模型和粘合代码组合成执行计划;
工作负载管理器(WLM) - 支持批处理和路由的工作线程管理系统;
模型库,通过配置文件指定启动时加载的模型。
前端
DJL Serving使用Netty前端处理传入请求。它使用单个Netty设置,包含多个HttpRequestHandler。不同的请求处理程序将提供对推理API、管理API以及各种插件提供的其他API的支持。
这些请求处理程序可以与DJL堆栈的其他层通信。主要是通过ModelManager管理各种端点。每个端点可以有多个版本,每个版本对应一个工作流。推理API将轮询调用端点中的各个工作流。管理API可用于CRUD各个端点和工作流。
工作流
工作流系统用于支持涉及多个模型层次和粘合代码的各种用例。它通过workflow.json
文件进行配置,描述工作流管道和所涉及的模型。关于工作流的更多细节请参考工作流指南。
在工作流中,主要目的是调用各种模型。这通过工作负载管理器完成。创建和删除工作流将相应模型添加到和从WLM中删除。在多个工作流中使用相同模型将对应WLM中的单个模型。
工作负载管理器
后端基于工作负载管理器模块。WLM负责每个模型的多个工作线程以及其批处理和请求路由功能。它也可以单独使用,通过WLM模块(ai.djl.serving:wlm
)获得。这可能对需要DJL Serving的工作线程缩放支持但不需要HTTP前端的情况有用。
对于每个模型,都对应一个工作池,支持其完整功能。每个工作池有一个作业队列管理传入请求。它还有一个工作池配置,描述运行的任务(模型)。
工作池内可以包含多个工作组。工作组对应模型在特定设备上的支持。因此,同一个模型可以在CPU和GPU或多个GPU上创建多个工作组。
最后,每个工作组可以包含单个工作线程。这允许在同一设备(通常为CPU)为同一模型提供多个线程。工作组中的工作线程数量可以自动缩放,具有最小和最大值。通过设置相同的最小和最大工作线程可以设置固定数量的工作线程。
在WLM中的每个工作线程内,都有一个DJL预测器。根据预测器的引擎,它可以运行Tensorflow、PyTorch、XGBoost或DJL支持的其他引擎中的模型。值得注意的是,还有一个Python引擎,可以运行Python脚本中定义的模型、预处理和后处理步骤。
使用Python引擎时,DJL Python预测器(PyPredictor)包含一个Python进程。这意味着每个工作线程(每个工作组中的每个工作池)都有自己的进程。可以通过PyPredictor使用和关闭该进程。