Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
PaddleRec
提交
c1de0312
P
PaddleRec
项目概览
BaiXuePrincess
/
PaddleRec
与 Fork 源项目一致
Fork自
PaddlePaddle / PaddleRec
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleRec
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
c1de0312
编写于
6月 12, 2020
作者:
C
Chengmo
提交者:
GitHub
6月 12, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' into fix_ci
上级
1104c3dd
5cd75923
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
126 addition
and
64 deletion
+126
-64
README.md
README.md
+30
-30
doc/yaml.md
doc/yaml.md
+32
-19
models/treebased/tdm/README.md
models/treebased/tdm/README.md
+8
-0
models/treebased/tdm/config.yaml
models/treebased/tdm/config.yaml
+2
-0
models/treebased/tdm/model.py
models/treebased/tdm/model.py
+45
-13
models/treebased/tdm/tdm_startup.py
models/treebased/tdm/tdm_startup.py
+9
-2
未找到文件。
README.md
浏览文件 @
c1de0312
...
@@ -31,36 +31,36 @@
...
@@ -31,36 +31,36 @@
-
包含内容理解、匹配、召回、排序、 多任务、重排序等多个任务的完整推荐搜索算法库
-
包含内容理解、匹配、召回、排序、 多任务、重排序等多个任务的完整推荐搜索算法库
| 方向 | 模型 | 单机CPU
训练 | 单机GPU训练 | 分布式CPU训练
|
| 方向 | 模型 | 单机CPU
| 单机GPU | 分布式CPU | 分布式GPU | 模型来源
|
| :------: | :-----------------------------------------------------------------------: | :-----
----: | :---------: | :
-----------: |
| :------: | :-----------------------------------------------------------------------: | :-----
: | :-----: | :-------: | :-------: | :---------------------------------------------------------------------------------------------------------------------------
-----------: |
| 内容理解 | [Text-Classifcation](models/contentunderstanding/classification/model.py) |
✓ | x | ✓
|
| 内容理解 | [Text-Classifcation](models/contentunderstanding/classification/model.py) |
✓ | x | ✓ | x | /
|
| 内容理解 | [TagSpace](models/contentunderstanding/tagspace/model.py) |
✓ | x | ✓
|
| 内容理解 | [TagSpace](models/contentunderstanding/tagspace/model.py) |
✓ | x | ✓ | x | /
|
| 匹配 | [DSSM](models/match/dssm/model.py) |
✓ | x | ✓
|
| 匹配 | [DSSM](models/match/dssm/model.py) |
✓ | x | ✓ | x | /
|
| 匹配 | [MultiView-Simnet](models/match/multiview-simnet/model.py) |
✓ | x | ✓
|
| 匹配 | [MultiView-Simnet](models/match/multiview-simnet/model.py) |
✓ | x | ✓ | x | /
|
| 召回 | [TDM](models/treebased/tdm/model.py) |
✓ | x | ✓
|
| 召回 | [TDM](models/treebased/tdm/model.py) |
✓ | >=1.8.0 | ✓ | >=1.8.0 | [[KDD 2018](https://www.kdd.org/kdd2018/)][Learning Tree-based Deep Model for Recommender Systems](https://arxiv.org/pdf/1801.02294.pdf)
|
| 召回 | [fasttext](models/recall/fasttext/model.py) |
✓ | x | x
|
| 召回 | [fasttext](models/recall/fasttext/model.py) |
✓ | x | x | x | /
|
| 召回 | [Word2Vec](models/recall/word2vec/model.py) |
✓ | x | ✓
|
| 召回 | [Word2Vec](models/recall/word2vec/model.py) |
✓ | x | ✓ | x | /
|
| 召回 | [SSR](models/recall/ssr/model.py) |
✓ | ✓ | ✓
|
| 召回 | [SSR](models/recall/ssr/model.py) |
✓ | ✓ | ✓ | ✓ | /
|
| 召回 | [Gru4Rec](models/recall/gru4rec/model.py) |
✓ | ✓ | ✓
|
| 召回 | [Gru4Rec](models/recall/gru4rec/model.py) |
✓ | ✓ | ✓ | ✓ | /
|
| 召回 | [Youtube_dnn](models/recall/youtube_dnn/model.py) |
✓ | ✓ | ✓
|
| 召回 | [Youtube_dnn](models/recall/youtube_dnn/model.py) |
✓ | ✓ | ✓ | ✓ | /
|
| 召回 | [NCF](models/recall/ncf/model.py) |
✓ | ✓ | ✓
|
| 召回 | [NCF](models/recall/ncf/model.py) |
✓ | ✓ | ✓ | ✓ | /
|
| 排序 | [Logistic Regression](models/rank/logistic_regression/model.py) |
✓ | x | ✓
|
| 排序 | [Logistic Regression](models/rank/logistic_regression/model.py) |
✓ | x | ✓ | x | /
|
| 排序 | [Dnn](models/rank/dnn/model.py) |
✓ | x | ✓
|
| 排序 | [Dnn](models/rank/dnn/model.py) |
✓ | ✓ | ✓ | ✓ | /
|
| 排序 | [FM](models/rank/fm/model.py) |
✓ | x | ✓
|
| 排序 | [FM](models/rank/fm/model.py) |
✓ | ✓ | ✓ | ✓ | /
|
| 排序 | [FFM](models/rank/ffm/model.py) |
✓ | x | ✓
|
| 排序 | [FFM](models/rank/ffm/model.py) |
✓ | x | ✓ | x | /
|
| 排序 | [Pnn](models/rank/pnn/model.py) |
✓ | x | ✓
|
| 排序 | [Pnn](models/rank/pnn/model.py) |
✓ | x | ✓ | x | /
|
| 排序 | [DCN](models/rank/dcn/model.py) |
✓ | x | ✓
|
| 排序 | [DCN](models/rank/dcn/model.py) |
✓ | x | ✓ | x | /
|
| 排序 | [NFM](models/rank/nfm/model.py) |
✓ | x | ✓
|
| 排序 | [NFM](models/rank/nfm/model.py) |
✓ | x | ✓ | x | /
|
| 排序 | [AFM](models/rank/afm/model.py) |
✓ | x | ✓
|
| 排序 | [AFM](models/rank/afm/model.py) |
✓ | x | ✓ | x | /
|
| 排序 | [DeepFM](models/rank/deepfm/model.py) |
✓ | x | ✓
|
| 排序 | [DeepFM](models/rank/deepfm/model.py) |
✓ | x | ✓ | x | /
|
| 排序 | [xDeepFM](models/rank/xdeepfm/model.py) |
✓ | x | ✓
|
| 排序 | [xDeepFM](models/rank/xdeepfm/model.py) |
✓ | x | ✓ | x | /
|
| 排序 | [DIN](models/rank/din/model.py) |
✓ | x | ✓
|
| 排序 | [DIN](models/rank/din/model.py) |
✓ | x | ✓ | x | /
|
| 排序 | [Wide&Deep](models/rank/wide_deep/model.py) |
✓ | x | ✓
|
| 排序 | [Wide&Deep](models/rank/wide_deep/model.py) |
✓ | x | ✓ | x | /
|
| 排序 |
[FGCNN](models/rank/fgcnn/model.py) | ✓ | x | ✓
|
| 排序 |
[FGCNN](models/rank/fgcnn/model.py) | ✓ | ✓ | ✓ | ✓ | /
|
| 多任务 | [ESMM](models/multitask/esmm/model.py) |
✓ | ✓ | ✓
|
| 多任务 | [ESMM](models/multitask/esmm/model.py) |
✓ | ✓ | ✓ | ✓ | /
|
| 多任务 | [MMOE](models/multitask/mmoe/model.py) |
✓ | ✓ | ✓
|
| 多任务 | [MMOE](models/multitask/mmoe/model.py) |
✓ | ✓ | ✓ | ✓ | /
|
| 多任务 | [ShareBottom](models/multitask/share-bottom/model.py) |
✓ | ✓ | ✓
|
| 多任务 | [ShareBottom](models/multitask/share-bottom/model.py) |
✓ | ✓ | ✓ | ✓ | /
|
| 重排序 | [Listwise](models/rerank/listwise/model.py) |
✓ | x | ✓
|
| 重排序 | [Listwise](models/rerank/listwise/model.py) |
✓ | x | ✓ | x | /
|
...
...
doc/yaml.md
浏览文件 @
c1de0312
...
@@ -2,30 +2,41 @@
...
@@ -2,30 +2,41 @@
## 全局变量
## 全局变量
| 名称 |
类型 | 取值
| 是否必须 | 作用描述 |
| 名称 |
类型 | 取值
| 是否必须 | 作用描述 |
| :-------: | :----
: | :
-----------------------------------: | :------: | :------------------------------------------------: |
| :-------: | :----
---------------: | :----------------
-----------------------------------: | :------: | :------------------------------------------------: |
| workspace |
string | 路径 / paddlerec.models.{方向}.{模型}
| 是 | 指定model/reader/data所在位置 |
| workspace |
string | 绝对路径 或 paddlerec.models.{方向}.{模型}
| 是 | 指定model/reader/data所在位置 |
| mode | string
| runner名称 | 是 | 指定当次运行使用哪个
runner |
| mode | string
/ list[string] | string:单个runner的名称 / list:多个runner名称的列表 | 是 | 指定当次运行使用哪些
runner |
| debug |
bool | True / False
| 否 | 当dataset.mode=QueueDataset时,开启op耗时debug功能 |
| debug |
bool | True / False
| 否 | 当dataset.mode=QueueDataset时,开启op耗时debug功能 |
## runner变量
## runner变量
| 名称 | 类型 | 取值 | 是否必须 | 作用描述 |
| 名称 | 类型 | 取值 | 是否必须 | 作用描述 |
| :---------------------------: | :----------: | :-------------------------------: | :------: | :---------------------------------------------: |
| :---------------------------: | :----------: | :-------------------------------------------: | :------: | :------------------------------------------------------------------: |
| name | string | 任意 | 是 | 指定runner名称 |
| name | string | 任意 | 是 | 指定runner名称 |
| class | string | single_train(默认) / single_infer | 是 | 指定运行runner的类别(单机/分布式, 训练/预测) |
| class | string | train(默认) / infer / local_cluster / cluster | 是 | 指定运行runner的类别(单机/分布式, 训练/预测) |
| device | string | cpu(默认) / gpu | 否 | 程序执行设备 |
| device | string | cpu(默认) / gpu | 否 | 程序执行设备 |
| epochs | int | >= 1 | 否 | 模型训练迭代轮数 |
| fleet_mode | string | ps(默认) / pslib / collective | 否 | 分布式运行模式 |
| init_model_path | string | 路径 | 否 | 初始化模型地址 |
| selsected_gpus | string | "0"(默认) | 否 | 程序运行GPU卡号,若以"0,1"的方式指定多卡,则会默认启用collective模式 |
| save_checkpoint_interval | int | >= 1 | 否 | Save参数的轮数间隔 |
| worker_num | int | 1(默认) | 否 | 参数服务器模式下worker的数量 |
| save_checkpoint_path | string | 路径 | 否 | Save参数的地址 |
| server_num | int | 1(默认) | 否 | 参数服务器模式下server的数量 |
| save_inference_interval | int | >= 1 | 否 | Save预测模型的轮数间隔 |
| distribute_strategy | string | async(默认)/sync/half_async/geo | 否 | 参数服务器模式下训练模式的选择 |
| save_inference_path | string | 路径 | 否 | Save预测模型的地址 |
| epochs | int | >= 1 | 否 | 模型训练迭代轮数 |
| save_inference_feed_varnames | list[string] | 组网中指定Variable的name | 否 | 预测模型的入口变量name |
| phases | list[string] | 由phase name组成的list | 否 | 当前runner的训练过程列表,顺序执行 |
| save_inference_fetch_varnames | list[string] | 组网中指定Variable的name | 否 | 预测模型的出口变量name |
| init_model_path | string | 路径 | 否 | 初始化模型地址 |
| print_interval | int | >= 1 | 否 | 训练指标打印batch间隔 |
| save_checkpoint_interval | int | >= 1 | 否 | Save参数的轮数间隔 |
| save_checkpoint_path | string | 路径 | 否 | Save参数的地址 |
| save_inference_interval | int | >= 1 | 否 | Save预测模型的轮数间隔 |
| save_inference_path | string | 路径 | 否 | Save预测模型的地址 |
| save_inference_feed_varnames | list[string] | 组网中指定Variable的name | 否 | 预测模型的入口变量name |
| save_inference_fetch_varnames | list[string] | 组网中指定Variable的name | 否 | 预测模型的出口变量name |
| print_interval | int | >= 1 | 否 | 训练指标打印batch间隔 |
| instance_class_path | string | 路径 | 否 | 自定义instance流程实现的地址 |
| network_class_path | string | 路径 | 否 | 自定义network流程实现的地址 |
| startup_class_path | string | 路径 | 否 | 自定义startup流程实现的地址 |
| runner_class_path | string | 路径 | 否 | 自定义runner流程实现的地址 |
| terminal_class_path | string | 路径 | 否 | 自定义terminal流程实现的地址 |
...
@@ -38,6 +49,7 @@
...
@@ -38,6 +49,7 @@
| dataset_name | string | dataset名称 | 是 | 指定使用哪个Reader |
| dataset_name | string | dataset名称 | 是 | 指定使用哪个Reader |
| thread_num | int | >= 1 | 否 | 模型训练线程数 |
| thread_num | int | >= 1 | 否 | 模型训练线程数 |
## dataset变量
## dataset变量
| 名称 | 类型 | 取值 | 是否必须 | 作用描述 |
| 名称 | 类型 | 取值 | 是否必须 | 作用描述 |
...
@@ -50,6 +62,7 @@
...
@@ -50,6 +62,7 @@
| sparse_slots | string | string | 否 | 指定稀疏参数选项 |
| sparse_slots | string | string | 否 | 指定稀疏参数选项 |
| dense_slots | string | string | 否 | 指定稠密参数选项 |
| dense_slots | string | string | 否 | 指定稠密参数选项 |
## hyper_parameters变量
## hyper_parameters变量
| 名称 | 类型 | 取值 | 是否必须 | 作用描述 |
| 名称 | 类型 | 取值 | 是否必须 | 作用描述 |
| :---------------------: | :----: | :--------------: | :------: | :-------------------------: |
| :---------------------: | :----: | :--------------: | :------: | :-------------------------: |
...
...
models/treebased/tdm/README.md
浏览文件 @
c1de0312
...
@@ -2,6 +2,14 @@
...
@@ -2,6 +2,14 @@
本代码仅作tdm组网示例,使用fake数据集,用于快速调研paddle-tdm。
本代码仅作tdm组网示例,使用fake数据集,用于快速调研paddle-tdm。
## 运行方法
1.
运行单机流程,得到init_model
2.
基于单机模型,可以进行分布式的参数服务器训练
```
shell
python
-m
paddlerec.run
-m
paddlerec.models.treebased.tdm
```
## 树结构的准备
## 树结构的准备
### 名词概念
### 名词概念
...
...
models/treebased/tdm/config.yaml
浏览文件 @
c1de0312
...
@@ -78,6 +78,7 @@ runner:
...
@@ -78,6 +78,7 @@ runner:
save_inference_fetch_varnames
:
[]
# fetch vars of save inference
save_inference_fetch_varnames
:
[]
# fetch vars of save inference
init_model_path
:
"
"
# load model path
init_model_path
:
"
"
# load model path
print_interval
:
10
print_interval
:
10
-
name
:
runner2
-
name
:
runner2
class
:
single_infer
class
:
single_infer
startup_class_path
:
"
{workspace}/tdm_startup.py"
startup_class_path
:
"
{workspace}/tdm_startup.py"
...
@@ -87,6 +88,7 @@ runner:
...
@@ -87,6 +88,7 @@ runner:
device
:
cpu
device
:
cpu
init_model_path
:
"
increment/0"
# load model path
init_model_path
:
"
increment/0"
# load model path
print_interval
:
1
print_interval
:
1
-
name
:
runner3
-
name
:
runner3
class
:
local_cluster_train
class
:
local_cluster_train
startup_class_path
:
"
{workspace}/tdm_startup.py"
startup_class_path
:
"
{workspace}/tdm_startup.py"
...
...
models/treebased/tdm/model.py
浏览文件 @
c1de0312
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
# See the License for the specific language governing permissions and
# See the License for the specific language governing permissions and
# limitations under the License.
# limitations under the License.
"""
"""
import
paddle
import
paddle.fluid
as
fluid
import
paddle.fluid
as
fluid
from
paddlerec.core.utils
import
envs
from
paddlerec.core.utils
import
envs
...
@@ -105,18 +105,34 @@ class Model(ModelBase):
...
@@ -105,18 +105,34 @@ class Model(ModelBase):
# sample_nodes 是采样的node_id的结果,包含正负样本
# sample_nodes 是采样的node_id的结果,包含正负样本
# sample_label 是采样的node_id对应的正负标签
# sample_label 是采样的node_id对应的正负标签
# sample_mask 是为了保持tensor维度一致,padding部分的标签,若为0,则是padding的虚拟node_id
# sample_mask 是为了保持tensor维度一致,padding部分的标签,若为0,则是padding的虚拟node_id
sample_nodes
,
sample_label
,
sample_mask
=
fluid
.
contrib
.
layers
.
tdm_sampler
(
x
=
item_label
,
if
self
.
check_version
():
neg_samples_num_list
=
self
.
neg_sampling_list
,
with
fluid
.
device_guard
(
"cpu"
):
layer_node_num_list
=
self
.
layer_node_num_list
,
sample_nodes
,
sample_label
,
sample_mask
=
fluid
.
contrib
.
layers
.
tdm_sampler
(
leaf_node_num
=
self
.
leaf_node_nums
,
x
=
item_label
,
tree_travel_attr
=
fluid
.
ParamAttr
(
name
=
"TDM_Tree_Travel"
),
neg_samples_num_list
=
self
.
neg_sampling_list
,
tree_layer_attr
=
fluid
.
ParamAttr
(
name
=
"TDM_Tree_Layer"
),
layer_node_num_list
=
self
.
layer_node_num_list
,
output_positive
=
self
.
output_positive
,
leaf_node_num
=
self
.
leaf_node_nums
,
output_list
=
True
,
tree_travel_attr
=
fluid
.
ParamAttr
(
name
=
"TDM_Tree_Travel"
),
seed
=
0
,
tree_layer_attr
=
fluid
.
ParamAttr
(
name
=
"TDM_Tree_Layer"
),
tree_dtype
=
'int64'
,
output_positive
=
self
.
output_positive
,
dtype
=
'int64'
)
output_list
=
True
,
seed
=
0
,
tree_dtype
=
'int64'
,
dtype
=
'int64'
)
else
:
sample_nodes
,
sample_label
,
sample_mask
=
fluid
.
contrib
.
layers
.
tdm_sampler
(
x
=
item_label
,
neg_samples_num_list
=
self
.
neg_sampling_list
,
layer_node_num_list
=
self
.
layer_node_num_list
,
leaf_node_num
=
self
.
leaf_node_nums
,
tree_travel_attr
=
fluid
.
ParamAttr
(
name
=
"TDM_Tree_Travel"
),
tree_layer_attr
=
fluid
.
ParamAttr
(
name
=
"TDM_Tree_Layer"
),
output_positive
=
self
.
output_positive
,
output_list
=
True
,
seed
=
0
,
tree_dtype
=
'int64'
,
dtype
=
'int64'
)
# 查表得到每个节点的Embedding
# 查表得到每个节点的Embedding
sample_nodes_emb
=
[
sample_nodes_emb
=
[
...
@@ -479,3 +495,19 @@ class Model(ModelBase):
...
@@ -479,3 +495,19 @@ class Model(ModelBase):
bias_attr
=
fluid
.
ParamAttr
(
bias_attr
=
fluid
.
ParamAttr
(
name
=
"cls.concat_fc.bias."
+
str
(
layer_idx
)))
name
=
"cls.concat_fc.bias."
+
str
(
layer_idx
)))
return
hidden_states_fc
return
hidden_states_fc
def
check_version
(
self
):
"""
Log error and exit when the installed version of paddlepaddle is
not satisfied.
"""
err
=
"TDM-GPU need Paddle version 1.8 or higher is required, "
\
"or a suitable develop version is satisfied as well.
\n
"
\
"Please make sure the version is good with your code."
\
try
:
fluid
.
require_version
(
'1.8.0'
)
return
True
except
Exception
as
e
:
print
(
err
)
return
False
models/treebased/tdm/tdm_startup.py
浏览文件 @
c1de0312
...
@@ -115,11 +115,18 @@ class Startup(StartupBase):
...
@@ -115,11 +115,18 @@ class Startup(StartupBase):
res
=
var
.
name
in
special_param
res
=
var
.
name
in
special_param
return
res
return
res
if
context
[
"fleet_mode"
].
upper
()
==
"PS"
:
program
=
context
[
"model"
][
model_dict
[
"name"
]][
"main_program"
]
elif
context
[
"fleet_mode"
].
upper
()
==
"COLLECTIVE"
:
program
=
context
[
"model"
][
model_dict
[
"name"
]][
"default_main_program"
]
else
:
raise
ValueError
(
"TDM not support PSLIB"
)
fluid
.
io
.
load_vars
(
fluid
.
io
.
load_vars
(
context
[
"exe"
],
context
[
"exe"
],
dirname
=
warmup_model_path
,
dirname
=
warmup_model_path
,
main_program
=
context
[
"model"
][
model_dict
[
"name"
]][
main_program
=
program
,
"main_program"
],
predicate
=
is_tdm_tree_var
)
predicate
=
is_tdm_tree_var
)
""" -------- tree file load detail --------- """
""" -------- tree file load detail --------- """
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录