查看原文
其他

58人工智能平台WPAI设计与实现

陈兴振/封宇 58技术 2022-03-15

简介


AI正在驱动行业变革,为加速58生活服务行业AI应用的落地,构建一套通用的AI算法平台以提高算法研发效率很有必要。我们设计实现了五八同城人工智能平台(WPAI,Wuba Platform of AI),旨在为全集团各业务部门赋能AI算法研发能力。WPAI支持深度学习和传统机器学习功能,将特征工程、模型训练和在线预测一整套算法研发流程抽象到Web系统,已发展成一站式算法研发平台,支撑了58集团内推荐、搜索、广告、图文识别、智能客服、智能外呼等各类应用。


整体架构



上图是WPAI的整体架构,对外提供特征工程、模型训练和在线预测等功能,包括机器学习和深度学习两部分。机器学习部分基于Spark MLib、DMLC等技术实现,对各种数据源、组件、算法、模型和评估模块进行组合,使得算法工程师在其上能够方便地进行特征提取、模型训练和在线预测。深度学习部分实现对GPU/CPU资源的统一管理和调度,基于TensorFlow、Caffe等框架进行DNN、CNN、RNN等深度学习模型的训练和预测。平台向各种算法应用输出算法能力,如推荐、搜索等传统算法,图文、语音识别的感知类AI算法,以及智能客服的认知类AI算法。下面将分别从机器学习和深度学习两方面来详细介绍平台的实现。


机器学习平台


平台架构及流程设计


机器学习平台提供征工程、离线训练、在线预测三个主要功能,整体架构如下图所示:



平台包括计算层、任务调度、数据存储层、管理后台、Web层和在线预测服务:

  • 计算层包括Hadoop、Spark、Yarn等,是离线任务的计算资源。

  • 任务调度层包括Kubernetes和Docker,Kubernetes负责Docker容器的调度。特征工程和XGBoost/FM/LR模型的调度执行封装在Docker镜像中。Kubernetes会启动多个Pod进行任务的分布式调度。

  • 数据存储层主要包括HDFS和MySQL,HDFS存储样本数据、特征数据以及训练好的模型。MySQL存储任务信息及操作日志等。

  • 管理后台实现特征工程管理、模型管理、作业管理和日志管理等功能。

  • Web层对外提供可视化操作页面,用户在页面上可以完成任务新建、结果查看、日志查看等操作。

  • 我们对外以SCF服务的方式提供在线预测服务,训练好的模型在平台上申请上线后即可进行在线预测打分。


机器学习平台从特征工程、模型训练到在线预测整体的流程设计如下图所示:



整个流程分为线下和线上两部分,线下利用准备好的样本数据先后执行数据预处理、特征提取得到特征数据,再将得到的特征数据进行离线训练得到模型文件并对模型文件进行评价,判断是否达到上线标准。线下流程生成的特征映射文件、模型文件提供到线上预测使用。线上服务会加载离线生成的特征映射文件和模型文件,对线上请求进行特征提取和模型预测。


整体流程在设计上将特征库和模型库独立出来,供离线和线上共同使用,这样设计具有特征提取和模型预测 线上和线下一致、特征自动编号等优点。特征库实现如下图所示,新增加模型只需要根据实际情况,重写Init和Predict方法。




特征工程


特征工程是指从原始样本数据转换为特征向量的过程,样本数据经过特征工程后得到libsvm格式的特征数据供机器学习模型训练使用。特征工程是机器学习中最重要的起始步骤,会直接影响机器学习模型的效果。


不同业务部门的原始样本数据千差万别,使得原始样本数据到特征向量的转换过程非常个性化,比如租房关注的是厅、室、面积、租金等,而二手车关注的是车的品牌、车龄、里程等特征。在WPAI之前,我们做推荐业务时特征工程的实现是不同业务线不同模型单独实现,如下图所示,每个业务线定义各自用到的字段和特征提取方法。这种实现方式的缺点是不具备通用性,每次都得单独进行开发,效率低下。



WPAI实现了通用特征工程处理框架。我们对特征提取方法进行了抽象,提供7种通用特征抽取函数供用户选择,如下所示,后面会根据需求进行扩充。

1)oneHotWithHashBucket

哈希分桶,设置Bucket大小,系统根据Bucket大小对字段进行哈希离散。

2)oneHotWithInt

直接用Int型字段值作为维度。

3)oneHotWithEnum

枚举类型字段,如星期、性别。

4)discreteWithZone

区间离散化,用户设置需要离散的区间数,系统提供“等频“和”等距“两种方式,等频方式划分每个区间里样本出现频次相同,等距方式划分每个区间的步长一致。

5)generateCrossFeature

对两个离散后的字段进行交叉,如 性别为男,年龄为青年, 对性别、年龄求交叉特征后得到男性青年。

6)noDiscrete

不进行离散化,如果字段是数字则直接将字段值作为特征值,如果字段是字符,将字符转换后数字后作为特征值。

7)sentenceEmbeddingWithBow

句子按分词进行特征提取,如“回龙观三室出租“分词为”回龙观“、”三室“、”出租“,然后分别对每个单词进行特征提取,支持平台分词和手动分词两种方式。


基于以上思想,整个特征框架设计如下图所示。



用户在创建特征工程任务时配置样本数据格式和特征提取方法,平台通过Java反射利用特征提取函数库进行特征抽取,得到id:local:value格式特征数据,其中id为特征配置中对应的特征编号,local为这个特征的维度,value为特征值。生成的id:local:value格式特征数据经过特征转换得到最终的libsvm格式数据。


模型训练


机器学习模型离线训练过程实现根据特征数据生成模型文件。离线训练特点是数据量大,单机训练时存在训练时间过长、内存不够用、模型收敛速度慢等问题。WPAI基于Spark MLib、DMLC实现了XGBoost、FM、LR等模型的大规模分布式训练。整个离线训练流程如下图所示,从样本数据生成libsvm格式特征数据后就可以选择一个模型,配置好模型参数后开始训练,训练完成后利用测试数据进行评价,得到auc、rmse等评价指标评判模型好坏,通过特征选择、模型参数调整等方法进行模型训练的迭代,通过评价指标来比较模型的效果。




模型离线训练架构设计如下图所示,向用户提供Web可视化操作页面,用户通过Web页面可以完成模型的新建、调参、训练、发布上线等操作。模型训练程序执行环境封装成Docker镜像,通过Kubernetes进行调度,Kubernetes会启动多个pod,实现训练任务的分布式调度,达到负载均衡目的,pod中部署有日志收集模块实时收集任务运行日志供web查看。底层的Spark、Yarn为平台提供计算资源。




在线预测


离线训练模型最终目的是应用到生产环境,所以设计一个通用的在线预测服务十分关键。机器学习在线预测服务整体设计如下图所示,包括数据层、数据更新层和逻辑层。



  • 数据层

数据层包括HDFS和MySQL。在线预测用到的模型文件和特征索引文件存储在HDFS上中,通过文件读写服务提供接口供在线预测调用。MySQL用于存储特征工程和模型的配置信息。

  • 数据更新层

数据更新层实现模型、特征的初始化和更新,与模型训练、特征工程模块互连互通,以主动拉取的方式自动更新。服务启动时会将已经上线的模型和特征配置批量初始化,离线训练模型有更新时会同步更新到线上,线上模型更新不影响在线预测请求。

  • 逻辑层

逻辑层实现对输入数据的预测打分。预测包括特征数据预测和样本数据预测两个接口。特征数据预测接口适用于自己实现特征工程在平台做模型训练的任务,直接调用平台的模型打分。样本数据预测接口适用于特征工程和模型训练都在平台完成的任务,预测时先将输入的样本数据抽取为特征再批量进行打分。

逻辑层主要模块包括特征抽取和批量打分。特征抽取由FeatureCenter完成,其中FeatureGenerator实现不同类型的特征抽取,FeatureManager加载各个特征工程的配置调用FeatureGenerator中方法完成特征抽取。ModelCenter实现XGBoost、FM、LR等模型的打分逻辑。


深度学习平台


平台架构


深度学习平台实现对GPU、CPU资源的统一管理,支持TensorFlow单机、分布式离线训练,TensorFlow、Caffe及自定义框架的在线预测,其整体架构如下图所示。



平台包括硬件层、集群管理层、算法层、Web层和在线预测:

  • 硬件层提供CPU和GPU资源,由Kubernetes进行统一管理和调度,为离线训练和线上预测提供计算资源。

  • 集群管理层包括Kubernetes、Docker、Calico、ETCD等组件,Kubernetes负责离线训练、在线预测等任务pod的统一调度,Docker提供虚拟容器支持,Calico为Kubernetes和Docker容器提供多主机间通信,ETCD负责集群信息的存储。集群管理层实现了对GPU、CPU资源的统一管理。

  • 算法层支持TensorFlow、Caffe深度学习框架,在框架之上封装了DNN、CNN、RNN、LSTM等深度学习模型。

  • 在线预测服务基于TensorFlow-Serving、GRPC和五八自研的RPC框架SCF实现,通用性高,支持TensorFlow、Caffe及用户自定义模型的GPU/CPU预测。

  • Web管理层提供可视化操作,用户在Web页面可以完成资源申请、离线训练、在线预测上线、模型部署及日志查看等操作。


离线训练


深度学习离线训练使用TensorFlow框架通过样本数据生成DNN、CNN、RNN等深度学习模型,包括单机和分布式版本,整体架构设计如下图所示。



Web管理层向用户提供可视化操作界面,通过Web界面用户可以进行训练任务创建、训练日志实时查看、模型管理、资源配置等操作。Web层还提供了TensorFlow可视化工具TensorBoard功能,可以对训练过程进行查看。


训练逻辑层基于TensorFlow框架实现,平台提供TensorFlow 1.6 1.8 1.10等版本的 CPU/GPU镜像供用户选择使用。平台内部基于apt-mirror搭建了Ubantu私有源,基于python devpi搭建了私有pypi源,用户可以在镜像中自行安装需要的依赖包环境。训练任务通过Kubernetes进行调度分配到底层的GPU或CPU硬件计算资源上执行,实现对GPU多卡资源、CPU资源的统一管理。


WPAI与公司Hadoop集群打通,训练输入数据和结果输出统一存储于公司HDFS上。


在线预测


深度学习模型应用到实际生产线上环境需要实现在线预测功能,由于不同业务方模型种类和数据类型不同,所以需要一套通用的在线预测框架。


WPAI基于Kubernetes、Docker、TensorFlow-Serving、gRPC、SCF等实现了深度学习通用在线预测框架。框架需要解决通用性问题:1)不同模型预测请求数据和返回数据格式不同。 2)模型种类凡多,除不同的TensorFlow模型外,还有一些用户个性化模型。


针对请求/返回数据格式不同问题,WPAI向用户提供SCF服务,SCF服务请求和返回协议设计为通用的Object类型,每个模型由用户提供一个请求/返回数据解析的jar包,在模型上线时上传到平台。平台SCF服务对解析jar包进行热加载,SCF收到请求后根据jar包将请求解析为TensorFlow-Serving需要的格式,预测完成后又将返回的预测结果调用jar包解析为用户需要的格式进行返回,整个解析流程如下图所示。




针对用户个性化模型问题,WPAI实现了用户自定义模型的在线预测功能。用户自定义模型通过gRPC框架启动,封装在Docker镜像中,SCF服务中通过gRPC客户端进行调用,如下图所示。




深度学习在线预测框架整体设计如下图所示。




  • SCF服务作为接入层负责接收业务方调用请求,并将请求转发到后端pod上,实现对解析jar包的热加载,对请求和返回数据进行解析。

  • Serving包括TensorFlow-Serving、自定义gRPC服务等,运行在pod中执行预测计算。一个预测任务对应一组pod,pod统一由Kubernetes调度。Kubernetes记录了任务运行对应的pod ip,并实时进行更新。SCF服务通过调用Kubernetes watch接口,能实时拿到任务对应的pod ip信息,以加权轮询方式将请求转发到对应的pod上,实现负载均衡。

  • Web系统提供可视化操作界面,方便用户完成预测jar包上传、预测服务上线、模型部署及日志查看等操作。


总结


本文重点介绍了58人工智能平台WPAI的整体架构,并分别介绍了机器学习和深度学习两部分的架构和流程设计。WPAI支持模型大规模建模、GPU/CPU任务调度,加速业务AI应用过程,提高工作效率。


WPAI平台上线后为公司各大业务线算法模型迭代提供支持,目前平台离线训练模型数300+,线上预测模型数80+,线上预测服务日均调用量25亿+,在推荐、搜索、图像处理、文本分析、智能客服、智能外呼等产品上得到了广泛应用。后续我们将持续在功能、性能、易用以及开放性等方面不断优化,支持更多的算法组件,在人工智能方面为公司各个业务提效赋能。



参考资料《58同城人工智能平台架构实践》



最后,58集团AI Lab人工智能实验室诚招算法和后台工程师,简历投递邮箱:zhankunlin@58ganji.com,详情请戳《五八同城AI Lab人工智能实验室招聘启事》

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存