PaddlePaddle / Paddle

PArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署)
http://www.paddlepaddle.org/
Apache License 2.0
22.2k stars 5.57k forks source link

大规模离散化稀疏特征模型的训练耗时问题 #3600

Closed lutaojian closed 6 years ago

lutaojian commented 7 years ago

原本一直使用LR模型作为CTR预估模型,最近正在调研LearningToRank模型(PaddlePaddle/models/ltr),随后便开始了对Paddle的学习。目前,遇到的最大问题是一轮训练(one pass)时间过长。

使用相同数据规模(7亿样本)、相同特征方案(离散化后的0/1稀疏特征3亿维)、相同cpu集群(40个节点),使用owlqn或LBFGS做优化的传统LR模型# 训练60轮平均耗时2小时,而使用Paddle实现的LR模型仅# 训练一轮就需要超过3小时

以下是我使用Paddle实现的LR模型:

def lr(input_dim):
    # label layer
    label = paddle.layer.data("label", paddle.data_type.dense_vector(1))
    # data layer
    data = paddle.layer.data("data", paddle.data_type.sparse_binary_vector(input_dim))
    # sigmoid
    output = paddle.layer.fc(
        input=data,
        size=1,
        act=paddle.activation.Sigmoid(),
        param_attr=paddle.attr.Param(initial_std=0.01, name="output"))
    # cost layer
    cost = paddle.layer.multi_binary_label_cross_entropy_cost(input=output, label=label)
    return cost

优化算法选用Adam,配置代码如下:

    trainer = paddle.trainer.SGD(
        cost=cost,
        parameters=parameters,
        update_equation=paddle.optimizer.Adam(learning_rate=1e-3),
        is_local=True)

对于上面这个没有任何隐层的模型,目前的训练耗时已经无法接受,导致使用LearningToRank模型替代传统LR模型的方案也无法继续开展。

另外,我还在本地使用小数据集做了测试(1500W样本,feature_dim=3亿,batch_size=5W),及时小数据集训练一轮的平均耗时也仍在1.5个小时。

我需要请教的问题主要有三个: 1)是什么原因导致我模型训练耗时这么长?是否与我的模型配置有关? 2)从我的实验结果上来看,Paddle训练一轮的耗时基本是传统owlqn实现的四五十倍。这是正常的现象吗?... 3)对于大规模离散数据的模型优化,Paddle同学们有什么建议吗?

typhoonzero commented 7 years ago

@jacquesqiao 麻烦也看下这个问题?

可能和这个issue 有关系么 https://github.com/PaddlePaddle/Paddle/issues/2121

typhoonzero commented 7 years ago

@lutaojian 可否用v1版本测下训练的性能呢,怀疑是v2集群训练性能的问题,可以帮助排除下,v1的配置方法文档:http://doc.paddlepaddle.org/release_doc/0.9.0/doc/

lutaojian commented 7 years ago

@typhoonzero 本地1500w样本也训练得很慢,我理解耗时应该与是不是集群任务没有关系?

zhangyong15 commented 7 years ago

是的,paddle支持大规模离散DNN性能不好,我也遇到一样的问题,Paddle V1

dzhwinter commented 7 years ago

可否统计一下load data的耗时? @typhoonzero @lutaojian ,怀疑数据读取这里有问题。一般数量级上的差异是对HDFS读取处理不当造成的。实现上的性能差异不可能有那么大。 @lutaojian paddle主要是NN类型的算法,对传统的大规模LR算法支持没有特别优化过,其中对owqln是大面积地修改了parameter server的接口,支持不算友好。你提到之前用的LR算法我们优化了近两年,快20%-30%左右属于正常范围。

typhoonzero commented 7 years ago

可以先在event_handler中,记录下100或1000个batch的时间和读取数据的时间,观察下。HDFS的数据是在计算开始前下载到节点上的,所以数据读取是直接读取本地磁盘,没有走网络。在程序中记录时间也并不会包含此步骤的时间消耗。

在程序的每个步骤记录下时间debug下严重影响性能的部分,参考:https://github.com/PaddlePaddle/Paddle/issues/3675

lutaojian commented 7 years ago

@lutaojian paddle主要是NN类型的算法

这里面说的NN类型是指什么? @dzhwinter

dzhwinter commented 7 years ago

Neural Network

helinwang commented 7 years ago

可以尝试一下V2 API的prefetch data的功能,详见这里的第一条。