Skip to content

Latest commit

 

History

History
122 lines (85 loc) · 6.21 KB

README-old.md

File metadata and controls

122 lines (85 loc) · 6.21 KB

一、基于 PaddleRec 框架的 DLRM 推荐算法复现

1. AI-Studio 快速复现步骤
################# Step 1, git clone code ################
# 当前处于 /home/aistudio 目录, 代码存放在 /home/work/rank/DLRM-Paddle 中

import os
if not os.path.isdir('work/rank/DLRM-Paddle'):
    if not os.path.isdir('work/rank'):
        !mkdir work/rank
    !cd work/rank && git clone https://hub.fastgit.org/Andy1314Chen/DLRM-Paddle.git

################# Step 2, download data ################
# 当前处于 /home/aistudio 目录,数据存放在 /home/data/criteo 中

import os
os.makedirs('data/criteo', exist_ok=True)

# Download  data
if not os.path.exists('data/criteo/slot_test_data_full.tar.gz') or not os.path.exists('data/criteo/slot_train_data_full.tar.gz'):
    !cd data/criteo && wget https://paddlerec.bj.bcebos.com/datasets/criteo/slot_test_data_full.tar.gz
    !cd data/criteo && tar xzvf slot_test_data_full.tar.gz
    
    !cd data/criteo && wget https://paddlerec.bj.bcebos.com/datasets/criteo/slot_train_data_full.tar.gz
    !cd data/criteo && tar xzvf slot_train_data_full.tar.gz

################## Step 3, train model ##################
# 启动训练脚本 (需注意当前是否是 GPU 环境)
!cd work/rank/DLRM-Paddle && sh run.sh config_bigdata

2. criteo slot_test_data_full 验证集结果
...
2021-08-11 18:19:45,528 - INFO - epoch: 0, batch_id: 5888, auc: 0.805084,accuracy: 0.793505, avg_reader_cost: 0.02961 sec, avg_batch_cost: 0.05567 sec, avg_samples: 256.00000, ips: 4596.73 ins/s
2021-08-11 18:19:59,916 - INFO - epoch: 0, batch_id: 6144, auc: 0.805157,accuracy: 0.793632, avg_reader_cost: 0.03085 sec, avg_batch_cost: 0.05618 sec, avg_samples: 256.00000, ips: 4554.94 ins/s
2021-08-11 18:20:14,480 - INFO - epoch: 0, batch_id: 6400, auc: 0.805081,accuracy: 0.793623, avg_reader_cost: 0.02785 sec, avg_batch_cost: 0.05687 sec, avg_samples: 256.00000, ips: 4499.95 ins/s
2021-08-11 18:20:30,772 - INFO - epoch: 0, batch_id: 6656, auc: 0.805203,accuracy: 0.793568, avg_reader_cost: 0.02980 sec, avg_batch_cost: 0.06361 sec, avg_samples: 256.00000, ips: 4023.01 ins/s
2021-08-11 18:20:46,270 - INFO - epoch: 0, batch_id: 6912, auc: 0.805174,accuracy: 0.793536, avg_reader_cost: 0.02354 sec, avg_batch_cost: 0.06051 sec, avg_samples: 256.00000, ips: 4228.88 ins/s
2021-08-11 18:21:00,821 - INFO - epoch: 0, batch_id: 7168, auc: 0.805253,accuracy: 0.793609, avg_reader_cost: 0.02986 sec, avg_batch_cost: 0.05682 sec, avg_samples: 256.00000, ips: 4504.05 ins/s
2021-08-11 18:21:01,991 - INFO - epoch: 0 done, auc: 0.805245,accuracy: 0.793599, epoch time: 424.70 s

==2021-08-11 18:21:01,991 - INFO - epoch: 0 done, auc: 0.805245,accuracy: 0.793599, epoch time: 357.97 s==, 达到要求的 AUC>0.79, 复现成功!

3. 利用训练好的模型文件快速验证
!cd /home/aistudio/work/rank/DLRM-Paddle && python -u tools/infer.py -m models/rank/dlrm/config_bigdata.yaml

二、DLRM 算法原理

DLRM

  1. 模型结构

推荐 rank 模型一般较为简单,如上图 DLRM 的网络结构看着和 DNN 就没啥区别,主要由四个基础模块构成,EmbeddingsMatrix FactorizationFactorization MachineMultilayer Perceptrons

DLRM 模型的特征输入,主要包括 dense 数值型和 sparse 类别型两种特征。dense features 直接连接 MLP(如图中的蓝色三角形), sparse features 经由 embedding 层查找得到相应的 embedding 向量。Interactions 层进行特征交叉(包含 dense features 和 sparse features 的交叉及 sparse features之间的交叉等),与因子分解机 FM 有些类似。

DLRM 模型中所有的 sparse features 的 embedding 向量长度均是相等的,且dense features 经由 MLP 也转化成相同的维度。这点是理解该模型代码的关键。

  • dense features 经过 MLP (bottom-MLP) 处理为同样维度的向量
  • spare features 经由 lookup 获得统一维度的 embedding 向量(可选择每一特征对应的 embedding 是否经过 MLP 处理)
  • dense features & sparse features 的向量两两之间进行 dot product 交叉
  • 交叉结果再和 dense 向量 concat 一起输入到顶层 MLP (top-MLP)
  • 经过 sigmoid 函数激活得到点击概率
  1. Embedding

待补充...

  1. Experiments

大佬发文章就是 NB,DLRM vs DCN without extensive tuning and no regularization is used. 简简单单的 SGD + lr=0.1 就把 Accuracy 干上去了。。。

实验结果

三、复现记录

  1. 2021-08-04 tensorflow2 版本
  • pytorch 实现代码翻译为 tensorflow2 版本, 在 criteo 测试集上取得 accuracy >= 0.80 & auc >= 0.79
  1. 2021-08-06 基于 PaddleRec 框架版本
  • 参考 tensorflow2 实现代码,基于 PaddleRec 框架实现 DLRM,在 sample data 上成功运行
  1. 2021-08-07 paddle 版本跑全量 criteo 数据集 & 调参 炼丹!
  • batch_size: 128
  • Ai-Studio CPU 跑的太慢了... 申请一下 GPU 资源
  1. 2021-08-08 Ai-Studio GPU 点卡用完了 & 周末无法申请 GPU 资源
  • CPU 上运行,增大 batch_size & 增大学习率,减少 epoch
  • 核心参数 {epochs: 2, batch_size: 2048, optimizer: SGD, learning_rate: 0.1}
  • slot_test_data_full 全量测试集上 AUC = 0.804146
  1. 2021-08-11 补充 Accuracy 指标
  • 使用了论文开源代码的默认参数 SGD + lr=0.1, 1 epoch 达到了 auc: 0.805245,accuracy: 0.793599
  • 调参数可以得到更高精度

四、遇到问题

  1. 训练结束进行验证集测试时,会遇到 "EOFError: marshal data too short" 报错,可能要清理一下 pycache 文件
  2. GPU 资源太少了。。。

五、参考资料

  1. PaddleRec 文档
  2. Deep Learning Recommendation Model for Personalization and Recommendation Systems
  3. Criteo 数据集
  4. DLRM Pytorch 实现