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共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出