DLRM:Deep Learning Recommendation Model for Personalization and Recommendation Systems
=================================================================================
简介
------------
一个深度学习推荐模型(DLRM)的实现。
模型的输入由稠密特征和稀疏特征组成。前者是一个浮点值向量;后者是一组稀疏索引,用于查找嵌入表中的向量(这些嵌入表由浮点向量组成)。
选取到的这些向量会被送入若干 多层感知机(MLP)网络(通常在示意图中用三角形表示),在某些情况下,这些向量之间还会通过特定的算子(Ops)进行交互
```
output:
probability of a click
model: |
/\
/__\
|
_____________________> Op <___________________
/ | \
/\ /\ /\
/__\ /__\ ... /__\
| | |
| Op Op
| ____/__\_____ ____/__\____
| |_Emb_|____|__| ... |_Emb_|__|___|
input:
[ dense features ] [sparse indices] , ..., [sparse indices]
```
对模型各层的更精确定义:
1)MLP(多层感知机)的全连接层
z = f(y)
y = Wx + b
2)嵌入查找(针对一组稀疏索引 p=[p1,...,pk]p = [p_1, ..., p_k]p=[p1,...,pk])
z = Op(e1,...,ek)
obtain vectors e1=E[:,p1], ..., ek=E[:,pk]
3)算子 Op 可以是以下几种之一
Sum(e1,...,ek) = e1 + ... + ek
Dot(e1,...,ek) = [e1'e1, ..., e1'ek, ..., ek'e1, ..., ek'ek]
Cat(e1,...,ek) = [e1', ..., ek']'
where ' denotes transpose operation
部署
--------------
### Docker
**容器创建**
```bash
docker run --shm-size 500g --network=host --name=dlrm --privileged --device=/dev/kfd --device=/dev/dri --group-add video --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -v /path/to/workspace/:/path/to/workspace/ -v /opt/hyhal:/opt/hyhal:ro -it image.sourcefind.cn:5000/dcu/admin/base/pytorch:2.4.1-ubuntu22.04-dtk25.04.1-py3.10 bash
```
**依赖安装**
```bash
cd dlrm
pip install -r requirements.txt
pip install tensorboard
```
注意:使用 `-i https://pypi.tuna.tsinghua.edu.cn/simple` 会导致 `torchrec-nightly` 相关依赖安装失败
Demo
--------------------
1)使用微型模型运行代码
```bash
python dlrm_s_pytorch.py --mini-batch-size=2 --data-size=6
```
2)在调试模式下使用微型模型运行代码
```bash
python dlrm_s_pytorch.py --mini-batch-size=2 --data-size=6 --debug-mode
```
测试
-------
验证代码功能正确性
```bash
./test/dlrm_s_test.sh
```
基准测试
------------
1)性能基准测试
```bash
./bench/dlrm_s_benchmark.sh
```
2)代码支持数据集 [Criteo Kaggle Display Advertising Challenge Dataset](https://ailab.criteo.com/ressources/)
- 请按以下步骤准备数据,以便在 DLRM 代码中使用:
- 首先,指定下载好的原始数据文件(train.txt),使用参数 `--raw-data-file=`
- 然后对数据进行预处理(分类、跨天合并等),以便在 DLRM 代码中使用
- 预处理后的数据会存储为 `*.npz` 文件,路径为 `/input/*.npz`
- 预处理后的文件 (`*.npz`) 可以在后续运行中直接使用,参数为 `--processed-data-file=`
- 可以使用以下脚本对模型进行训练
```bash
./bench/dlrm_s_criteo_kaggle.sh [--test-freq=1024]
```
若要启用gpu,添加参数 `--use-gpu`;若要启用纯推理模式,添加参数 `--inference-only` 并使用参数 `--load-model`指定权重文件
3)代码支持数据集 [Criteo Terabyte Dataset](https://labs.criteo.com/2013/12/download-terabyte-click-logs/).
- 请按以下步骤准备数据,以便在 DLRM 代码中使用:
- 首先,下载原始数据文件 `day_0.gz` 到 `day_23.gz` 并解压
- 使用参数 `--raw-data-file=` 指定解压后的文本文件位置 `day_0` 到 `day_23`(天数会自动追加)
- 然后对数据进行预处理(分类、跨天合并等),以便在 DLRM 代码中使用
- 预处理后的数据会存储为 `*.npz` 文件,路径为 `/input/*.npz`
- 预处理后的文件 (`*.npz`) 可以在后续运行中直接使用,参数为 `--processed-data-file=`
- 可以使用以下脚本对模型进行训练
```bash
./bench/dlrm_s_criteo_terabyte.sh ["--test-freq=10240 --memory-map --data-sub-sample-rate=0.875"]
```
若要启用gpu,添加参数 `--use-gpu`;若要启用纯推理模式,添加参数 `--inference-only` 并使用参数 `--load-model`指定权重文件
- 对应的预训练模型可从以下链接下载:[dlrm_emb64_subsample0.875_maxindrange10M_pretrained.pt](https://dlrm.s3-us-west-1.amazonaws.com/models/tb0875_10M.pt)
4)代码支持 [MLPerf benchmark](https://mlperf.org).
- 请参考以下训练参数
```bash
--mlperf-logging 用于跟踪多个指标,包括曲线下面积(AUC)
--mlperf-acc-threshold 允许基于准确率指标提前停止训练
--mlperf-auc-threshold 允许基于 AUC 指标提前停止训练
--mlperf-bin-loader 启用将数据预处理成单个二进制文件
--mlperf-bin-shuffle 控制是否对小批量数据进行随机打乱
```
- MLPerf 模型可使用以下脚本进行训练。
```bash
./bench/run_and_time.sh [--use-gpu]
```
- 对应的预训练模型可从以下链接下载:[dlrm_emb128_subsample0.0_maxindrange40M_pretrained.pt](https://dlrm.s3-us-west-1.amazonaws.com/models/tb00_40M.pt)
5)该代码现在支持同步分布式训练,支持 gloo/nccl/mpi 后端,同时提供了 [PyTorch 分布式启动器](https://pytorch.org/docs/stable/distributed.html#launch-utility) 和 Mpirun 的启动方式。对于 MPI,用户需要自行编写 MPI 启动脚本来配置运行主机。例如,使用 PyTorch 分布式启动器,可以使用如下命令作为启动脚本:
```bash
# 在单节点 8 GPU 环境下,使用 NCCL 作为后端处理随机生成的数据集时:
python -m torch.distributed.launch --nproc_per_node=8 dlrm_s_pytorch.py --arch-embedding-size="80000-80000-80000-80000-80000-80000-80000-80000" --arch-sparse-feature-size=64 --arch-mlp-bot="128-128-128-128" --arch-mlp-top="512-512-512-256-1" --max-ind-range=40000000
--data-generation=random --loss-function=bce --round-targets=True --learning-rate=1.0 --mini-batch-size=2048 --print-freq=2 --print-time --test-freq=2 --test-mini-batch-size=2048 --memory-map --use-gpu --num-batches=100 --dist-backend=nccl
# 对于多节点环境,用户可以根据启动器手册添加相关参数,例如:
--nnodes=2 --node_rank=0 --master_addr="192.168.1.1" --master_port=1234
```
模型检查点保存/加载
-------------------------------
在训练过程中,可以使用参数 `--save-model=` 保存模型
当测试准确率有所提升时(按 `--test-freq` 指定的间隔检查),模型会被保存
已保存的模型可以通过 `--load-model=` 加载
加载后,模型可以用于继续训练,已保存的模型相当于一个检查点或者,也可以通过指定 `--inference-only` 选项,仅使用保存的模型在测试数据集上进行评估
参考资料
-------
https://github.com/facebookresearch/dlrm