Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MindSpore
mindspore
提交
12ff0be5
M
mindspore
项目概览
MindSpore
/
mindspore
通知
35
Star
15
Fork
15
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
mindspore
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
12ff0be5
编写于
9月 04, 2020
作者:
M
mindspore-ci-bot
提交者:
Gitee
9月 04, 2020
浏览文件
操作
浏览文件
下载
差异文件
!5716 Unify float to int cast and get initial accum for ps ftrl.
Merge pull request !5716 from ZPaC/master-unify-float-to-int-cast
上级
d76ac7c6
997304e2
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
32 addition
and
35 deletion
+32
-35
mindspore/ccsrc/backend/kernel_compiler/cpu/ps/sparse_apply_ftrl_ps_kernel.cc
...end/kernel_compiler/cpu/ps/sparse_apply_ftrl_ps_kernel.cc
+4
-0
mindspore/ccsrc/backend/kernel_compiler/cpu/ps/sparse_apply_ftrl_ps_kernel.h
...kend/kernel_compiler/cpu/ps/sparse_apply_ftrl_ps_kernel.h
+3
-1
mindspore/ccsrc/frontend/parallel/ps/optimizer_info.cc
mindspore/ccsrc/frontend/parallel/ps/optimizer_info.cc
+3
-8
mindspore/ccsrc/frontend/parallel/ps/optimizer_info_builder.cc
...pore/ccsrc/frontend/parallel/ps/optimizer_info_builder.cc
+12
-17
mindspore/ccsrc/frontend/parallel/ps/optimizer_info_builder.h
...spore/ccsrc/frontend/parallel/ps/optimizer_info_builder.h
+8
-4
mindspore/ccsrc/frontend/parallel/ps/worker_proxy.h
mindspore/ccsrc/frontend/parallel/ps/worker_proxy.h
+1
-5
mindspore/nn/optim/ftrl.py
mindspore/nn/optim/ftrl.py
+1
-0
未找到文件。
mindspore/ccsrc/backend/kernel_compiler/cpu/ps/sparse_apply_ftrl_ps_kernel.cc
浏览文件 @
12ff0be5
...
...
@@ -48,6 +48,10 @@ void SparseApplyFtrlPSKernel::InitKernel(
if
(
grad_shape
[
0
]
!=
indices_size_
)
{
MS_LOG
(
EXCEPTION
)
<<
"The first dimension of grad shape must be equal to indices"
;
}
init_accum_
=
AnfAlgo
::
GetNodeAttr
<
float
>
(
cnode
,
"init_accum"
);
if
(
init_accum_
<
0
)
{
MS_LOG
(
EXCEPTION
)
<<
"init_accum should be a non-negative scalar"
;
}
lr_
=
AnfAlgo
::
GetNodeAttr
<
float
>
(
cnode
,
"lr"
);
if
(
lr_
<=
0
)
{
MS_LOG
(
EXCEPTION
)
<<
"lr should be a positive scalar"
;
...
...
mindspore/ccsrc/backend/kernel_compiler/cpu/ps/sparse_apply_ftrl_ps_kernel.h
浏览文件 @
12ff0be5
...
...
@@ -28,7 +28,7 @@ using mindspore::kernel::SparseApplyFtrlCPUKernel;
class
SparseApplyFtrlPSKernel
:
public
SparseApplyFtrlCPUKernel
,
public
PServerKernel
{
public:
SparseApplyFtrlPSKernel
(
size_t
rank_id
,
size_t
pserver_num
,
size_t
worker_num
)
:
PServerKernel
(
rank_id
,
pserver_num
,
worker_num
)
{}
:
PServerKernel
(
rank_id
,
pserver_num
,
worker_num
)
,
init_accum_
(
0.1
)
{}
~
SparseApplyFtrlPSKernel
()
override
=
default
;
void
InitKernel
(
const
CNodePtr
&
cnode
,
...
...
@@ -41,9 +41,11 @@ class SparseApplyFtrlPSKernel : public SparseApplyFtrlCPUKernel, public PServerK
const
std
::
vector
<
size_t
>
&
input_sizes
()
const
override
;
const
std
::
vector
<
size_t
>
&
output_sizes
()
const
override
;
const
std
::
vector
<
size_t
>
&
workspace_sizes
()
const
override
;
const
float
init_accum
()
const
{
return
init_accum_
;
}
protected:
void
ReInit
(
const
std
::
vector
<
AddressPtr
>
&
)
override
;
float
init_accum_
;
};
}
// namespace ps
}
// namespace kernel
...
...
mindspore/ccsrc/frontend/parallel/ps/optimizer_info.cc
浏览文件 @
12ff0be5
...
...
@@ -100,16 +100,11 @@ void SparseOptimInfo::Accumulate(const Values &values, const Lengths &lengths) {
for
(
size_t
i
=
0
;
i
<
indices_index
;
i
++
)
{
indice_offset
+=
lengths
[
i
];
}
float
*
incr_indice_data
=
values
.
data
(
)
+
indice_offset
;
int
*
incr_indice_data
=
reinterpret_cast
<
int
*>
(
values
.
data
()
)
+
indice_offset
;
size_t
incr_indice_size
=
lengths
[
indices_index
];
size_t
incr_indice_data_size
=
incr_indice_size
*
sizeof
(
int
);
std
::
vector
<
int
>
converted_indices
(
incr_indice_size
);
for
(
size_t
i
=
0
;
i
<
incr_indice_size
;
i
++
)
{
converted_indices
[
i
]
=
static_cast
<
int
>
(
incr_indice_data
[
i
]);
}
auto
ret2
=
memcpy_s
(
accum_indices_data
+
indices_offset_
,
incr_indice_data_size
,
converted_indices
.
data
(),
incr_indice_data_size
);
auto
ret2
=
memcpy_s
(
accum_indices_data
+
indices_offset_
,
incr_indice_data_size
,
incr_indice_data
,
incr_indice_data_size
);
if
(
ret2
!=
0
)
{
MS_LOG
(
EXCEPTION
)
<<
"memcpy_s error, errorno("
<<
ret2
<<
")"
;
}
...
...
mindspore/ccsrc/frontend/parallel/ps/optimizer_info_builder.cc
浏览文件 @
12ff0be5
...
...
@@ -18,14 +18,16 @@
#include <vector>
#include <memory>
#include <functional>
#include "backend/kernel_compiler/cpu/ps/sparse_apply_ftrl_ps_kernel.h"
namespace
mindspore
{
namespace
parallel
{
namespace
ps
{
using
mindspore
::
kernel
::
ps
::
SparseApplyFtrlPSKernel
;
OptimizerInfo
*
OptimizerInfoBuilder
::
Build
(
const
std
::
shared_ptr
<
PServerKernel
>
&
pserver_kernel
,
const
WeightPtr
&
weight
,
const
Keys
&
keys
,
const
Values
&
values
,
const
Lengths
&
lens
,
const
InputsShapePtr
&
inputs_shape
,
size_t
worker_num
)
{
OptimizerInfo
*
optim_info
=
BuildInputs
(
weight
,
keys
,
values
,
lens
,
inputs_shape
,
worker_num
);
OptimizerInfo
*
optim_info
=
BuildInputs
(
weight
,
keys
,
values
,
lens
,
inputs_shape
,
worker_num
,
pserver_kernel
);
std
::
vector
<
size_t
>
ws_sizes
=
pserver_kernel
->
workspace_sizes
();
BuildWorkspaces
(
optim_info
,
ws_sizes
,
worker_num
);
BuildOutputs
(
optim_info
,
worker_num
);
...
...
@@ -45,7 +47,7 @@ void OptimizerInfoBuilder::BuildWorkspaces(OptimizerInfo *info, const std::vecto
OptimizerInfo
*
MomentumOptimInfoBuilder
::
BuildInputs
(
const
WeightPtr
&
weight
,
const
Keys
&
keys
,
const
Values
&
values
,
const
Lengths
&
lens
,
const
InputsShapePtr
&
inputs_shape
,
size_t
worker_num
)
{
size_t
worker_num
,
const
std
::
shared_ptr
<
PServerKernel
>
&
)
{
AddressPtr
weight_addr
=
std
::
make_shared
<
kernel
::
Address
>
();
weight_addr
->
addr
=
weight
->
data
();
weight_addr
->
size
=
weight
->
size
()
*
sizeof
(
float
);
...
...
@@ -74,7 +76,7 @@ OptimizerInfo *MomentumOptimInfoBuilder::BuildInputs(const WeightPtr &weight, co
OptimizerInfo
*
SparseAdamOptimInfoBuilder
::
BuildInputs
(
const
WeightPtr
&
weight
,
const
Keys
&
keys
,
const
Values
&
values
,
const
Lengths
&
lens
,
const
InputsShapePtr
&
inputs_shape
,
size_t
worker_num
)
{
size_t
worker_num
,
const
std
::
shared_ptr
<
PServerKernel
>
&
)
{
AddressPtr
weight_addr
=
std
::
make_shared
<
kernel
::
Address
>
();
weight_addr
->
addr
=
weight
->
data
();
weight_addr
->
size
=
weight
->
size
()
*
sizeof
(
float
);
...
...
@@ -140,13 +142,9 @@ OptimizerInfo *SparseAdamOptimInfoBuilder::BuildInputs(const WeightPtr &weight,
std
::
accumulate
((
*
indices_shape
).
begin
(),
(
*
indices_shape
).
end
(),
sizeof
(
int
),
std
::
multiplies
<
size_t
>
());
AddressPtr
indices
=
std
::
make_shared
<
kernel
::
Address
>
();
indices
->
addr
=
new
int
[
total_indice_size
*
worker_num
];
std
::
vector
<
int
>
converted_indices
(
lens
[
7
]);
size_t
indices_data_size
=
lens
[
7
]
*
sizeof
(
int
);
float
*
indices_data
=
reinterpret_cast
<
float
*>
(
epsilon
->
addr
)
+
lens
[
5
]
+
lens
[
6
];
for
(
int
i
=
0
;
i
<
lens
[
7
];
i
++
)
{
converted_indices
[
i
]
=
static_cast
<
int
>
(
indices_data
[
i
]);
}
ret
=
memcpy_s
(
indices
->
addr
,
indices_data_size
,
converted_indices
.
data
(),
indices_data_size
);
int
*
indices_data
=
reinterpret_cast
<
int
*>
(
epsilon
->
addr
)
+
lens
[
5
]
+
lens
[
6
];
ret
=
memcpy_s
(
indices
->
addr
,
indices_data_size
,
indices_data
,
indices_data_size
);
if
(
ret
!=
0
)
{
MS_LOG
(
EXCEPTION
)
<<
"memcpy_s error, errorno("
<<
ret
<<
")"
;
}
...
...
@@ -158,7 +156,8 @@ OptimizerInfo *SparseAdamOptimInfoBuilder::BuildInputs(const WeightPtr &weight,
OptimizerInfo
*
SparseFtrlOptimInfoBuilder
::
BuildInputs
(
const
WeightPtr
&
weight
,
const
Keys
&
keys
,
const
Values
&
values
,
const
Lengths
&
lens
,
const
InputsShapePtr
&
inputs_shape
,
size_t
worker_num
)
{
size_t
worker_num
,
const
std
::
shared_ptr
<
PServerKernel
>
&
pserver_kernel
)
{
AddressPtr
weight_addr
=
std
::
make_shared
<
kernel
::
Address
>
();
weight_addr
->
addr
=
weight
->
data
();
weight_addr
->
size
=
weight
->
size
()
*
sizeof
(
float
);
...
...
@@ -167,7 +166,7 @@ OptimizerInfo *SparseFtrlOptimInfoBuilder::BuildInputs(const WeightPtr &weight,
accum
->
size
=
weight
->
size
()
*
sizeof
(
float
);
for
(
size_t
i
=
0
;
i
<
weight
->
size
();
i
++
)
{
float
*
tmp
=
reinterpret_cast
<
float
*>
(
accum
->
addr
);
tmp
[
i
]
=
1.0
;
tmp
[
i
]
=
std
::
dynamic_pointer_cast
<
SparseApplyFtrlPSKernel
>
(
pserver_kernel
)
->
init_accum
()
;
}
AddressPtr
linear
=
std
::
make_shared
<
kernel
::
Address
>
();
linear
->
addr
=
new
float
[
weight
->
size
()];
...
...
@@ -192,13 +191,9 @@ OptimizerInfo *SparseFtrlOptimInfoBuilder::BuildInputs(const WeightPtr &weight,
std
::
accumulate
((
*
indices_shape
).
begin
(),
(
*
indices_shape
).
end
(),
1
,
std
::
multiplies
<
size_t
>
());
AddressPtr
indices
=
std
::
make_shared
<
kernel
::
Address
>
();
indices
->
addr
=
new
int
[
total_indice_size
*
worker_num
];
std
::
vector
<
int
>
converted_indices
(
lens
[
1
]);
size_t
indices_data_size
=
lens
[
1
]
*
sizeof
(
int
);
float
*
indices_data
=
reinterpret_cast
<
float
*>
(
values
.
data
())
+
lens
[
0
];
for
(
int
i
=
0
;
i
<
lens
[
1
];
i
++
)
{
converted_indices
[
i
]
=
static_cast
<
int
>
(
indices_data
[
i
]);
}
ret
=
memcpy_s
(
indices
->
addr
,
indices_data_size
,
converted_indices
.
data
(),
indices_data_size
);
int
*
indices_data
=
reinterpret_cast
<
int
*>
(
values
.
data
())
+
lens
[
0
];
ret
=
memcpy_s
(
indices
->
addr
,
indices_data_size
,
indices_data
,
indices_data_size
);
if
(
ret
!=
0
)
{
MS_LOG
(
EXCEPTION
)
<<
"memcpy_s error, errorno("
<<
ret
<<
")"
;
}
...
...
mindspore/ccsrc/frontend/parallel/ps/optimizer_info_builder.h
浏览文件 @
12ff0be5
...
...
@@ -38,7 +38,8 @@ class OptimizerInfoBuilder {
size_t
worker_num
);
virtual
OptimizerInfo
*
BuildInputs
(
const
WeightPtr
&
weight
,
const
Keys
&
keys
,
const
Values
&
values
,
const
Lengths
&
lens
,
const
InputsShapePtr
&
inputs_shape
,
size_t
worker_num
)
=
0
;
const
Lengths
&
lens
,
const
InputsShapePtr
&
inputs_shape
,
size_t
worker_num
,
const
std
::
shared_ptr
<
PServerKernel
>
&
pserver_kernel
)
=
0
;
virtual
void
BuildWorkspaces
(
OptimizerInfo
*
info
,
const
std
::
vector
<
size_t
>
&
ws_sizes
,
size_t
worker_num
);
virtual
void
BuildOutputs
(
OptimizerInfo
*
info
,
size_t
worker_num
)
{}
...
...
@@ -47,19 +48,22 @@ class OptimizerInfoBuilder {
class
MomentumOptimInfoBuilder
:
public
OptimizerInfoBuilder
{
public:
OptimizerInfo
*
BuildInputs
(
const
WeightPtr
&
weight
,
const
Keys
&
keys
,
const
Values
&
values
,
const
Lengths
&
lens
,
const
InputsShapePtr
&
inputs_shape
,
size_t
worker_num
)
override
;
const
InputsShapePtr
&
inputs_shape
,
size_t
worker_num
,
const
std
::
shared_ptr
<
PServerKernel
>
&
pserver_kernel
)
override
;
};
class
SparseAdamOptimInfoBuilder
:
public
OptimizerInfoBuilder
{
public:
OptimizerInfo
*
BuildInputs
(
const
WeightPtr
&
weight
,
const
Keys
&
keys
,
const
Values
&
values
,
const
Lengths
&
lens
,
const
InputsShapePtr
&
inputs_shpae
,
size_t
worker_num
)
override
;
const
InputsShapePtr
&
inputs_shpae
,
size_t
worker_num
,
const
std
::
shared_ptr
<
PServerKernel
>
&
pserver_kernel
)
override
;
};
class
SparseFtrlOptimInfoBuilder
:
public
OptimizerInfoBuilder
{
public:
OptimizerInfo
*
BuildInputs
(
const
WeightPtr
&
weight
,
const
Keys
&
keys
,
const
Values
&
values
,
const
Lengths
&
lens
,
const
InputsShapePtr
&
inputs_shpae
,
size_t
worker_num
)
override
;
const
InputsShapePtr
&
inputs_shpae
,
size_t
worker_num
,
const
std
::
shared_ptr
<
PServerKernel
>
&
pserver_kernel
)
override
;
};
}
// namespace ps
}
// namespace parallel
...
...
mindspore/ccsrc/frontend/parallel/ps/worker_proxy.h
浏览文件 @
12ff0be5
...
...
@@ -571,11 +571,7 @@ void WorkerProxy<T>::BuildSparseValue(const ::ps::SArray<int> &lengths, const si
int
indice_offset
=
grad_offset
+
lengths
[
grad_index
];
data_size
=
lengths
[
indice_index
]
*
sizeof
(
T
);
T
*
indice_data
=
reduced_data
->
data
()
+
indice_offset
;
std
::
vector
<
T
>
convert
(
lengths
[
indice_index
]);
for
(
int
i
=
0
;
i
<
lengths
[
indice_index
];
i
++
)
{
convert
[
i
]
=
static_cast
<
T
>
(
indices
[
i
]);
}
ret
=
memcpy_s
(
indice_data
,
data_size
,
convert
.
data
(),
data_size
);
ret
=
memcpy_s
(
indice_data
,
data_size
,
indices
,
data_size
);
if
(
ret
!=
0
)
{
MS_LOG
(
EXCEPTION
)
<<
"memcpy_s error, errorno("
<<
ret
<<
")"
;
}
...
...
mindspore/nn/optim/ftrl.py
浏览文件 @
12ff0be5
...
...
@@ -162,6 +162,7 @@ class FTRL(Optimizer):
self
.
sparse_opt
=
P
.
FusedSparseFtrl
(
learning_rate
,
l1
,
l2
,
lr_power
,
use_locking
=
use_locking
)
self
.
_ps_pull
=
P
.
Pull
()
self
.
_ps_push
=
P
.
Push
(
"Ftrl"
,
[
0
,
1
,
2
])
self
.
_ps_push
.
add_prim_attr
(
"init_accum"
,
initial_accum
)
self
.
_ps_push
.
add_prim_attr
(
"lr"
,
learning_rate
)
self
.
_ps_push
.
add_prim_attr
(
"l1"
,
l1
)
self
.
_ps_push
.
add_prim_attr
(
"l2"
,
l2
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录