背景

数据工程、模型练习、在线服务是机器学习技术完成的三驾马车,这个流程中处理的数据量大,核算量大、练习结构和版别多样、底层依靠复杂,资源算力办理,需求人工介入处理很多问题,给AI落地带来了比较困难。针对这一系列的问题,货拉拉大数据智能渠道组从2020年开始就在探索供给一套完好的云原生的一站式AI处理方案,并从那时起就自建了Kubernetes 集群,后续供给了GPU按量练习才能、区别独立资源池纳管了其它部分机器,围绕着K8S渠道完善了监控告警、容器日志搜集才能,打通了大数据底层存储,引进OBS、S3目标存储,确保大数据AI化事务能安稳运转于K8S云原生底座上。

从体系层面来看,大数据智能渠道组在云原生资源办理渠道上构建了Flink on k8s的特征渠道、 notebook on K8S模型练习、数据查询及可视化渠道、根据 K8S的在线推理渠道。 自建云原生K8S体系还支撑着智能定价、ABTest等体系运转核算使命,使用云原生特性赋能事务体系一起充分使用了集群资源。 Docker镜像处理了大数据AI组成对体系环境的依靠,K8S一致对底层资源办理,便利的构建多租户实例的Notebook、自动扩缩容能够为模型在推理供给自动化弹性的才能,支撑离线批使命、支撑守时调度以及在线服务,多种多样的使命类型运用了K8S Deployment、Cronjob、job、DaemonSets使命类型。

全体结构

货拉拉一站式云原生AI平台建设实践

上图是货拉拉云原生AI体系的全体结构,从数据接入、特征工程、数据剖析、数据可视化、notebook在线开发、模型练习、以及模型在线布置,围绕着AI整条链路孵化了专心于于数据ETL处理的特征渠道、支撑多种核算引擎的notebook在线开发及练习渠道、支撑模型注册办理及发布于一体的模型在线推理渠道,其间的特征渠道底层的核算引擎是根据Flink on K8S去跑特征使命,大数据存储核算都能够添加到镜像中可防止宿主机中装置很多依靠包。

特征渠道

特征渠道首要是给数据科学家、数据工程师、机器学习工程师去运用,能够处理数据存储涣散、特征重复、提取复杂、链路过长、运用困难等问题。首要功用是把数据从HBase、Hive 、联系型数据库等各类大数据ODS(Operational Data store )层进行快速的数据 ETL ,将数据抽取到ES、Redis、HBase、Hive,元数据在特征渠道进行办理,并一致了数据出口,用来做算法模型的数据测试、练习、推理及其它数据运用。

链路的流批一体

货拉拉一站式云原生AI平台建设实践

K8S使命流程

货拉拉一站式云原生AI平台建设实践

目前特征渠道核心是选用Flink去完成数据的ETL,底层的是根据Kubernetes集群去调度Flink ETL作业。 Flink使命逻辑首要凭借pyflink去完成,Pyflink里边包含使命的核算逻辑,把使命从source经过数据处理sink到对应的存储,自定义完成了redis connector、优化ElasticSearch connector。 根据K8S供给的Cronjob目标创立了守时特征使命,能够守时的去做周期性的FLink使命,上层敞开API供给外部驱动的特征使命,集群布置EFK在渠道层进行日志的检查。

交互式建模

Notebook是大数据智能渠道组根据Apache zeppelin进行定制开发,为数据剖析师、AI算法开发者量身打造的交互式开发东西,支撑多种核算引擎如:Spark、Python、JDBC、Markdown、Shell terminal、Beeline、Hive sql、Tensorflow供用户挑选,用户能够运用Notebook完成数据准备、数据预处理、数据剖析可视化,算法调试与模型练习。 社区的Zeppelin首要是单机多进程方法运转,K8S布置不完善,不满意可扩展性、阻隔性。一起机器学习深度学习对底层环境的依靠,布置到Kubernetes上以镜像容器的方法发动,也便是瓜熟蒂落的事情,能够处理Zeppelin的扩展性、安全性、阻隔性问题。 布置到K8S 需求处理如下问题: 对接K8S办理Zeppelin服务的生命周期,包含Zeppelin服务的发动、Zeppelin中止、状况更新、资源收回。 每个用户创立独立Zeppelin Server处理多租房问题,并露出出一致的服务拜访入口。 处理了Zeppelin Server中止后,用户创立的Note数据能够耐久化不跟着服务的中止而删去。 为了满意用户对周期性外部驱动剖析练习的需求,需求规划一层核算驱动使命给notebook插上守时调度和外部驱动的翅膀。

如下所示,notebook完成的架构图

货拉拉一站式云原生AI平台建设实践

架构首要分为三部分:

  1. Zeppelin服务的发动,中止和状况获取,这块首要包含调用k8s Api去创立Namespace、ConfigMap、Service、RBAC、PV、PVC以及Zeppelin Server Deployment等Zeppelin发动相关的k8s目标,这儿我们做了相关个性化开发,首先是经过调用JAVA K8S API去创立Zeppelin K8S目标,其次便是经过挂载NFS或S3处理 notebook 无法耐久化存储问题、接着便是别的新增init container容器去完成多个用户demo note的复制操作,其间还会触及以configmap和环境变量 完成相关动态参数的传递。
  2. Zeppelin 服务的拜访,这块首要规划了为每个用户创立独立的namespace,并发动一个独立zeppelin server 去做多租户, 每个用户露出不同的拜访url,然后布置一个nginx 并创立露出NodePort 类型nginx Service去署理不同用户的拜访链接 ,经过nginx解析url location获取不同用户namespace及详细的location 拼装成终究不同用户反向署理的DNS地址。
  3. 核算结构支撑,为了更好的落实降本增效,充分使用大数据原有的yarn核算集群,经过布置livy服务,zeppelin notebook中对接livy服务,使得spark使命能够经过livy提交到大数据yarn核算机群中。别的一个便是经过继承jdbc 完成Hive SQL、OLAP引擎的支撑。

打通核算和存储

Zeppelin 支撑许多大数据核算引擎,需求处理依靠包装置、环境变量装备、解说器装备等作业,作为notebook渠道这些功用在Zeppelin Server发动后就能够直接运用,不需求用户在装备这类繁琐的作业,我们在规划开发的时候,打通底层spark 拜访存储HDFS、新建了Hive SQL解说器,镜像中内置大数据客户端、装备DNS域名解析、处理了权限认证、包依靠等问题,用户终究能够直接拜访出产Hive 、HDFS。

资源阻隔及收回

货拉拉一站式云原生AI平台建设实践

k8s集群CPU、GPU、内存是有约束的,纳管其它部分的机器资源想独自阻隔运用,假如没有调度和阻隔策略的话,当申请的资源过多,影响到其他使命的调度,一起也会跑到其它私有资源,更进一步的假如k8s分配出去的资源无法收回,总有一天会有资源竭尽导致其他使命无法调度的情况。 这儿我们对每个namespace 增加了Resource Quota约束了每个用户最大的资源量,资源阻隔一致对K8S集群的核算节点打上不同的标记,规定了一些节点是notebook 公用的节点,一些节点是其它人独有的资源,上层在创立使命的时候能够指定资源组,默认创立的Zeppelin notebook会调度到公用资源组节点上去,假如有些notebook比较重要就会指定到别的的资源组中,针对资源组增加了批阅。

资源收回首要是前端挑选闲暇中止时刻,后端服务进程获取装备参数,在Zeppelin server 与解说器交互恳求的地方发动线程,不断更新交互时刻,直到判别闲暇超越装备时刻,触发进程退出操作。

模型练习gpu办理

异构集群中怎么对机器进行办理是一个比较复杂的问题,存在不同的云厂商以及自有机器混用的情况下,处理的方案便是分为不同的的集群,经过多集群进行办理,还有便是不同地址方位乃至网络环境混用,经过一层调度层进行办理,这儿首要的架构如下:

货拉拉一站式云原生AI平台建设实践

K8S 集群首要构建在华为云,在GPU场景下会独自抽离一层GPU调度层,不同区域或许不同标准的GPU区别到不同的资源组,数据库中对这些GPU机器进行类型区别。 比如针对GPU按量付费场景,在发动GPU使命时候,会挑选不同的资源组,从资源组中选定特定的GPU节点,会为GPU和notebook树立绑定联系,经过调用运维供给的GPU实例开机接口发动GPU节点,在使命闲暇收回或许手动中止实例的时候调用运维停机接口,对GPU机器进行关机处理。

数据耐久化和多核算结构数据同享

没有数据耐久化,容器中用户创立zeppelin notebook重启后notebook文件数据就会消失 ,不同核算使命运转在不同的的K8S pod之间怎么同享文件?

货拉拉一站式云原生AI平台建设实践
这儿为每个发动的Zeppelin Server及其创立的核算pod挂载一致的分布式存储,经过subpath参数为每个用户创立不同的子目录处理用户数据阻隔的问题。不同用户挂载到容器中便是同一个网络存储不同的子目录。 这儿边的完成一个是使用K8S DaemonSet 这样每个k8S的核算节点中会运转一个pod用来,POD中选用s3fs对目标存储进行挂载,该Pod会把宿主机中的目录挂载到容器中,挂载程序把目标存储挂到当时目录,这样宿主机就有了对应目标存储的文件目录结构,这样zeppelin运转发动的核算pod都去挂载宿主机的这个目录,就能够到达多POD文件同享及数据耐久化的成效。

Notebook使命驱动

为了满意用户对周期性外部驱动剖析练习的需求,同步了notebook脚本到notebook办理渠道,能够对独自的notebook脚本 装备一个核算驱动使命,守时使命能够在k8s中绑定一个cronjob到了预守时刻去发动使命调用zeppelin server的接口调度运转对应的notebook脚本,外部驱动使命经过办理渠道露出使命创立API,能够供其它第三方渠道经过api调用去发动notebook服务,这样就给notebook插上了守时调度和外部驱动的翅膀。

模型在线推理

AI整个流程中,模型在线推理是AI运用的最后一环,模型比较小的情况下能够直接嵌入到后端事务代码中,作为一个常见的接口对外供给服务,可是跟着模型越来越大、模型更新越来越频繁,有必要对模型服务进行独立拆分,独立的对模型进行更新和发布,模型练习结构众多、模型格局多样以及在线服务对服务安稳性要求高、对服务推迟比较敏感,但总的来说大部分模型的模型办理、模型布置、服务的更新具有通用性,详细的不同在于能够学习底层镜像进行区别的处理。因此有一个通用的模型布置办理渠道能够防止事务在运用模型推理时所带来的重复性建设,大大加快模型服务的落地。 为公司AI运用能够很多落地,大数据智能渠道组开发了一致的模型在线服务渠道。一线互联网企业首要是根据云原生、服务网格去打造一致的模型在线推理渠道,因此智能渠道组也同样是根据云原生K8S去完成根底设施到服务监控告警链路的整个流程的建设。

全体结构

货拉拉一站式云原生AI平台建设实践

模型办理

模型办理首要是针对外部练习模型供给模型上传、模型注册、模型版别办理等对模型进行增修改的办理功用,针对线下大模型模型注册线下供给一个GO开发的二进制东西,让用户能够依照东西提示上传模型到东西中封装的OSS一致目录中,后续用户能够仿制东西生成的模型途径注册模型到模型办理渠道,渠道对模型格局进行校验,防止无效的模型注册。

模型服务

模型服务首要是把静态的模型布置成在线服务,用户在模型服务渠道中能够挑选模型仓库对应的模型版别、设定模型运转的实例个数,挑选是否开启HPA自动扩缩容。 模型布置详细完成诗经过构建K8S deployment目标模版,其间的Pod 包含三个容器解耦了三块功用,这三个容器分别是初始化容器去完成oss模型文件挂载、接入服务用来埋点指标搜集 java 网络署理、TfServing推理结构的封装,完成模型的复制、服务监控指标的搜集、推理加载在线服务。 经过渠道布置的每个模型服务,在K8S中会创立一个类型为LB的Service,服务布置渠道会获取LB的地址拼接成服务url露出给服务运用方。 关于布置的服务,经过个性化网络署理埋点服务状况、服务恳求qps、服务耗时的指标信息,共同汇聚到公司一致的监控体系,监控体系能够经过服务ID等信息查询各个模型服务的运转状况。

总结

以上简单的介绍了K8S在货拉拉大数据范畴的运用与实践,关于一个AI渠道来说云原生容器化应该是业界标配,尤其是在面临机器学习、深度学习、分布式练习、GPU算力办理分配这种复杂的场景。大数据智能渠道项目组前期经过自建华为云环境K8S集群,到针对线上服务的阿里云场景,选用阿里云ACK K8S集群,双集群跨云运用。

云原生AI机器学习体系的规划到完成触及大数据、云原生、AI三个穿插范畴的常识和技能体系,构建一个一站式的完善的机器学习渠道需求算法、工程、根底架构的合力,目前货拉拉大数据云原生机器学习渠道只是覆盖AI的机器学习的链路,一些根底才能还不支撑,比如说分布式机器学习、GPU分布式练习、GPU分布式推理,相比于投入资源构建体系,赋能事务才是最重要的,打造强壮的体系,终究赋能事务能够说任重而道远。

笔者介绍:张浩|资深大数据工程师,曾任职腾讯TEG数据渠道部,从事大数据AI渠道开发,现就职于货拉拉智能渠道组从事AI渠道开发