################# 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
...
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, 复现成功!
- 复现 DLRM 保存了训练好的模型文件,链接: https://pan.baidu.com/s/1EXnl9KlzTRehuxlQ70lUCQ 密码: msr1
- 解压后放在 tools 同级目录下,再利用以下命令可以快速验证测试集 AUC:
!cd /home/aistudio/work/rank/DLRM-Paddle && python -u tools/infer.py -m models/rank/dlrm/config_bigdata.yaml
- 模型结构
推荐 rank 模型一般较为简单,如上图 DLRM 的网络结构看着和 DNN 就没啥区别,主要由四个基础模块构成,Embeddings
、 Matrix Factorization
、Factorization Machine
和Multilayer 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 函数激活得到点击概率
- Embedding
待补充...
- Experiments
大佬发文章就是 NB,DLRM vs DCN without extensive tuning and no regularization is used. 简简单单的 SGD + lr=0.1 就把 Accuracy 干上去了。。。
- 2021-08-04 tensorflow2 版本
- pytorch 实现代码翻译为 tensorflow2 版本, 在 criteo 测试集上取得 accuracy >= 0.80 & auc >= 0.79
- 2021-08-06 基于 PaddleRec 框架版本
- 参考 tensorflow2 实现代码,基于 PaddleRec 框架实现 DLRM,在 sample data 上成功运行
- 2021-08-07 paddle 版本跑全量 criteo 数据集 &
调参炼丹!
- batch_size: 128
- Ai-Studio CPU 跑的太慢了... 申请一下 GPU 资源
- 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
- 2021-08-11 补充 Accuracy 指标
- 使用了论文开源代码的默认参数 SGD + lr=0.1, 1 epoch 达到了 auc: 0.805245,accuracy: 0.793599
- 调参数可以得到更高精度
- 训练结束进行验证集测试时,会遇到 "EOFError: marshal data too short" 报错,可能要清理一下 pycache 文件
- GPU 资源太少了。。。