PaddlePaddle分布式推荐算法实践

我与影子孤独终老i 提交于 2019-12-17 06:33:26

项目介绍

本项目只实现了DeepFM论文中介绍的模型的DNN部分,DNN部分模型结构如下:
在这里插入图片描述该项目目前仅支持在CPU环境下运行
在百度云上运行集群训练

参考文档 在百度云上启动Fluid分布式训练 在百度云上部署一个CPU集群。
用preprocess.py处理训练数据生成train.txt。
将train.txt切分成集群机器份,放到每台机器上。
用上面的 分布式训练 中的命令行启动分布式训练任务.

在PaddleCloud上运行集群训练

如果你正在使用PaddleCloud做集群训练,你可以使用cloud.py这个文件来帮助你提交任务,trian.py中所需要的参数可以通过PaddleCloud的环境变量来提交。
文件结构

本项目的文件结构如下

|--raw					# 原始数据集
|--models				# 训练过程中暂存的模型
|--infer_model				# 固化后的模型
|--train.py				# 训练脚本
|--reader.py				# 数据读取脚本
|--preprocess.py			# 数据预处理脚本
|--cloud.py				# 集群训练脚本
|--network_conf.py			# 构建模型
|--freeze_infer.py			# 使用固化模型进行预测的脚本
|--infer.py				# 预测脚本
|--freeze.py				# 固化模型参数

数据集介绍

本示例采用Kaggle公司举办的展示广告竞赛中所使用的Criteo数据集,每一行是一次广告展示的特征,第一列是一个标签,表示这次广告展示是否被点击。 总共39个特征,其中13个特征采用整型值,另外26个特征是类别类特征。测试集中是没有标签的。如果挂载的数据集出现了问题可以通过download.sh进行下载。

数据准备

处理原始数据集,整型特征使用min-max归一化方法规范到[0, 1],类别类特征使用了one-hot编码。

# 安装所需要的依赖
!pip install -r raw/requirements.txt

# 解压数据集,本示例采用Kaggle公司举办的展示广告竞赛中所使用的Criteo数据集
# 每一行是一次广告展示的特征,第一列是一个标签,表示这次广告展示是否被点击。
# 总共39个特征,其中13个特征采用整型值,另外26个特征是类别类特征。测试集中是没有标签的。
!tar zxf data/data9831/dac.tar.gz -C data

Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/
Requirement already satisfied: click in /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages (from -r raw/requirements.txt (line 1)) (7.0)
tar: Ignoring unknown extended header keyword ‘SCHILY.dev’
tar: Ignoring unknown extended header keyword ‘SCHILY.ino’
tar: Ignoring unknown extended header keyword ‘SCHILY.nlink’
tar: Ignoring unknown extended header keyword ‘LIBARCHIVE.creationtime’
tar: Ignoring unknown extended header keyword ‘SCHILY.dev’
tar: Ignoring unknown extended header keyword ‘SCHILY.ino’
tar: Ignoring unknown extended header keyword ‘SCHILY.nlink’
tar: Ignoring unknown extended header keyword ‘SCHILY.dev’
tar: Ignoring unknown extended header keyword ‘SCHILY.ino’
tar: Ignoring unknown extended header keyword ‘SCHILY.nlink’

# 单机训练,更多的训练选项可以通过python train.py -h 列出
!python train.py \
        --train_data_path data/train.txt \
        2>&1 | tee train.log

2019-08-28 17:32:32,246 - INFO - run local training
2019-08-28 17:32:32,249 - WARNING -
You can try our memory optimize feature to save your memory usage:
# create a build_strategy variable to set memory optimize option
build_strategy = compiler.BuildStrategy()
build_strategy.enable_inplace = True
build_strategy.memory_optimize = True

     # pass the build_strategy to with_data_parallel API
     compiled_prog = compiler.CompiledProgram(main).with_data_parallel(
         loss_name=loss.name, build_strategy=build_strategy)
  
 !!! Memory optimize is our experimental feature !!!
     some variables may be removed/reused internal to save memory usage, 
     in order to fetch the right value of the fetch_list, please set the 
     persistable property to true for each variable in fetch_list

     # Sample
     conv1 = fluid.layers.conv2d(data, 4, 5, 1, act=None) 
     # if you need to fetch conv1, then:
     conv1.persistable = True

I0828 17:32:32.252265 122 parallel_executor.cc:329] The number of CPUPlace, which is used in ParallelExecutor, is 2. And the Program will be copied 2 copies
2019-08-28 17:33:11,114 - INFO - TRAIN --> pass: 0 batch: 100 loss: 0.560959472656 auc: 0.604878094621, batch_auc: 0.66471662393
2019-08-28 17:33:43,003 - INFO - TRAIN --> pass: 0 batch: 200 loss: 0.530644775391 auc: 0.64567461019, batch_auc: 0.697412425521
2019-08-28 17:34:16,353 - INFO - TRAIN --> pass: 0 batch: 300 loss: 0.518186340332 auc: 0.667632628113, batch_auc: 0.713737378736
2019-08-28 17:34:50,396 - INFO - TRAIN --> pass: 0 batch: 400 loss: 0.496585998535 auc: 0.68199292547, batch_auc: 0.724240023932
2019-08-28 17:35:25,034 - INFO - TRAIN --> pass: 0 batch: 500 loss: 0.490933227539 auc: 0.692327854753, batch_auc: 0.736764962757
2019-08-28 17:35:59,795 - INFO - TRAIN --> pass: 0 batch: 600 loss: 0.495456787109 auc: 0.699235959929, batch_auc: 0.730555801053
2019-08-28 17:36:34,960 - INFO - TRAIN --> pass: 0 batch: 700 loss: 0.493062164307 auc: 0.704030995606, batch_auc: 0.734931893134
2019-08-28 17:37:10,562 - INFO - TRAIN --> pass: 0 batch: 800 loss: 0.495639923096 auc: 0.708320379771, batch_auc: 0.737123133704
2019-08-28 17:37:49,117 - INFO - TRAIN --> pass: 0 batch: 900 loss: 0.49727532959 auc: 0.711594624979, batch_auc: 0.742687896195
2019-08-28 17:38:29,774 - INFO - TRAIN --> pass: 0 batch: 1000 loss: 0.475396759033 auc: 0.714068061775, batch_auc: 0.737140252842
2019-08-28 17:39:11,649 - INFO - TRAIN --> pass: 0 batch: 1100 loss: 0.472644561768 auc: 0.716426890999, batch_auc: 0.734717583409
^C

# 测试,更多的测试选项可以通过python test.py -h 列出
# 输出为每个batch的loss和auc值
!python test.py \
        --model_path models \
        --data_path data/train.txt
# 将训练好的模型参数进行固化,默认
!python freeze.py --model_input_dir models
# 使用固化后的模型参数来进行预测,并输出预测结果,本示例中由于测试数据过多,所以只输出了前20个样本的预测结果
# 该输出结果为点击或者不点击的概率
# 如果有需要可以参考该文件自行修改
!python freeze_infer.py --data_path data/train.txt --model_path infer_model

第0个样本的预测结果:[[0.83990884 0.16009112]]
第1个样本的预测结果:[[0.85764146 0.14235853]]
第2个样本的预测结果:[[0.7183573 0.2816427]]
第3个样本的预测结果:[[0.6653655 0.33463445]]
第4个样本的预测结果:[[0.24618381 0.7538162 ]]
第5个样本的预测结果:[[0.6298784 0.37012157]]
第6个样本的预测结果:[[0.6806892 0.31931084]]
第7个样本的预测结果:[[0.88081723 0.11918283]]
第8个样本的预测结果:[[0.92984957 0.07015043]]
第9个样本的预测结果:[[0.6773194 0.32268053]]
第10个样本的预测结果:[[0.86174905 0.13825098]]
第11个样本的预测结果:[[0.30769616 0.6923039 ]]
第12个样本的预测结果:[[0.77834046 0.22165956]]
第13个样本的预测结果:[[0.8740877 0.12591235]]
第14个样本的预测结果:[[0.68074703 0.31925297]]
第15个样本的预测结果:[[0.77300483 0.22699524]]
第16个样本的预测结果:[[0.15571964 0.8442804 ]]
第17个样本的预测结果:[[0.9358177 0.06418227]]
第18个样本的预测结果:[[0.8236316 0.17636843]]
第19个样本的预测结果:[[0.96068764 0.03931234]]

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!