查看原文
其他

开源改变世界 | DLFlow深度学习方案的成长之路

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


1.

DLFlow是什么?


DLFlow是一套深度学习pipeline,它结合了Spark的大规模特征处理能力和Tensorflow模型构建能力。利用DLFlow可以快速处理原始特征、训练模型并进行大规模分布式预测,十分适合离线环境下的生产任务。


2.

DLFlow的背景


一方面,当前各种流行的深度学习框架在解决部署问题时,更多的是关注线上环境服务的部署,而离线环境下似乎很少被人们关注。虽然离线环境更灵活,但是在大规模数据的场景下,计算资源也会面临不小的挑战。

深度学习更多的是依靠高性能GPU来提供算力,而传统的离线计算更多的是依托于Spark 集群,因此我们尝试探索以合理的方式结合GPU和Spark集群来解决大规模数据下的深度学习离线计算问题。


另一方面,对于从事算法模型工作的同学,除了开发算法模型本身外,还需要花大量的时间和精力去处理模型之外的工作,如原始特征预处理、构建训练和预测相关的pipeline、模型版本管理等等。此外,如果对不同的项目、模型开发并维护各自的pipeline,也会增加开发和维护的成本。


针对上述问题,DLFlow提供了一套端到端的解决方案涵盖了从原始特征预处理到部署离线生产任务,每个环节均融入了滴滴用户画像团队在深度学习中的实战经验。DLFlow对于提升离线任务模型开发效率有着极大的帮助。


3.

DLFlow的特性


DLFlow框架主要面向深度学习大规模离线任务,其能够有效的结合单机GPU高性能计算和Spark大数据分布式处理能力,框架提供了较为灵活的使用方式,具体特性可以概括为如下几点:


  • 配置驱动:
    配置驱动框架运行,通过修改配置可以快速更换特征、模型超参数、任务流程等等。
  • 流程抽象:
    任务和模型以插件形式存在,便于使用和开发,用户可以轻易地将自定义任务和模型注册到框架内使用。
  • 简单高效:
    提供端到端的方案,框架通过Tag管理模型和特征版本,降低了模型和特征的复用难度。
  • 特征自动化:
    特征自解析,支持多种数据类型转换、自动编码和归一化处理。
  • Pipeline自动化:
    通过内置的工作流引擎,自动解决任务之间的依赖关系,轻松构建深度学习pipeline。
  • 最佳实践:
    针对离线生产中可能遇到的部分问题提供了解决方案,如数据降级、压缩存储等等。


DLFlow可以承担起大部分模型开发之外的工作,利用DLFlow可以快速训练模型并验证结果,极大提高工作效率。


4.

DLFlow的架构



DLFlow基于Tensorflow和Spark构建,Tensorflow提供了模型能力,Spark提供了大规模分布式处理能力。DLFlow框架主要分为三个层级:


  • 任务调度层:
    负责组织和构建运行pipeline,解决各步骤之间的依赖关系。
  • 核心模块层:
    DLFlow的核心模块,处理框架运行中各种具体的事务。
  • 模型任务层:
    定义具体的任务项和模型实体,支持用户自定义,构建方式较为灵活。


  • DLFlow框架通过配置驱动,使用时只需定义好配置参数即可。
  • 特征处理包含了从SQL中融合原始特征、特征逻辑组划分、原始特征编码和自动归一化几个主要步骤,处理后的特征直接落盘HDFS;
  • 模型构建主要由用户完成,利用Tensorflow提供的各种功能可以快速定义模型;
  • 模型训练时直接通过HDFS读取数据,从而可以利用更大规模的数据集进行训练;
  • 模型预测利用了Spark分布式大规模数据处理能力,通过并行计算以快速处理大规模预测任务。

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

项目地址:

https://github.com/didi/dlflow

5.
如何使用


01
安装


通过pip安装DLFlow
pip install dlflow

02
构建模型


导入DLFlow模型框架开发属于自己的模型
from dlflow.mgr import modelfrom dlflow.models import ModelBase
@model.reg("my_model")class MyModel(ModelBase): ...
更多有关模型开发的内容请参考模型开发

03
配置


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

// Pipeline中需要运行的子任务,支持用户自定义任务STEPS : "merge, encode, predict, evaluate, train, UDTs",
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,}
更多有关配置的内容请参考配置说明

04
运行


在完成配置后只需要用命令启动任务就可以运行pipeline了
dlflow --config <my_config_file>.conf

更多有关使用的信息请参考DLFlow使用说明



6.

关于开源


DLFlow起初是为了解决深度学习应用在离线生产任务中部署问题,随着我们探索的深入,我们发现在离线生产环境下部署深度学习这一应用场景确实是一个较为普遍的需求,由此,我们心中萌生了开源的想法,一方面,我们希望通过开源将自身在深度学习大规模离线计算上的实战经验分享出去,另一方面,我们也希望能够吸收一些外部的灵感和建议,能够让框架变得更加完备,更好的服务于我们自身。


7.

后续


DLFlow目前仍处于较为初级的阶段,其中有很多东西可以进一步优化改进,后续我们的精力将主要集中在如下几个部分:

  • 单机本地化支持;
  • 任务扩展与并行,分布式训练;
  • 更多的预定义算法模型;
  • 修复已知问题提升稳定性。


--------- PUHUI TECH --------
项目团队成员
-
窦奇伟
算法工程师

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


-


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

-


路劲
专家算法工程师
入职滴滴3年,主要负责乘客生命周期增长运营工作,通过画像标签体系助力业务方快速拿结果,平时喜欢逛steam,欢迎交流!

编辑 | 周景怡

-

推荐阅读


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

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