Fork me on GitHub

58 同城 AI 算法平台的演进与实践

陈兴振:TEG技术工程平台群AI Lab架构师,AI平台部负责人;目前主要负责AI算法平台及周围子系统的建设工作

背景

AI浪潮正引领行业变革,为加速AI应用的落地,58同城TEG共享服务线AI Lab研发设计了58AI算法平台(以下简称WPAI)以提升集团各产品业务部门的AI研发效率。我们自2017年下旬开始构建WPAI,初期支持XGBoost、FM、LR等大规模分布式机器学习模型的训练及推理,在58推荐系统、商业广告点击预估等场景得到了广泛运用,有效提升了业务部门的业务指标和模型迭代效率。

WPAI深度学习平台上线之前,业务部门各自管理自己的GPU机器,GPU资源得不到充分利用和共享。从2018年开始,我们基于Kubernetes和Docker构建了深度学习平台,实现TensorFlow的训练和推理,对公司GPU资源进行了统一管理和调度。用户使用深度学习平台可以进行TensorFlow的单机单卡和多机多卡训练,对模型进行版本管理,并可以将训练好的模型版本进行部署,实现模型线上推理的一键部署和更新。

随着深度学习模型在业务线的广泛使用,模型线上部署占用GPU资源急剧增加,为了提升GPU卡吞吐量,从2019年初开始我们对TensorFlow模型在GPU和CPU上的推理性能进行了优化。首先使用TensorFlow的TensorRT集成版本TF-TRT对GPU上的TensorFlow模型推理进行了加速,在图像分类和图像OCR上取得了显著效果,然后使用Intel的MKL-DNN算法库对CPU上的TensorFlow模型推理进行了加速,降低了模型在CPU上的推理耗时,使得部分原来必须运行在GPU上的模型可以迁移到CPU上,进一步降低了GPU资源的使用。

在提升TensorFlow模型GPU/CPU上推理性能后,2019年下半年我们进一步丰富了WPAI功能,支持了PyTorch深度学习框架,并基于Faiss实现了向量检索平台提供全量索引构建、实时增量索引、高性能在线检索、分布式索引等功能。

在2020年,深度学习平台进一步支持了Caffe、PaddlePaddle深度学习框架,在推理性能上集成了Nvidia高性能推理引擎Triton Inference Server和Intel高性能推理引擎OpenVINO。研发了自然语言处理算法平台——WubaNLP,支持文本分类、文本匹配、序列标注等常见的NLP任务一站式算法研发,包括模型训练、效果评价和在线推理,用户仅需上传标注好的文本数据,即可通过平台快速创建算法模型并应用,大大提高了NLP算法研发效率。在图像领域同集团信息安全部、房产、二手车等部门一起共建了凤凰图像算法平台,支持图像样本的管理,提供了丰富的图像算法组件。在平台资源管理方面,通过小流量模型混合部署、引入GPU虚拟化技术等手段有效提升了GPU利用率。

总体架构

WPAI总体架构如下图所示:它主要包括深度学习、传统机器学习和向量检索三大功能, 支撑了58同城搜索、推荐、NLP、语音、图像、风控等各类AI应用。深度学习部分基于Kubernetes和Docker构建实现对GPU/CPU资源的统一管理和调度,支持TensorFlow、Pytorch、Caffe、PaddlePaddle等深度学习框架,实现开发实验环境、模型离线训练、推理服务等功能。封装了自然语言处理算法平台—WubaNLP供业务方使用,并与信安、TEG、HBG、ABG等部门一起共建了凤凰图像算法平台,提供丰富的图像算法开发组件。传统机器学习部分提供通用的特征工程处理框架,支持LR/FM/XGBoost/LR+XGBoost/FM+XGBoost等流行模型的分布式训练,并提供通用在线预测SCF(58自研的RPC服务框架,下同)服务。向量检索部分基于Faiss算法库实现常见索引类型的全量索引构建、增量索引、分布式索引、在线检索,帮助业务方更快更好的使用海量高维向量相似性检索功能。底层采用Kubernetes实现资源管理和自动调度,所有训练任务和推理服务都运行在容器中,通过容器的方式自动调度和维护。在存储层,训练样本数据主要存放在58自研的高性能网络文件系统(WFS)或HDFS上。

大规模分布式机器学习

**大规模分布式机器学习平台整体流程设计如下图所示。整个流程包括线下和线上两部分,线下实现原始样本数据经过特征工程、模型训练、模型评价得到符合上线要求的模型,线上加载特征工程配置和模型提供实时在线预测SCF服务。

特征工程将常见的特征提取方法如OneHot、区间离散化、特征交叉等抽象为函数,用户在平台上配置好样本数据格式和特征参数后即可进行特征工程处理。

单机版模型训练时,当训练数据过大或特征维度过大时无法进行训练,平台模型训练支持了分布式的XGBoost/FM/LR以及融合模型,有效解决了单机无法训练或训练时间过长问题。

分布式XGBoost基于RABIT(Reliable Allreduce and Broadcast Interface)实现,按行分割数据,并行计算每个特征值的最大值最小值并同步到各节点,各节点进行直方图统计,父节点进行聚合,根节点找到最优分隔特征并分发到各个节点;分布式FM基于参数化服务器(ps)实现,worker节点将用本地数据计算好的梯度推给指定server节点并从server节点请求本地需要的模型参数。

平台以SCF服务方式提供在线预测服务,支持对原始样本数据和libsvm格式特征数据的在线批量打分,在线预测服务实现模型、特征工程的自动更新。

深度学习平台

WPAI深度学习平台基于Kubernetes和Docker构建,运行在P40、T4、2080ti等GPU机器和CPU机器上,使用58自研的高性能网络文件系统(WFS)来存储训练样本数据,支持TensorFlow、PyTorch、Caffe、PaddlePaddle等深度学习框架,对外提供开发实验、模型训练、推理服务、WubaNLP等功能。

开发实验环境提供TensorFlow、PyTorch等各种框架的开发调试容器,支持代码在线编辑、断点调试、保存及推送训练环境等功能,提升算法开发效率。

模型训练实现与Hadoop集群的数据联通,并支持58自研的高性能网络文件系统WFS,支持TensorFlow、PyTorch、Caffe、PaddlePaddle等深度学习框架的训练,实现单机单卡、多机多卡训练,同时提供tensorboard可视化工具,方便用户进行程序的理解和调试。

WPAI提供深度学习推理通用框架服务,不但支持TensorFlow、PyTorch、Caffe、PaddlePaddle等框架所训练模型的推理部署,还支持用户自定义的模型或程序的部署,实现负载均衡、弹性扩容、灰度发布、ABTest等功能。WPAI基于TensorRT、OpenVINO、MKL-DNN等对GPU/CPU上的模型推理进行了加速,减少推理耗时提升吞吐量。

WubaNLP是58同城AI Lab研发的自然语言处理(NLP)算法平台,它支持文本分类、文本匹配、序列标注等常见NLP任务的一站式算法研发,包括模型训练、效果评价和在线推理,用户仅需上传已标注好的文本数据,即可通过平台快速创建算法模型并应用,大大提高了NLP算法研发效率。

目前WubaNLP上线了文本分类、文本匹配、序列标注任务,集成了TextCNN、RNN、Transformer等常用的基础模型和BERT、RoBERTa、ALBERT三个中文预训练语言模型,并上线自研轻量级预训练语言模型SPTM(Simple Pre-trained Model,已在qa_match开源项目中开源)、发布基于通用中文语料和58生活服务领域中文语料的预训练模型。

推理性能优化

一个深度神经网络模型从构建到实际应用会经过训练(Training)和推理(Inference)两个阶段。其中训练需要大量的数据和算力支持,并且在训练过程中需要不断的对模型进行调优,以使模型具备良好的鲁棒性;推理则是向训练好的模型输入新的数据,从而对某一事物做出尽可能准确的预测。

推理阶段对算力和时延具有很高的要求,如果将训练好的神经网络直接部署到推理端,很有可能出现算力不足无法运行或者推理时间较长等问题,因此我们需要对训练好的神经网络进行一定的优化。神经网络模型的优化可以从模型压缩、不同网络层合并、稀疏化、采用低精度数据类型等不同方面进行优化,甚至还需要根据硬件特性进行针对性优化。

我们使用Nvidia高性能神经网络推理引擎TensorRT对GPU上的推理性能进行了优化。TensorRT应用通常有三种方式。

第一种应用方式是通过TensorFlow、MXNet等深度学习框架内部集成的TensorRT来实现GPU推理加速。例如TensorFlow从1.7版本开始集成TensorRT,TensorFlow-Serving从1.13版本开始集成TensorRT。TensorFlow集成TensorRT版本简称TF-TRT,它会解析TensorFlow模型,将其中能运行在TensorRT上操作迁移到TensorRT上运行,将不能运行在TensorRT上的留在TensorFlow上运行,这种方式不能保证所有操作都运行在TensorRT上,并且会存在数据的拷入和拷回,优点是易于使用,缺点是不能达到最佳效率。

第二种应用方式是从现有深度学习框架导出模型再导入到TensorRT,导出的模型是一个中间形式,如TensorFlow导出UFF,PyTorch导出ONNX。此种方式难度适中,缺点是兼容性不佳,如部分模型在导出为ONNX时可能会失败,在导入到TensorRT时一些复杂的操作TensorRT parser不能识别导致导入失败。

第三种应用方式是使用TensorRT C++或Python的API自行构造网络,将深度学习框架训练好的模型,利用TensorRT重新完整的搭建一遍,实现TensorRT的完整迁移,此种方式兼容性最强,效率最高,缺点是难度高,需要进行TensorRT代码开发工作。

前期,平台主要支持TensorFlow框架,业务方训练的大部分为TensorFlow模型,为了快速实现TensorFlow模型的GPU上推理加速,我们基于TensorFlow的TensorRT集成版本TF-TRT实现了GPU上的推理加速,用户只需要配置任务时打开加速选项卡就可以获得TensorRT加速效果,使用方便。当时TF-TRT在P40卡上进行了应用,在restnet50模型上FP32精度下性能提升1.8倍,使用INT8精度后性能提升3.2倍,在图像OCR模型应用后单卡QPS提升60%。

后期,平台上增加了PyTorch、Caffe等框架,单纯的TF-TRT已经不能满足需求,并且用户训练的TensorFlow模型当存在TensorRT不支持的op时也无法使用TF-TRT进行推理加速。

为了让更多的模型获得GPU上推理加速效果,WPAI基于TensorRT和TIS(即Triton Inference Server,下同)对GPU上推理加速进行了升级。TIS是Nvidia推出的高性能推理服务部署框架,支持多种框架模型,包括TensorRT Optimized Plans、TensorFlow GraphDef、TensorFlow SavedModel、ONNX、Caffe2 NetDef等模型格式。

WPAI上通过TensorFlow、PyTorch、Caffe框架训练的模型文件经过Uff Parser/ONNX Parser/Caffe Parser解析器转换为中间格式后再通过TensorRT优化为Optemized Plans文件后通过TIS进行加载提供线上服务。

对于超出TensorRT支持范围的模型,平台利用TensorRT Plugin插件将不支持的op通过自定义插件的形式告诉TensorRT需要怎么操作,然后插入到神经网络的合适位置获得TensorRT的支持。

CPU上模型推理性能优化,前期我们利用Intel的算法库MKL-DNN,通过编译MKL版本的TensorFlow-Serving来快速实现TensorFlow模型的CPU推理加速,在OCR识别、低质文本识别等模型上加速后耗时降低一半,使得原来需要部署在GPU上的模型迁移到CPU上也能满足性能要求。

后期我们进一步集成了Intel的推理引擎OpenVINO,能支持不同深度学习框架训练出的模型优化和线上部署,首先通过Model Optimizer对模型进行优化和转换得到IR data文件,然后再通过Model Server进行加载提供服务。

GPU资源调度优化

随着平台集群规模的扩大,在线推理的GPU资源调度暴露出一些问题,如小流量的模型由于性能要求需要使用到GPU而对GPU卡的使用率较低,部分模型GPU占用有限不能打满整张GPU卡而社区版Kubernetes只能按照整卡进行分配调度。如何优化GPU资源调度,使得GPU卡得到充分利用成为急需解决的问题。

针对需要使用GPU资源的小流量模型,我们采用模型混合部署来进行解决,通过使用TensorFlow Serving的多模型部署特性并利用Kubernetes进行混合部署时资源分配和调度来实现。

需要部署GPU上线的小流量模型首先在TEST环境进行单卡独立部署,按线上业务流量进行压测获取GPU使用情况,然后根据压测结果切换混合部署申请GPU资源并配置QPS上限,最后在线上环境进行混合部署。

平台通过Kubernetes实现混合部署资源的统一调度,每个混合部署节点都对应一个独立的部署编号,对于新接入混合部署的模型,需要先进行资源调度计算,从现有的混合部署编号中分配部署编号,当现有部署资源不满足分配时,创建新编号的部署节点进行分配。然后更新线上节点的Deployment配置,写入模型信息,完成模型的混合部署。

为了实现GPU卡的细粒度分配提升GPU卡利用率,我们引入了GPU虚拟化技术。GPU虚拟化指的是将一张GPU卡的计算能力进行切片,分成多个逻辑上虚拟的GPU,即vGPU,以vGPU为单位进行算法分配。

WPAI采用腾讯云开源的容器层GPU虚拟化方案GPU Manager实现GPU资源的细粒度调度,GPU Manager开源地址为https://github.com/tkestack/gpu-manager。平台将GPU Manager以插件的方式集成到Kubernetes中,集群每个GPU节点上以Daemonset方式启动一个gpu-manager容器,进行节点机器的GPU拓扑感知和GPU资源分配,而通过kube-scheduler管理整体的资源和资源分配请求。GPU Manager将一整张GPU卡按算力和显存划分为100份,通过yaml配置vcuda-core和vcuda-memory参数来指定资源份额。在进行GPU容器部署时,通过替换容器中原有的cuda库,对cuda调用进行劫持,按照vcuda-core的配置情况来做上限控制,从而实现显存和算力的资源隔离。

通过小流量模型的混合部署和GPU虚拟化技术的引入,推理GPU卡的占用减少了40%,在用卡的GPU使用率提升150%。

总结

58AI算法平台WPAI发展至今,除支持特征工程、大规模分布式机器学习模型训练及推理功能外,基于Kubernetes和Docker构建了深度学习平台,支持TensorFlow、PyTorch、Caffe、PaddlePaddle等深度学习框架,提供开发实验、模型单机/分布式训练、推理服务功能,研发了自然语言处理算法平台—WubaNLP,支持文本分类、文本匹配、序列标注等常见的NLP任务的一站式算法研发,并为上层凤凰图像算法平台(技术委员会AI分会协同共建项目)提供了支撑。

在深度学习平台上,使用Nvidia和Intel开源算法库和推理引擎优化了模型在GPU/CPU上推理性能,通过小流量模型混合部署和引入GPU虚拟化技术提升了平台GPU资源利用率。

当前WPAI平台上离线训练模型数4000+,线上运行模型数600+,线上日均推理流量41亿+。未来,我们将持续迭代升级WPAI功能,引入业界前沿技术,为58业务提效。

WPAI平台深度学习推理服务已经开源,欢迎关注交流,开源地址:https://github.com/wuba/dl_inference,开源项目dl_inference介绍:https://mp.weixin.qq.com/s/GsTGBnP2t-8G8RbvG8SeVQ

录像回看

视频链接:https://v.qq.com/x/page/e3201mjrj5v.html


本文地址:https://www.6aiq.com/article/1605975942974
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出