查看原文
其他

滴滴开源DLFlow:海量数据下的离线深度学习方案

窦奇伟 滴滴技术 2022-09-09

桔妹导读:DLFlow是滴滴用户画像团队打造的一套端到端的深度学习方案,主要面向大数据离线任务环境。通过结合Spark和Tensorflow,实现了原始特征快速处理、海量数据训练、大规模分布式预测,极大的提高了模型算法的开发效率。



1

DLFlow是什么

DLFlow 是滴滴用户画像团队打造的一套面向大数据环境下离线任务的深度学习方案。通过结合 Spark 和 Tensorflow ,实现了一套端到端的处理流程,涉及了海量原始特征的快速处理、模型的构建和训练、大规模分布式预测等多个方面,极大的提高了模型算法的开发效率。



2

为什么要开发DLFlow

DLFlow起初是为了解决深度学习应用在离线生产任务中部署问题,随着我们探索的深入,我们发现在离线生产环境下部署深度学习这一应用场景确实是一个较为普遍的需求。


一方面,当前各种流行的深度学习框架在解决部署问题时,更多的是关注线上环境服务的部署,而离线环境似乎很少被人们关注。虽然离线环境更灵活,但是在大规模数据场景下,计算资源也会面临不小的挑战。深度学习更多的是依靠高性能GPU来提供算力,而传统的离线计算更多的是依托于Spark集群,因此我们尝试探索以合理的方式结合GPU和Spark集群来解决大规模数据下的深度学习离线计算问题。
另一方面,对于从事算法模型工作的同学,除了开发算法模型本身外,还需要花大量的时间和精力来处理模型之外的工作,如原始特征预处理、构建训练和预测相关的pipeline、模型版本管理等等。此外,如果对不同的项目、模型开发并维护各自的pipeline,也会增加开发和维护的成本。
针对上述问题,DLFlow提供了一套端到端的解决方案,涵盖了从原始特征预处理到部署离线生产任务多个连续的环节,每个环节均融入了滴滴用户画像团队在深度学习中的实战经验。DLFlow对于提升离线任务模型开发效率有着极大的帮助。



3

DLFlow有什么特性

▍流程抽象,易于开发

在DLFlow中,深度学习pipeline由任务(Task)和模型(Model)组成。任务对应pipeline中某个具体的处理流程,如特征处理、模型训练等等,模型则为具体的深度学习模型。任务和模型以插件形式存在,便于使用和开发,用户可以轻易地将自定义任务和模型注册到框架内使用。



配置驱动,简单高效

DLFlow提供了端到端的方案,仅需通过简单的配置即可驱动框架运行。通过修改配置项,可以快速更换特征、模型超参数、任务流程等等。同时,框架通过Tag管理模型和特征版本,降低了模型和特征的复用难度。



特征自动化

DLFlow内置了特征处理模块,可以实现对原始特征的自动化解析,支持多种数据类型转换、自动编码和归一化处理。



Pipeline自动化

通过内置的工作流引擎,自动解决任务、配置参数之间的依赖关系,轻松构建深度学习pipeline。

最佳实践

针对部分离线生产中可能遇到的问题提供了解决方案,如数据降级、压缩存储等等。

模型库DLFlow内置模型库,计划提供多种常用模型,包括但不限于Wide&Deep、DeepFM、DCN、FNN、PNN、NFM、AFM等等,该部分目前正在陆续开发和测试中。




4

DLFlow是怎么做的

架构



DLFlow主要分为四层,自上而下前三层为DLFlow提供的核心能力,第四层为底层支持。DLFlow底层基于Tensorflow、Spark和Hadoop构建,Tensorflow提供了模型能力,Spark提供了大规模分布式处理能力,数据存储主要依赖HDFS。


DLFlow的核心能力层如下:

任务调度层:
Workflow Core作为框架调度核心,负责组织和构建运行时pipeline,利用DAG解决Task和配置的依赖关系,从而保证各Task的执行有序进行,各配置项之间的依赖被正确解析。


核心模块层:

Module Layer中包含了DLFlow的核心模块,负责处理框架运行中各种具体的事务。包括框架的基本管理模块,特征处理模块,任务、模型相关的基本框架等等。


模型任务层:

User Layer直接面向用户,用户在该层中定义具体的任务实体和模型实体,构建方式较为灵活。此外,框架内置了部分任务和模型,用户可以直接使用。框架内置的模型和任务后续会继续增加。


WorkFlow



  • DLFlow框架通过配置驱动,使用时只需定义好配置参数即可运行,这些配置参数会贯穿DLFlow整个运行过程中。

  • 特征处理包含了从SQL中融合原始特征、特征逻辑组划分、原始特征编码和自动归一化几个主要步骤,处理后的特征直接落盘HDFS。

  • 模型构建主要由用户完成,利用Tensorflow提供的各种功能可以快速定义模型。

  • 模型训练时直接通过HDFS读取数据,从而可以利用更大规模的数据集进行训练。

  • 模型预测利用了Spark分布式大规模数据处理能力,通过并行计算以快速处理大规模预测任务。

此外,我们针对框架进行了一些优化,以提高整体的执行效率。



5

如何使用 DLFlow

安装


通过pip安装DLFlow


pip install dlflow


构建模型


导入DLFlow模型框架,开发属于自己的模型。

from dlflow.mgr import modelfrom dlflow.models import ModelBase@model.reg("my_model")class MyModel(ModelBase): ... def build(self): ... def train(self, feature, label): ... def evaluate(self, feature, label): ... def predict(self, feature): ...


在DLFlow中,模型被抽象为一类实体,用户自定义模型类时需要继承ModelBase,模型结构的构建在build()中完成,并实现相应的train()、evaluate()和predict()方法。此外,为了让框架能够识别模型,需要用model.reg()将模型注册到DLFlow中。用户在配置项中通过注册名即可获取相应的模型。

DLFlow将模型输入也作为一类实体,一般情况下,使用内置的模型输入NNDenseInput可以处理绝大多数Dense类型的输入。此外,用户还可自定义模型输入以适应特殊需求,其定义方法与模型定义类似,具体可参考下方文档链接。

更多有关模型开发的内容请参考:模型开发 
https://github.com/didi/dlflow/blob/master/docs/tutorials/zh/MODEL_DEV.md


配置


DLFlow配置文件使用hocon文件格式,如下是一个典型的配置文件,其中可选配置可以根据不同需求进行设置

// Pipeline中需要运行的子任务,支持用户自定义任务(User Define Task, UDT)STEPS : "merge, encode, predict, evaluate, train, UDT",MODEL_TAG : "model tag", // 模型版本标识MODEL_DATE : "20200101", // 模型训练日期FEATURE_TAG : "feature tag", // 特征版本标识FEATURE_DATE : "20200101", // 特征日期PRIMARY_KEYS : "id_1, id_2", // 数据的主键,可多个,逗号分隔LABELED_KEYS : "label_1, label_2", // 训练数据标签,可多个,逗号分隔MODELS_DIR : "<path>/static_models", // 用户自定义模型目录TASKS_DIR : "<path>/static_tasks", // 用户自定义任务目录LOCAL_WORKSPACE : "<path>/local_workspace", // 本地工作目录HDFS_WORKSPACE : "<hdfs_path>/hdfs_workspace", // HDFS工作目录// Spark运行时参数配置SPARK : { include file("<conf_path>/spark_conf/spark.conf") },// 可选,模型相关的配置参数配置MODEL : { include file("<conf_path>/model_conf/model.conf") },// 可选,特征预处理相关的参数配置BUCKET : { include file("<conf_path>/bucket_conf/bucket.conf") },// 可选,SQL原始特征融合配置MERGE : { config_file : "<conf_path>/merge_conf/merge.conf", seed_sql : "<conf_path>/merge_conf/seed.sql", fit : true,}

需要注意的是:

  • SPARK 配置项中使用原生spark配置,支持绝大多数spark配置项。

  • MODEL 配置生效时,需要设置两个必须的参数model_name和input_name。其中model_name为的模型注册名,input_name为输入。


更多有关配置的内容请参考:配置说明
https://github.com/didi/dlflow/blob/master/docs/tutorials/zh/CONFIGURATION.md


运行


在完成配置后,只需要用命令启动任务便可运行

dlflow --config <my_config_file>.conf

更多有关使用的信息请参考:DLFlow使用说明
https://github.com/didi/dlflow#手册目录



6

总结

DLFlow实现了一套面向大数据离线任务的深度学习方案,开发者只需关注模型本身,其余部分均可交由框架处理,利用DLFlow可以极大提高模型算法的开发效率。立即尝试使用吧!



GitHub项目地址

https://github.com/didi/dlflow




项目团队

来自滴滴用户画像团队,还在成长中的算法一枚,热爱生活,热爱工作,也希望自己能为画像团队贡献一份力量。


滴滴用户画像负责人,诸多用户增长方向负责人,致力于提升深度学习模型在工业届的价值,让AI算法落地更轻松高效!

主要负责乘客生命周期增长运营工作,通过画像标签体系助力业务方快速拿结果,平时喜欢逛steam,欢迎交流!

延伸阅读


内容编辑 | Teeo
原文来自 | 普惠出行产品技术
联系我们 | DiDiTech@didiglobal.com

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

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