滴滴开源DLFlow:海量数据下的离线深度学习方案
桔妹导读:DLFlow是滴滴用户画像团队打造的一套端到端的深度学习方案,主要面向大数据离线任务环境。通过结合Spark和Tensorflow,实现了原始特征快速处理、海量数据训练、大规模分布式预测,极大的提高了模型算法的开发效率。
1.
DLFlow是什么
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。
核心模块层:
模型任务层:
▍WorkFlow
DLFlow框架通过配置驱动,使用时只需定义好配置参数即可运行,这些配置参数会贯穿DLFlow整个运行过程中。 特征处理包含了从SQL中融合原始特征、特征逻辑组划分、原始特征编码和自动归一化几个主要步骤,处理后的特征直接落盘HDFS。 模型构建主要由用户完成,利用Tensorflow提供的各种功能可以快速定义模型。 模型训练时直接通过HDFS读取数据,从而可以利用更大规模的数据集进行训练。 模型预测利用了Spark分布式大规模数据处理能力,通过并行计算以快速处理大规模预测任务。
5.
如何使用 DLFlow
▍安装
通过pip安装DLFlow
pip install dlflow
▍构建模型
from dlflow.mgr import model
from 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):
...
▍配置
// 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为输入。
▍运行
dlflow --config <my_config_file>.conf
6.
总结
DLFlow实现了一套面向大数据离线任务的深度学习方案,开发者只需关注模型本身,其余部分均可交由框架处理,利用DLFlow可以极大提高模型算法的开发效率。立即尝试使用吧!
▍GitHub项目地址
https://github.com/didi/dlflow
项目团队