diff --git a/README.md b/README.md index fc7d9d136ecda62250abc90719c77f0b49ab3d8b..6eca8bd3f077a614127f6e6963f4351699074583 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,77 @@

-

-
- Release - License - Slack -
+ +

+

+

-

什么是PaddleRec

- +

什么是推荐系统?

- +

-- 源于飞桨生态的搜索推荐模型**一站式开箱即用工具** -- 适合初学者,开发者,研究者从调研,训练到预测部署的全流程解决方案 -- 包含语义理解、召回、粗排、精排、多任务学习、融合等多个任务的推荐搜索算法库 -- 配置**yaml**自定义选项,即可快速上手使用单机训练、大规模分布式训练、离线预测、在线部署 +- 推荐系统是在互联网信息爆炸式增长的时代背景下,帮助用户高效获得感兴趣信息的关键; +- 推荐系统也是帮助产品最大限度吸引用户、留存用户、增加用户粘性、提高用户转化率的银弹。 -

PadlleRec概览

+- 有无数优秀的产品依靠用户可感知的推荐系统建立了良好的口碑,也有无数的公司依靠直击用户痛点的推荐系统在行业中占领了一席之地。 -

- -

+ > 可以说,谁能掌握和利用好推荐系统,谁就能在信息分发的激烈竞争中抢得先机。 + > 但与此同时,有着许多问题困扰着推荐系统的开发者,比如:庞大的数据量,复杂的模型结构,低效的分布式训练环境,波动的在离线一致性,苛刻的上线部署要求,以上种种,不胜枚举。 +

什么是PaddleRec?

-

推荐系统-流程概览

-

- -

+- 源于飞桨生态的搜索推荐模型 **一站式开箱即用工具** +- 适合初学者,开发者,研究者的推荐系统全流程解决方案 +- 包含内容理解、匹配、召回、排序、 多任务、重排序等多个任务的完整推荐搜索算法库 + + + | 方向 | 模型 | 单机CPU训练 | 单机GPU训练 | 分布式CPU训练 | + | :------: | :-----------------------------------------------------------------------: | :---------: | :---------: | :-----------: | + | 内容理解 | [Text-Classifcation](models/contentunderstanding/classification/model.py) | ✓ | x | ✓ | + | 内容理解 | [TagSpace](models/contentunderstanding/tagspace/model.py) | ✓ | x | ✓ | + | 召回 | [DSSM](models/match/dssm/model.py) | ✓ | x | ✓ | + | 召回 | [MultiView-Simnet](models/match/multiview-simnet/model.py) | ✓ | x | ✓ | + | 召回 | [TDM](models/treebased/tdm/model.py) | ✓ | x | ✓ | + | 召回 | [Word2Vec](models/recall/word2vec/model.py) | ✓ | x | ✓ | + | 召回 | [SSR](models/recall/ssr/model.py) | ✓ | ✓ | ✓ | + | 召回 | [Gru4Rec](models/recall/gru4rec/model.py) | ✓ | ✓ | ✓ | + | 召回 | [Youtube_dnn](models/recall/youtube_dnn/model.py) | ✓ | ✓ | ✓ | + | 召回 | [NCF](models/recall/ncf/model.py) | ✓ | ✓ | ✓ | + | 排序 | [Logistic Regression](models/rank/logistic_regression/model.py) | ✓ | x | ✓ | + | 排序 | [Dnn](models/rank/dnn/model.py) | ✓ | x | ✓ | + | 排序 | [FM](models/rank/fm/model.py) | ✓ | x | ✓ | + | 排序 | [FFM](models/rank/ffm/model.py) | ✓ | x | ✓ | + | 排序 | [Pnn](models/rank/pnn/model.py) | ✓ | x | ✓ | + | 排序 | [DCN](models/rank/dcn/model.py) | ✓ | x | ✓ | + | 排序 | [NFM](models/rank/nfm/model.py) | ✓ | x | ✓ | + | 排序 | [AFM](models/rank/afm/model.py) | ✓ | x | ✓ | + | 排序 | [DeepFM](models/rank/deepfm/model.py) | ✓ | x | ✓ | + | 排序 | [xDeepFM](models/rank/xdeepfm/model.py) | ✓ | x | ✓ | + | 排序 | [DIN](models/rank/din/model.py) | ✓ | x | ✓ | + | 排序 | [Wide&Deep](models/rank/wide_deep/model.py) | ✓ | x | ✓ | + | 多任务 | [ESMM](models/multitask/esmm/model.py) | ✓ | ✓ | ✓ | + | 多任务 | [MMOE](models/multitask/mmoe/model.py) | ✓ | ✓ | ✓ | + | 多任务 | [ShareBottom](models/multitask/share-bottom/model.py) | ✓ | ✓ | ✓ | + | 重排序 | [Listwise](models/rerank/listwise/model.py) | ✓ | x | ✓ | -

便捷安装

+ + + + +

快速安装

### 环境要求 * Python 2.7/ 3.5 / 3.6 / 3.7 * PaddlePaddle >= 1.7.2 * 操作系统: Windows/Mac/Linux - > Windows下目前仅提供单机训练,建议使用Linux + > Windows下目前仅提供单机训练,建议分布式使用Linux ### 安装命令 @@ -55,7 +83,7 @@ - 安装方法二 源码编译安装 - 1. 安装飞桨 **注:需要用户安装版本 >1.7.2 的飞桨** + 1. 安装飞桨 **注:需要用户安装版本 >=1.7.2 的飞桨** ```shell python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple @@ -70,139 +98,41 @@ ``` -

快速启动

- -### 启动内置模型的默认配置 +

一键启动

-目前框架内置了多个模型,一行命令即可使用内置模型开始单机训练和本地模拟分布式训练。 - > 本地模拟分布式(`local_cluster`)为`1个server + 1个trainer`的参数服务器模式 - - -我们以排序模型中的`dnn`模型为例介绍PaddleRec的简单使用。训练数据来源为[Criteo数据集](https://www.kaggle.com/c/criteo-display-ad-challenge/),我们从中截取了100条方便您快速上手体验完整的PaddleRec流程。 +我们以排序模型中的`dnn`模型为例介绍PaddleRec的一键启动。训练数据来源为[Criteo数据集](https://www.kaggle.com/c/criteo-display-ad-challenge/),我们从中截取了100条数据: ```bash # 使用CPU进行单机训练 python -m paddlerec.run -m paddlerec.models.rank.dnn ``` -### 启动内置模型的自定配置 - -若您复用内置模型,对**yaml**配置文件进行了修改,如更改超参,重新配置数据后,可以直接使用paddlerec运行该yaml文件。 - -我们以dnn模型为例,在paddlerec代码目录下: -```bash -cd paddlerec -``` - -修改dnn模型的[超参配置](./models/rank/dnn/config.yaml),例如将迭代训练轮数从10轮修改为5轮: -```yaml -runner: -- name: runner1 - class: single_train - epochs: 5 # 10->5 -``` - -在Linux环境下,可以使用`vim`等文本编辑工具修改yaml文件: - -```bash -vim ./models/rank/dnn/config.yaml -# 键入 i, 进入编辑模式 -# 修改yaml文件配置 -# 完成修改后,点击esc,退出编辑模式 -# 键入 :wq 保存文件并退出 -``` - -完成dnn模型`models/rank/dnn/config.yaml`的配置修改后,运行`dnn`模型: -```bash -# 使用自定配置进行训练 -python -m paddlerec.run -m ./models/rank/dnn/config.yaml -``` -### 分布式训练 +

帮助文档

-分布式训练需要配置`config.yaml`,加入或修改`engine`选项为`cluster`或`local_cluster`,以进行分布式训练,或本地模拟分布式训练。 - -#### 本地模拟分布式训练 - -我们以dnn模型为例,在paddlerec代码目录下,修改dnn模型的`config.yaml`文件: - -```yaml -runner: -- name: runner1 - class: local_cluster_train # single_train -> local_cluster_train -``` -然后启动paddlerec训练: - -```bash -# 进行本地模拟分布式训练 -python -m paddlerec.run -m ./models/rank/dnn/config.yaml -``` - -#### 集群分布式训练 - -我们以dnn模型为例,在paddlerec代码目录下,首先修改dnn模型`config.yaml`文件: - -```yaml -runner: -- name: runner1 - class: cluster_train # single_train -> cluster_train -``` -再添加分布式启动配置文件`backend.yaml`,具体配置规则在[分布式训练](doc/distributed_train.md)教程中介绍。最后启动paddlerec训练: - -```bash -# 配置好 mpi/k8s/paddlecloud集群环境后 -python -m paddlerec.run -m ./models/rank/dnn/config.yaml -b backend.yaml -``` - - -

支持模型列表

- - -| 方向 | 模型 | 单机CPU训练 | 单机GPU训练 | 分布式CPU训练 | -| :------: | :-----------------------------------------------------------------------: | :---------: | :---------: | :-----------: | -| 内容理解 | [Text-Classifcation](models/contentunderstanding/classification/model.py) | ✓ | x | ✓ | -| 内容理解 | [TagSpace](models/contentunderstanding/tagspace/model.py) | ✓ | x | ✓ | -| 召回 | [DSSM](models/match/dssm/model.py) | ✓ | x | ✓ | -| 召回 | [MultiView-Simnet](models/match/multiview-simnet/model.py) | ✓ | x | ✓ | -| 召回 | [TDM](models/treebased/tdm/model.py) | ✓ | x | ✓ | -| 召回 | [Word2Vec](models/recall/word2vec/model.py) | ✓ | x | ✓ | -| 召回 | [SSR](models/recall/ssr/model.py) | ✓ | ✓ | ✓ | -| 召回 | [Gru4Rec](models/recall/gru4rec/model.py) | ✓ | ✓ | ✓ | -| 召回 | [Youtube_dnn](models/recall/youtube_dnn/model.py) | ✓ | ✓ | ✓ | -| 召回 | [NCF](models/recall/ncf/model.py) | ✓ | ✓ | ✓ | -| 排序 | [Dnn](models/rank/dnn/model.py) | ✓ | x | ✓ | -| 排序 | [DeepFM](models/rank/deepfm/model.py) | ✓ | x | ✓ | -| 排序 | [xDeepFM](models/rank/xdeepfm/model.py) | ✓ | x | ✓ | -| 排序 | [DIN](models/rank/din/model.py) | ✓ | x | ✓ | -| 排序 | [Wide&Deep](models/rank/wide_deep/model.py) | ✓ | x | ✓ | -| 多任务 | [ESMM](models/multitask/esmm/model.py) | ✓ | ✓ | ✓ | -| 多任务 | [MMOE](models/multitask/mmoe/model.py) | ✓ | ✓ | ✓ | -| 多任务 | [ShareBottom](models/multitask/share-bottom/model.py) | ✓ | ✓ | ✓ | -| 重排序 | [Listwise](models/rerank/listwise/model.py) | ✓ | x | ✓ | - - - - -

文档

- -### 背景介绍 +### 项目背景 * [推荐系统介绍](doc/rec_background.md) * [分布式深度学习介绍](doc/ps_background.md) -### 新手教程 -* [环境要求](#环境要求) -* [安装命令](#安装命令) -* [快速开始](#启动内置模型的默认配置) +### 快速开始 +* [十分钟上手PaddleRec](doc/quick_start.md) + +### 入门教程 +* [数据准备](doc/slot_reader.md) +* [模型调参](doc/model.md) +* [启动训练](doc/train.md) +* [启动预测](doc/predict.md) +* [快速部署](doc/serving.md) -### 进阶教程 -* [自定义数据集及Reader](doc/custom_dataset_reader.md) -* [分布式训练](doc/distributed_train.md) -### 开发者教程 +### 进阶教程 +* [自定义Reader](doc/custom_reader.md) +* [自定义模型](doc/development.md) +* [自定义流程](doc/development.md) +* [yaml配置说明](doc/yaml.md) * [PaddleRec设计文档](doc/design.md) -* [二次开发](doc/development.md) -### 关于PaddleRec性能 +### Benchmark * [Benchmark](doc/benchmark.md) ### FAQ @@ -211,12 +141,25 @@ python -m paddlerec.run -m ./models/rank/dnn/config.yaml -b backend.yaml

社区

-### 反馈 -如有意见、建议及使用中的BUG,欢迎在[GitHub Issue](https://github.com/PaddlePaddle/PaddleRec/issues)提交 +

+
+ Release + License + Slack +
+

### 版本历史 - 2020.5.14 - PaddleRec v0.1 ### 许可证书 本项目的发布受[Apache 2.0 license](LICENSE)许可认证。 - + +### 联系我们 + +如有意见、建议及使用中的BUG,欢迎在[GitHub Issue](https://github.com/PaddlePaddle/PaddleRec/issues)提交 + +亦可通过以下方式与我们沟通交流: + +

          

+

      微信公众号              PaddleRec交流QQ群            PaddleRec微信小助手

diff --git a/core/trainers/single_infer.py b/core/trainers/single_infer.py index d54e418c2a36d96f94ec39e53fc11c19e43d3f06..fcc92e2e01cf7af49d6d124a7a5773ac9946c989 100755 --- a/core/trainers/single_infer.py +++ b/core/trainers/single_infer.py @@ -20,6 +20,8 @@ from __future__ import print_function import time import logging import os +import json +import numpy as np import paddle.fluid as fluid from paddlerec.core.trainers.transpiler_trainer import TranspileTrainer @@ -263,8 +265,10 @@ class SingleInfer(TranspileTrainer): envs.get_global_env("runner." + self._runner_name + ".print_interval", 20)) metrics_format.append("{}: {{}}".format("batch")) + metrics_indexes = dict() for name, var in metrics.items(): metrics_varnames.append(var.name) + metrics_indexes[var.name] = len(metrics_varnames) - 1 metrics_format.append("{}: {{}}".format(name)) metrics_format = ", ".join(metrics_format) @@ -272,19 +276,30 @@ class SingleInfer(TranspileTrainer): reader.start() batch_id = 0 scope = self._model[model_name][2] + + infer_results = [] with fluid.scope_guard(scope): try: while True: metrics_rets = self._exe.run(program=program, - fetch_list=metrics_varnames) + fetch_list=metrics_varnames, + return_numpy=False) metrics = [batch_id] metrics.extend(metrics_rets) + batch_infer_result = {} + for k, v in metrics_indexes.items(): + batch_infer_result[k] = np.array(metrics_rets[ + v]).tolist() + infer_results.append(batch_infer_result) + if batch_id % fetch_period == 0 and batch_id != 0: print(metrics_format.format(*metrics)) batch_id += 1 except fluid.core.EOFException: reader.reset() + with open(model_dict['save_path'], 'w') as fout: + json.dump(infer_results, fout) def terminal(self, context): context['is_exit'] = True diff --git a/doc/custom_dataset_reader.md b/doc/custom_reader.md similarity index 86% rename from doc/custom_dataset_reader.md rename to doc/custom_reader.md index 82b0fd12d4f52fe83155fd371f6041be52c8bcba..7f29c21c3a32e2cf17b775741707e4ba83e90373 100644 --- a/doc/custom_dataset_reader.md +++ b/doc/custom_reader.md @@ -1,73 +1,3 @@ -# PaddleRec 推荐数据集格式 - -当你的数据集格式为[slot:feasign]*这种模式,或者可以预处理为这种格式时,可以直接使用PaddleRec内置的Reader。 -好处是不用自己写Reader了,各个model之间的数据格式也都可以统一成一样的格式。 - -## 数据格式说明 - -假如你的原始数据格式为 - -```bash -