Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Crayon鑫
Paddle
提交
6097aefb
P
Paddle
项目概览
Crayon鑫
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
6097aefb
编写于
2月 08, 2022
作者:
Y
yaoxuefeng
提交者:
GitHub
2月 08, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add ctr_double_accessor (#39377)
上级
424700ff
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
646 addition
and
0 deletion
+646
-0
paddle/fluid/distributed/ps/table/CMakeLists.txt
paddle/fluid/distributed/ps/table/CMakeLists.txt
+2
-0
paddle/fluid/distributed/ps/table/ctr_double_accessor.cc
paddle/fluid/distributed/ps/table/ctr_double_accessor.cc
+399
-0
paddle/fluid/distributed/ps/table/ctr_double_accessor.h
paddle/fluid/distributed/ps/table/ctr_double_accessor.h
+245
-0
未找到文件。
paddle/fluid/distributed/ps/table/CMakeLists.txt
浏览文件 @
6097aefb
...
@@ -41,9 +41,11 @@ cc_library(tensor_table SRCS tensor_table.cc DEPS eigen3 ps_framework_proto exec
...
@@ -41,9 +41,11 @@ cc_library(tensor_table SRCS tensor_table.cc DEPS eigen3 ps_framework_proto exec
set_source_files_properties
(
table.cc PROPERTIES COMPILE_FLAGS
${
DISTRIBUTE_COMPILE_FLAGS
}
)
set_source_files_properties
(
table.cc PROPERTIES COMPILE_FLAGS
${
DISTRIBUTE_COMPILE_FLAGS
}
)
set_source_files_properties
(
sparse_sgd_rule.cc PROPERTIES COMPILE_FLAGS
${
DISTRIBUTE_COMPILE_FLAGS
}
)
set_source_files_properties
(
sparse_sgd_rule.cc PROPERTIES COMPILE_FLAGS
${
DISTRIBUTE_COMPILE_FLAGS
}
)
set_source_files_properties
(
ctr_double_accessor.cc PROPERTIES COMPILE_FLAGS
${
DISTRIBUTE_COMPILE_FLAGS
}
)
set_source_files_properties
(
ctr_accessor.cc PROPERTIES COMPILE_FLAGS
${
DISTRIBUTE_COMPILE_FLAGS
}
)
set_source_files_properties
(
ctr_accessor.cc PROPERTIES COMPILE_FLAGS
${
DISTRIBUTE_COMPILE_FLAGS
}
)
set_source_files_properties
(
memory_sparse_table.cc PROPERTIES COMPILE_FLAGS
${
DISTRIBUTE_COMPILE_FLAGS
}
)
set_source_files_properties
(
memory_sparse_table.cc PROPERTIES COMPILE_FLAGS
${
DISTRIBUTE_COMPILE_FLAGS
}
)
cc_library
(
sparse_sgd_rule SRCS sparse_sgd_rule.cc DEPS
${
TABLE_DEPS
}
ps_framework_proto
)
cc_library
(
sparse_sgd_rule SRCS sparse_sgd_rule.cc DEPS
${
TABLE_DEPS
}
ps_framework_proto
)
cc_library
(
ctr_double_accessor SRCS ctr_double_accessor.cc DEPS
${
TABLE_DEPS
}
ps_framework_proto sparse_sgd_rule
)
cc_library
(
ctr_accessor SRCS ctr_accessor.cc DEPS
${
TABLE_DEPS
}
ps_framework_proto sparse_sgd_rule
)
cc_library
(
ctr_accessor SRCS ctr_accessor.cc DEPS
${
TABLE_DEPS
}
ps_framework_proto sparse_sgd_rule
)
cc_library
(
memory_sparse_table SRCS memory_sparse_table.cc DEPS ps_framework_proto
${
TABLE_DEPS
}
fs afs_wrapper ctr_accessor common_table
)
cc_library
(
memory_sparse_table SRCS memory_sparse_table.cc DEPS ps_framework_proto
${
TABLE_DEPS
}
fs afs_wrapper ctr_accessor common_table
)
...
...
paddle/fluid/distributed/ps/table/ctr_double_accessor.cc
0 → 100644
浏览文件 @
6097aefb
// Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "paddle/fluid/distributed/ps/table/ctr_double_accessor.h"
#include <gflags/gflags.h>
#include "glog/logging.h"
#include "paddle/fluid/string/string_helper.h"
namespace
paddle
{
namespace
distributed
{
int
DownpourCtrDoubleAccessor
::
initialize
()
{
auto
name
=
_config
.
embed_sgd_param
().
name
();
_embed_sgd_rule
=
CREATE_PSCORE_CLASS
(
SparseValueSGDRule
,
name
);
_embed_sgd_rule
->
load_config
(
_config
.
embed_sgd_param
(),
1
);
name
=
_config
.
embedx_sgd_param
().
name
();
_embedx_sgd_rule
=
CREATE_PSCORE_CLASS
(
SparseValueSGDRule
,
name
);
_embedx_sgd_rule
->
load_config
(
_config
.
embedx_sgd_param
(),
_config
.
embedx_dim
());
_show_click_decay_rate
=
_config
.
ctr_accessor_param
().
show_click_decay_rate
();
_ssd_unseenday_threshold
=
_config
.
ctr_accessor_param
().
ssd_unseenday_threshold
();
return
0
;
}
size_t
DownpourCtrDoubleAccessor
::
dim
()
{
auto
embedx_dim
=
_config
.
embedx_dim
();
return
DownpourCtrDoubleFeatureValue
::
dim
(
embedx_dim
);
}
size_t
DownpourCtrDoubleAccessor
::
dim_size
(
size_t
dim
)
{
auto
embedx_dim
=
_config
.
embedx_dim
();
return
DownpourCtrDoubleFeatureValue
::
dim_size
(
dim
,
embedx_dim
);
}
size_t
DownpourCtrDoubleAccessor
::
size
()
{
auto
embedx_dim
=
_config
.
embedx_dim
();
return
DownpourCtrDoubleFeatureValue
::
size
(
embedx_dim
);
}
size_t
DownpourCtrDoubleAccessor
::
mf_size
()
{
return
(
_config
.
embedx_dim
()
+
1
)
*
sizeof
(
float
);
// embedx embedx_g2sum
}
// pull value
size_t
DownpourCtrDoubleAccessor
::
select_dim
()
{
auto
embedx_dim
=
_config
.
embedx_dim
();
return
3
+
embedx_dim
;
}
size_t
DownpourCtrDoubleAccessor
::
select_dim_size
(
size_t
dim
)
{
return
sizeof
(
float
);
}
size_t
DownpourCtrDoubleAccessor
::
select_size
()
{
return
select_dim
()
*
sizeof
(
float
);
}
// push value
size_t
DownpourCtrDoubleAccessor
::
update_dim
()
{
auto
embedx_dim
=
_config
.
embedx_dim
();
return
4
+
embedx_dim
;
}
size_t
DownpourCtrDoubleAccessor
::
update_dim_size
(
size_t
dim
)
{
return
sizeof
(
float
);
}
size_t
DownpourCtrDoubleAccessor
::
update_size
()
{
return
update_dim
()
*
sizeof
(
float
);
}
bool
DownpourCtrDoubleAccessor
::
shrink
(
float
*
value
)
{
// auto base_threshold = _config.ctr_accessor_param().base_threshold();
// auto delta_threshold = _config.ctr_accessor_param().delta_threshold();
// auto delete_threshold = _config.ctr_accessor_param().delete_threshold();
auto
base_threshold
=
_config
.
ctr_accessor_param
().
base_threshold
();
auto
delta_threshold
=
_config
.
ctr_accessor_param
().
delta_threshold
();
auto
delete_after_unseen_days
=
_config
.
ctr_accessor_param
().
delete_after_unseen_days
();
auto
delete_threshold
=
_config
.
ctr_accessor_param
().
delete_threshold
();
// time_decay first
DownpourCtrDoubleFeatureValue
::
show
(
value
)
*=
_show_click_decay_rate
;
DownpourCtrDoubleFeatureValue
::
click
(
value
)
*=
_show_click_decay_rate
;
// shrink after
auto
score
=
show_click_score
(
DownpourCtrDoubleFeatureValue
::
show
(
value
),
DownpourCtrDoubleFeatureValue
::
click
(
value
));
auto
unseen_days
=
DownpourCtrDoubleFeatureValue
::
unseen_days
(
value
);
if
(
score
<
delete_threshold
||
unseen_days
>
delete_after_unseen_days
)
{
return
true
;
}
return
false
;
}
bool
DownpourCtrDoubleAccessor
::
save_ssd
(
float
*
value
)
{
if
(
DownpourCtrDoubleFeatureValue
::
unseen_days
(
value
)
>
_ssd_unseenday_threshold
)
{
return
true
;
}
return
false
;
}
// bool DownpourCtrDoubleAccessor::save_cache(
// float* value, int param, double global_cache_threshold) {
// auto base_threshold = _config.ctr_accessor_param().base_threshold();
// auto delta_keep_days = _config.ctr_accessor_param().delta_keep_days();
// if (show_click_score(DownpourCtrDoubleFeatureValue::show(value),
// DownpourCtrDoubleFeatureValue::click(value)) >= base_threshold
// && DownpourCtrDoubleFeatureValue::unseen_days(value) <=
// delta_keep_days) {
// return DownpourCtrDoubleFeatureValue::show(value) >
// global_cache_threshold;
// }
// return false;
// }
bool
DownpourCtrDoubleAccessor
::
save
(
float
*
value
,
int
param
)
{
// auto base_threshold = _config.ctr_accessor_param().base_threshold();
// auto delta_threshold = _config.ctr_accessor_param().delta_threshold();
// auto delta_keep_days = _config.ctr_accessor_param().delta_keep_days();
auto
base_threshold
=
_config
.
ctr_accessor_param
().
base_threshold
();
auto
delta_threshold
=
_config
.
ctr_accessor_param
().
delta_threshold
();
auto
delta_keep_days
=
_config
.
ctr_accessor_param
().
delta_keep_days
();
if
(
param
==
2
)
{
delta_threshold
=
0
;
}
switch
(
param
)
{
// save all
case
0
:
{
return
true
;
}
// save xbox delta
case
1
:
// save xbox base
case
2
:
{
if
(
show_click_score
(
DownpourCtrDoubleFeatureValue
::
show
(
value
),
DownpourCtrDoubleFeatureValue
::
click
(
value
))
>=
base_threshold
&&
DownpourCtrDoubleFeatureValue
::
delta_score
(
value
)
>=
delta_threshold
&&
DownpourCtrDoubleFeatureValue
::
unseen_days
(
value
)
<=
delta_keep_days
)
{
// do this after save, because it must not be modified when retry
if
(
param
==
2
)
{
DownpourCtrDoubleFeatureValue
::
delta_score
(
value
)
=
0
;
}
return
true
;
}
else
{
return
false
;
}
}
// already decayed in shrink
case
3
:
{
// DownpourCtrFeatureValue::show(value) *= _show_click_decay_rate;
// DownpourCtrFeatureValue::click(value) *= _show_click_decay_rate;
// do this after save, because it must not be modified when retry
// DownpourCtrDoubleFeatureValue::unseen_days(value)++;
return
true
;
}
default:
return
true
;
};
}
void
DownpourCtrDoubleAccessor
::
update_stat_after_save
(
float
*
value
,
int
param
)
{
auto
base_threshold
=
_config
.
ctr_accessor_param
().
base_threshold
();
auto
delta_threshold
=
_config
.
ctr_accessor_param
().
delta_threshold
();
auto
delta_keep_days
=
_config
.
ctr_accessor_param
().
delta_keep_days
();
if
(
param
==
2
)
{
delta_threshold
=
0
;
}
switch
(
param
)
{
case
1
:
{
if
(
show_click_score
(
DownpourCtrDoubleFeatureValue
::
show
(
value
),
DownpourCtrDoubleFeatureValue
::
click
(
value
))
>=
base_threshold
&&
DownpourCtrDoubleFeatureValue
::
delta_score
(
value
)
>=
delta_threshold
&&
DownpourCtrDoubleFeatureValue
::
unseen_days
(
value
)
<=
delta_keep_days
)
{
DownpourCtrDoubleFeatureValue
::
delta_score
(
value
)
=
0
;
}
}
return
;
case
3
:
{
DownpourCtrDoubleFeatureValue
::
unseen_days
(
value
)
++
;
}
return
;
default:
return
;
};
}
int32_t
DownpourCtrDoubleAccessor
::
create
(
float
**
values
,
size_t
num
)
{
auto
embedx_dim
=
_config
.
embedx_dim
();
for
(
size_t
value_item
=
0
;
value_item
<
num
;
++
value_item
)
{
float
*
value
=
values
[
value_item
];
value
[
DownpourCtrDoubleFeatureValue
::
unseen_days_index
()]
=
0
;
value
[
DownpourCtrDoubleFeatureValue
::
delta_score_index
()]
=
0
;
*
(
double
*
)(
value
+
DownpourCtrDoubleFeatureValue
::
show_index
())
=
0
;
*
(
double
*
)(
value
+
DownpourCtrDoubleFeatureValue
::
click_index
())
=
0
;
value
[
DownpourCtrDoubleFeatureValue
::
slot_index
()]
=
-
1
;
_embed_sgd_rule
->
init_value
(
value
+
DownpourCtrDoubleFeatureValue
::
embed_w_index
(),
value
+
DownpourCtrDoubleFeatureValue
::
embed_g2sum_index
());
_embedx_sgd_rule
->
init_value
(
value
+
DownpourCtrDoubleFeatureValue
::
embedx_w_index
(),
value
+
DownpourCtrDoubleFeatureValue
::
embedx_g2sum_index
(),
false
);
}
return
0
;
}
bool
DownpourCtrDoubleAccessor
::
need_extend_mf
(
float
*
value
)
{
auto
show
=
((
double
*
)(
value
+
DownpourCtrDoubleFeatureValue
::
show_index
()))[
0
];
auto
click
=
((
double
*
)(
value
+
DownpourCtrDoubleFeatureValue
::
click_index
()))[
0
];
// float score = (show - click) * _config.ctr_accessor_param().nonclk_coeff()
auto
score
=
(
show
-
click
)
*
_config
.
ctr_accessor_param
().
nonclk_coeff
()
+
click
*
_config
.
ctr_accessor_param
().
click_coeff
();
//+ click * _config.ctr_accessor_param().click_coeff();
return
score
>=
_config
.
embedx_threshold
();
}
// from DownpourCtrFeatureValue to DownpourCtrPullValue
int32_t
DownpourCtrDoubleAccessor
::
select
(
float
**
select_values
,
const
float
**
values
,
size_t
num
)
{
auto
embedx_dim
=
_config
.
embedx_dim
();
for
(
size_t
value_item
=
0
;
value_item
<
num
;
++
value_item
)
{
float
*
select_value
=
select_values
[
value_item
];
float
*
value
=
const_cast
<
float
*>
(
values
[
value_item
]);
select_value
[
DownpourCtrDoublePullValue
::
show_index
()]
=
(
float
)
*
(
double
*
)(
value
+
DownpourCtrDoubleFeatureValue
::
show_index
());
select_value
[
DownpourCtrDoublePullValue
::
click_index
()]
=
(
float
)
*
(
double
*
)(
value
+
DownpourCtrDoubleFeatureValue
::
click_index
());
select_value
[
DownpourCtrDoublePullValue
::
embed_w_index
()]
=
value
[
DownpourCtrDoubleFeatureValue
::
embed_w_index
()];
memcpy
(
select_value
+
DownpourCtrDoublePullValue
::
embedx_w_index
(),
value
+
DownpourCtrDoubleFeatureValue
::
embedx_w_index
(),
embedx_dim
*
sizeof
(
float
));
}
return
0
;
}
// from DownpourCtrPushValue to DownpourCtrPushValue
// first dim: item
// second dim: field num
int32_t
DownpourCtrDoubleAccessor
::
merge
(
float
**
update_values
,
const
float
**
other_update_values
,
size_t
num
)
{
auto
embedx_dim
=
_config
.
embedx_dim
();
size_t
total_dim
=
DownpourCtrDoublePushValue
::
dim
(
embedx_dim
);
for
(
size_t
value_item
=
0
;
value_item
<
num
;
++
value_item
)
{
float
*
update_value
=
update_values
[
value_item
];
const
float
*
other_update_value
=
other_update_values
[
value_item
];
/**(double*)(update_value + DownpourCtrDoublePushValue::show_index()) +=
*(double*)(other_update_value + DownpourCtrDoublePushValue::show_index());
*(double*)(update_value + DownpourCtrDoublePushValue::click_index()) +=
*(double*)(other_update_value + DownpourCtrDoublePushValue::click_index());
for (auto i = 3u; i < total_dim; ++i) {
update_value[i] += other_update_value[i];
}*/
for
(
auto
i
=
0u
;
i
<
total_dim
;
++
i
)
{
if
(
i
!=
DownpourCtrDoublePushValue
::
slot_index
())
{
update_value
[
i
]
+=
other_update_value
[
i
];
}
}
}
return
0
;
}
// from DownpourCtrPushValue to DownpourCtrFeatureValue
// first dim: item
// second dim: field num
int32_t
DownpourCtrDoubleAccessor
::
update
(
float
**
update_values
,
const
float
**
push_values
,
size_t
num
)
{
auto
embedx_dim
=
_config
.
embedx_dim
();
for
(
size_t
value_item
=
0
;
value_item
<
num
;
++
value_item
)
{
float
*
update_value
=
update_values
[
value_item
];
const
float
*
push_value
=
push_values
[
value_item
];
float
push_show
=
push_value
[
DownpourCtrDoublePushValue
::
show_index
()];
float
push_click
=
push_value
[
DownpourCtrDoublePushValue
::
click_index
()];
float
slot
=
push_value
[
DownpourCtrDoublePushValue
::
slot_index
()];
*
(
double
*
)(
update_value
+
DownpourCtrDoubleFeatureValue
::
show_index
())
+=
(
double
)
push_show
;
*
(
double
*
)(
update_value
+
DownpourCtrDoubleFeatureValue
::
click_index
())
+=
(
double
)
push_click
;
update_value
[
DownpourCtrDoubleFeatureValue
::
slot_index
()]
=
slot
;
update_value
[
DownpourCtrDoubleFeatureValue
::
delta_score_index
()]
+=
(
push_show
-
push_click
)
*
_config
.
ctr_accessor_param
().
nonclk_coeff
()
+
push_click
*
_config
.
ctr_accessor_param
().
click_coeff
();
//(push_show - push_click) * _config.ctr_accessor_param().nonclk_coeff() +
// push_click * _config.ctr_accessor_param().click_coeff();
update_value
[
DownpourCtrDoubleFeatureValue
::
unseen_days_index
()]
=
0
;
_embed_sgd_rule
->
update_value
(
update_value
+
DownpourCtrDoubleFeatureValue
::
embed_w_index
(),
update_value
+
DownpourCtrDoubleFeatureValue
::
embed_g2sum_index
(),
push_value
+
DownpourCtrDoublePushValue
::
embed_g_index
(),
push_show
);
_embedx_sgd_rule
->
update_value
(
update_value
+
DownpourCtrDoubleFeatureValue
::
embedx_w_index
(),
update_value
+
DownpourCtrDoubleFeatureValue
::
embedx_g2sum_index
(),
push_value
+
DownpourCtrDoublePushValue
::
embedx_g_index
(),
push_show
);
}
return
0
;
}
bool
DownpourCtrDoubleAccessor
::
create_value
(
int
stage
,
const
float
*
value
)
{
// stage == 0, pull
// stage == 1, push
if
(
stage
==
0
)
{
return
true
;
}
else
if
(
stage
==
1
)
{
auto
show
=
DownpourCtrDoublePushValue
::
show
(
const_cast
<
float
*>
(
value
));
auto
click
=
DownpourCtrDoublePushValue
::
click
(
const_cast
<
float
*>
(
value
));
auto
score
=
show_click_score
(
show
,
click
);
if
(
score
<=
0
)
{
return
false
;
}
if
(
score
>=
1
)
{
return
true
;
}
return
local_uniform_real_distribution
<
float
>
()(
local_random_engine
())
<
score
;
}
else
{
return
true
;
}
}
double
DownpourCtrDoubleAccessor
::
show_click_score
(
double
show
,
double
click
)
{
// auto nonclk_coeff = _config.ctr_accessor_param().nonclk_coeff();
// auto click_coeff = _config.ctr_accessor_param().click_coeff();
auto
nonclk_coeff
=
_config
.
ctr_accessor_param
().
nonclk_coeff
();
auto
click_coeff
=
_config
.
ctr_accessor_param
().
click_coeff
();
return
(
show
-
click
)
*
nonclk_coeff
+
click
*
click_coeff
;
}
std
::
string
DownpourCtrDoubleAccessor
::
parse_to_string
(
const
float
*
v
,
int
param_size
)
{
thread_local
std
::
ostringstream
os
;
os
.
clear
();
os
.
str
(
""
);
os
<<
v
[
0
]
<<
" "
<<
v
[
1
]
<<
" "
<<
(
float
)((
double
*
)(
v
+
2
))[
0
]
<<
" "
<<
(
float
)((
double
*
)(
v
+
4
))[
0
]
<<
" "
<<
v
[
6
]
<<
" "
<<
v
[
7
]
<<
" "
<<
v
[
8
];
auto
show
=
DownpourCtrDoubleFeatureValue
::
show
(
const_cast
<
float
*>
(
v
));
auto
click
=
DownpourCtrDoubleFeatureValue
::
click
(
const_cast
<
float
*>
(
v
));
auto
score
=
show_click_score
(
show
,
click
);
if
(
score
>=
_config
.
embedx_threshold
()
&&
param_size
>
9
)
{
os
<<
" "
<<
v
[
9
];
for
(
auto
i
=
0
;
i
<
_config
.
embedx_dim
();
++
i
)
{
os
<<
" "
<<
v
[
10
+
i
];
}
}
return
os
.
str
();
}
int
DownpourCtrDoubleAccessor
::
parse_from_string
(
const
std
::
string
&
str
,
float
*
value
)
{
int
embedx_dim
=
_config
.
embedx_dim
();
float
data_buff
[
dim
()
+
2
];
float
*
data_buff_ptr
=
data_buff
;
_embedx_sgd_rule
->
init_value
(
data_buff_ptr
+
DownpourCtrDoubleFeatureValue
::
embedx_w_index
(),
data_buff_ptr
+
DownpourCtrDoubleFeatureValue
::
embedx_g2sum_index
());
auto
str_len
=
paddle
::
string
::
str_to_float
(
str
.
data
(),
data_buff_ptr
);
CHECK
(
str_len
>=
6
)
<<
"expect more than 6 real:"
<<
str_len
;
int
show_index
=
DownpourCtrDoubleFeatureValue
::
show_index
();
int
click_index
=
DownpourCtrDoubleFeatureValue
::
click_index
();
int
embed_w_index
=
DownpourCtrDoubleFeatureValue
::
embed_w_index
();
// no slot, embedx
int
value_dim
=
dim
();
int
embedx_g2sum_index
=
DownpourCtrDoubleFeatureValue
::
embedx_g2sum_index
();
value
[
DownpourCtrDoubleFeatureValue
::
slot_index
()]
=
-
1
;
// other case
if
(
str_len
==
(
value_dim
-
1
))
{
// copy unseen_days..delta_score
memcpy
(
value
,
data_buff_ptr
,
show_index
*
sizeof
(
float
));
// copy show & click
*
(
double
*
)(
value
+
show_index
)
=
(
double
)
data_buff_ptr
[
2
];
*
(
double
*
)(
value
+
click_index
)
=
(
double
)
data_buff_ptr
[
3
];
// copy others
value
[
DownpourCtrDoubleFeatureValue
::
embed_w_index
()]
=
data_buff_ptr
[
4
];
value
[
DownpourCtrDoubleFeatureValue
::
embed_g2sum_index
()]
=
data_buff_ptr
[
5
];
memcpy
(
value
+
embedx_g2sum_index
,
data_buff_ptr
+
6
,
(
embedx_dim
+
1
)
*
sizeof
(
float
));
}
else
{
// copy unseen_days..delta_score
memcpy
(
value
,
data_buff_ptr
,
show_index
*
sizeof
(
float
));
// copy show & click
*
(
double
*
)(
value
+
show_index
)
=
(
double
)
data_buff_ptr
[
2
];
*
(
double
*
)(
value
+
click_index
)
=
(
double
)
data_buff_ptr
[
3
];
// copy embed_w..embedx_w
memcpy
(
value
+
embed_w_index
,
data_buff_ptr
+
4
,
(
str_len
-
4
)
*
sizeof
(
float
));
}
if
(
str_len
==
(
value_dim
-
1
)
||
str_len
==
6
)
{
str_len
+=
1
;
}
return
str_len
+
2
;
}
}
// namespace distributed
}
// namespace paddle
paddle/fluid/distributed/ps/table/ctr_double_accessor.h
0 → 100644
浏览文件 @
6097aefb
// Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#include <stdint.h>
#include <stdio.h>
#include <vector>
#include "paddle/fluid/distributed/common/registerer.h"
#include "paddle/fluid/distributed/ps.pb.h"
#include "paddle/fluid/distributed/ps/table/accessor.h"
#include "paddle/fluid/distributed/ps/table/sparse_sgd_rule.h"
namespace
paddle
{
namespace
distributed
{
class
DownpourCtrDoubleAccessor
:
public
ValueAccessor
{
public:
struct
DownpourCtrDoubleFeatureValue
{
/*
float unseen_days;
float delta_score;
double show;
double click;
float embed_w;
float embed_g2sum;
float slot;
float embedx_g2sum;
std::vector<float> embedx_w;
*/
static
int
dim
(
int
embedx_dim
)
{
return
8
+
embedx_dim
;
}
static
int
dim_size
(
size_t
dim
,
int
embedx_dim
)
{
return
sizeof
(
float
);
}
static
int
size
(
int
embedx_dim
)
{
return
(
dim
(
embedx_dim
)
+
2
)
*
sizeof
(
float
);
}
static
int
unseen_days_index
()
{
return
0
;
}
static
int
delta_score_index
()
{
return
DownpourCtrDoubleFeatureValue
::
unseen_days_index
()
+
1
;
}
static
int
show_index
()
{
return
DownpourCtrDoubleFeatureValue
::
delta_score_index
()
+
1
;
}
// show is double
static
int
click_index
()
{
return
DownpourCtrDoubleFeatureValue
::
show_index
()
+
2
;
}
// click is double
static
int
embed_w_index
()
{
return
DownpourCtrDoubleFeatureValue
::
click_index
()
+
2
;
}
static
int
embed_g2sum_index
()
{
return
DownpourCtrDoubleFeatureValue
::
embed_w_index
()
+
1
;
}
static
int
slot_index
()
{
return
DownpourCtrDoubleFeatureValue
::
embed_g2sum_index
()
+
1
;
}
static
int
embedx_g2sum_index
()
{
return
DownpourCtrDoubleFeatureValue
::
slot_index
()
+
1
;
}
static
int
embedx_w_index
()
{
return
DownpourCtrDoubleFeatureValue
::
embedx_g2sum_index
()
+
1
;
}
static
float
&
unseen_days
(
float
*
val
)
{
return
val
[
DownpourCtrDoubleFeatureValue
::
unseen_days_index
()];
}
static
float
&
delta_score
(
float
*
val
)
{
return
val
[
DownpourCtrDoubleFeatureValue
::
delta_score_index
()];
}
static
double
&
show
(
float
*
val
)
{
return
((
double
*
)(
val
+
DownpourCtrDoubleFeatureValue
::
show_index
()))[
0
];
}
static
double
&
click
(
float
*
val
)
{
return
((
double
*
)(
val
+
DownpourCtrDoubleFeatureValue
::
click_index
()))[
0
];
}
static
float
&
slot
(
float
*
val
)
{
return
val
[
DownpourCtrDoubleFeatureValue
::
slot_index
()];
}
static
float
&
embed_w
(
float
*
val
)
{
return
val
[
DownpourCtrDoubleFeatureValue
::
embed_w_index
()];
}
static
float
&
embed_g2sum
(
float
*
val
)
{
return
val
[
DownpourCtrDoubleFeatureValue
::
embed_g2sum_index
()];
}
static
float
&
embedx_g2sum
(
float
*
val
)
{
return
val
[
DownpourCtrDoubleFeatureValue
::
embedx_g2sum_index
()];
}
static
float
*
embedx_w
(
float
*
val
)
{
return
(
val
+
DownpourCtrDoubleFeatureValue
::
embedx_w_index
());
}
};
struct
DownpourCtrDoublePushValue
{
/*
float slot;
float show;
float click;
float embed_g;
std::vector<float> embedx_g;
*/
static
int
dim
(
int
embedx_dim
)
{
return
4
+
embedx_dim
;
}
static
int
dim_size
(
int
dim
,
int
embedx_dim
)
{
return
sizeof
(
float
);
}
static
int
size
(
int
embedx_dim
)
{
return
dim
(
embedx_dim
)
*
sizeof
(
float
);
}
static
int
slot_index
()
{
return
0
;
}
static
int
show_index
()
{
return
DownpourCtrDoublePushValue
::
slot_index
()
+
1
;
}
static
int
click_index
()
{
return
DownpourCtrDoublePushValue
::
show_index
()
+
1
;
}
static
int
embed_g_index
()
{
return
DownpourCtrDoublePushValue
::
click_index
()
+
1
;
}
static
int
embedx_g_index
()
{
return
DownpourCtrDoublePushValue
::
embed_g_index
()
+
1
;
}
static
float
&
slot
(
float
*
val
)
{
return
val
[
DownpourCtrDoublePushValue
::
slot_index
()];
}
static
float
&
show
(
float
*
val
)
{
return
val
[
DownpourCtrDoublePushValue
::
show_index
()];
}
static
float
&
click
(
float
*
val
)
{
return
val
[
DownpourCtrDoublePushValue
::
click_index
()];
}
static
float
&
embed_g
(
float
*
val
)
{
return
val
[
DownpourCtrDoublePushValue
::
embed_g_index
()];
}
static
float
*
embedx_g
(
float
*
val
)
{
return
val
+
DownpourCtrDoublePushValue
::
embedx_g_index
();
}
};
struct
DownpourCtrDoublePullValue
{
/*
float show;
float click;
float embed_w;
std::vector<float> embedx_w;
*/
static
int
dim
(
int
embedx_dim
)
{
return
3
+
embedx_dim
;
}
static
int
dim_size
(
size_t
dim
)
{
return
sizeof
(
float
);
}
static
int
size
(
int
embedx_dim
)
{
return
dim
(
embedx_dim
)
*
sizeof
(
float
);
}
static
int
show_index
()
{
return
0
;
}
static
int
click_index
()
{
return
1
;
}
static
int
embed_w_index
()
{
return
2
;
}
static
int
embedx_w_index
()
{
return
3
;
}
static
float
&
show
(
float
*
val
)
{
return
val
[
DownpourCtrDoublePullValue
::
show_index
()];
}
static
float
&
click
(
float
*
val
)
{
return
val
[
DownpourCtrDoublePullValue
::
click_index
()];
}
static
float
&
embed_w
(
float
*
val
)
{
return
val
[
DownpourCtrDoublePullValue
::
embed_w_index
()];
}
static
float
*
embedx_w
(
float
*
val
)
{
return
val
+
DownpourCtrDoublePullValue
::
embedx_w_index
();
}
};
DownpourCtrDoubleAccessor
()
{}
virtual
~
DownpourCtrDoubleAccessor
()
{}
virtual
int
initialize
();
// value维度
virtual
size_t
dim
();
// value各个维度的size
virtual
size_t
dim_size
(
size_t
dim
);
// value各维度相加总size
virtual
size_t
size
();
// value中mf动态长度部分总size大小, sparse下生效
virtual
size_t
mf_size
();
// pull value维度
virtual
size_t
select_dim
();
// pull value各个维度的size
virtual
size_t
select_dim_size
(
size_t
dim
);
// pull value各维度相加总size
virtual
size_t
select_size
();
// push value维度
virtual
size_t
update_dim
();
// push value各个维度的size
virtual
size_t
update_dim_size
(
size_t
dim
);
// push value各维度相加总size
virtual
size_t
update_size
();
// 判断该value是否进行shrink
virtual
bool
shrink
(
float
*
value
);
virtual
bool
need_extend_mf
(
float
*
value
);
// 判断该value是否在save阶段dump,
// param作为参数用于标识save阶段,如downpour的xbox与batch_model
// param = 0, save all feature
// param = 1, save delta feature
// param = 3, save all feature with time decay
virtual
bool
save
(
float
*
value
,
int
param
)
override
;
// update delta_score and unseen_days after save
virtual
void
update_stat_after_save
(
float
*
value
,
int
param
)
override
;
// 判断该value是否保存到ssd
virtual
bool
save_ssd
(
float
*
value
);
// virtual bool save_cache(float* value, int param, double
// global_cache_threshold) override;
// keys不存在时,为values生成随机值
// 要求value的内存由外部调用者分配完毕
virtual
int32_t
create
(
float
**
value
,
size_t
num
);
// 从values中选取到select_values中
virtual
int32_t
select
(
float
**
select_values
,
const
float
**
values
,
size_t
num
);
// 将update_values聚合到一起
virtual
int32_t
merge
(
float
**
update_values
,
const
float
**
other_update_values
,
size_t
num
);
// 将update_values聚合到一起,通过it.next判定是否进入下一个key
// virtual int32_t merge(float** update_values, iterator it);
// 将update_values更新应用到values中
virtual
int32_t
update
(
float
**
values
,
const
float
**
update_values
,
size_t
num
);
virtual
std
::
string
parse_to_string
(
const
float
*
value
,
int
param
)
override
;
virtual
int32_t
parse_from_string
(
const
std
::
string
&
str
,
float
*
v
)
override
;
virtual
bool
create_value
(
int
type
,
const
float
*
value
);
//这个接口目前只用来取show
virtual
float
get_field
(
float
*
value
,
const
std
::
string
&
name
)
override
{
CHECK
(
name
==
"show"
);
if
(
name
==
"show"
)
{
return
(
float
)
DownpourCtrDoubleFeatureValue
::
show
(
value
);
}
return
0.0
;
}
// DEFINE_GET_INDEX(DownpourCtrDoubleFeatureValue, show)
// DEFINE_GET_INDEX(DownpourCtrDoubleFeatureValue, click)
// DEFINE_GET_INDEX(DownpourCtrDoubleFeatureValue, embed_w)
// DEFINE_GET_INDEX(DownpourCtrDoubleFeatureValue, embedx_w)
private:
double
show_click_score
(
double
show
,
double
click
);
private:
SparseValueSGDRule
*
_embed_sgd_rule
;
SparseValueSGDRule
*
_embedx_sgd_rule
;
float
_show_click_decay_rate
;
int32_t
_ssd_unseenday_threshold
;
};
}
// namespace distributed
}
// namespace paddle
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录