Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
机器未来
Paddle
提交
f49fda5e
P
Paddle
项目概览
机器未来
/
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看板
提交
f49fda5e
编写于
7月 13, 2017
作者:
H
helinwang
提交者:
GitHub
7月 13, 2017
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #2855 from helinwang/issue/2854
Fix optimizer parameter buffer allocation size.
上级
bb8ac28b
777a5cca
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
102 addition
and
48 deletion
+102
-48
go/pserver/client/client_test.go
go/pserver/client/client_test.go
+75
-28
go/pserver/optimizer.go
go/pserver/optimizer.go
+8
-2
go/pserver/service_test.go
go/pserver/service_test.go
+15
-15
paddle/optimizer/optimizer.cc
paddle/optimizer/optimizer.cc
+4
-3
未找到文件。
go/pserver/client/client_test.go
浏览文件 @
f49fda5e
...
...
@@ -3,11 +3,13 @@ package client_test
import
(
"context"
"io/ioutil"
"math/rand"
"net"
"net/http"
"net/rpc"
"strconv"
"strings"
"sync"
"testing"
"time"
...
...
@@ -100,27 +102,34 @@ func (l lister) List() []client.Server {
return
l
}
func
ClientTes
t
(
t
*
testing
.
T
,
c
*
client
.
Client
)
{
func
testClien
t
(
t
*
testing
.
T
,
c
*
client
.
Client
)
{
selected
:=
c
.
BeginInitParams
()
if
!
selected
{
t
.
Fatal
(
"should be selected."
)
}
const
numParameter
=
100
const
numParameter
=
100
0
config
,
err
:=
ioutil
.
ReadFile
(
"./c/test/testdata/optimizer.pb"
)
if
err
!=
nil
{
t
.
Fatalf
(
"read optimizer proto failed"
)
}
var
wg
sync
.
WaitGroup
for
i
:=
0
;
i
<
numParameter
;
i
++
{
var
p
pserver
.
Parameter
p
.
Name
=
"p_"
+
strconv
.
Itoa
(
i
)
p
.
ElementType
=
pserver
.
Float32
p
.
Content
=
make
([]
byte
,
(
i
+
1
)
*
100
)
err
:=
c
.
InitParam
(
pserver
.
ParameterWithConfig
{
Param
:
p
,
Config
:
config
})
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
wg
.
Add
(
1
)
go
func
(
i
int
)
{
var
p
pserver
.
Parameter
p
.
Name
=
"p_"
+
strconv
.
Itoa
(
i
)
p
.
ElementType
=
pserver
.
Float32
p
.
Content
=
make
([]
byte
,
(
i
+
1
)
*
100
)
err
:=
c
.
InitParam
(
pserver
.
ParameterWithConfig
{
Param
:
p
,
Config
:
config
})
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
wg
.
Done
()
}(
i
)
}
wg
.
Wait
()
err
=
c
.
FinishInitParams
()
if
err
!=
nil
{
...
...
@@ -128,7 +137,7 @@ func ClientTest(t *testing.T, c *client.Client) {
}
var
grads
[]
pserver
.
Gradient
for
i
:=
0
;
i
<
numParameter
/
2
;
i
++
{
for
i
:=
0
;
i
<
numParameter
;
i
++
{
var
g
pserver
.
Gradient
g
.
Name
=
"p_"
+
strconv
.
Itoa
(
i
)
g
.
ElementType
=
pserver
.
Float32
...
...
@@ -136,9 +145,31 @@ func ClientTest(t *testing.T, c *client.Client) {
grads
=
append
(
grads
,
g
)
}
err
=
c
.
SendGrads
(
grads
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
const
paramPerGroup
=
10
const
numGroups
=
numParameter
/
paramPerGroup
// shuffle send grads order
for
i
:=
range
grads
{
j
:=
rand
.
Intn
(
i
+
1
)
grads
[
i
],
grads
[
j
]
=
grads
[
j
],
grads
[
i
]
}
for
i
:=
0
;
i
<
numGroups
;
i
++
{
var
gs
[]
pserver
.
Gradient
if
i
==
numGroups
-
1
{
gs
=
grads
[
i
*
paramPerGroup
:
]
}
else
{
gs
=
grads
[
i
*
paramPerGroup
:
(
i
+
1
)
*
paramPerGroup
]
}
wg
.
Add
(
1
)
go
func
(
gs
[]
pserver
.
Gradient
)
{
err
=
c
.
SendGrads
(
gs
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
wg
.
Done
()
}(
gs
)
}
names
:=
make
([]
string
,
numParameter
)
...
...
@@ -146,20 +177,35 @@ func ClientTest(t *testing.T, c *client.Client) {
names
[
i
]
=
"p_"
+
strconv
.
Itoa
(
i
)
}
params
,
err
:=
c
.
GetParams
(
names
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
for
i
:=
0
;
i
<
numGroups
;
i
++
{
var
ns
[]
string
if
i
==
numGroups
-
1
{
ns
=
names
[
i
*
paramPerGroup
:
]
}
else
{
ns
=
names
[
i
*
paramPerGroup
:
(
i
+
1
)
*
paramPerGroup
]
}
if
len
(
names
)
!=
len
(
params
)
{
t
.
Fatalf
(
"parameter size not match, need: %d, have: %d"
,
len
(
names
),
len
(
params
))
}
wg
.
Add
(
1
)
go
func
(
ns
[]
string
)
{
params
,
err
:=
c
.
GetParams
(
ns
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
for
i
:=
range
params
{
if
names
[
i
]
!=
params
[
i
]
.
Name
{
t
.
Fatalf
(
"order of returned parameter does not required: parameter name: %s, required name: %s"
,
names
[
i
],
params
[
i
]
.
Name
)
}
if
len
(
ns
)
!=
len
(
params
)
{
t
.
Fatalf
(
"parameter size not match, need: %d, have: %d"
,
len
(
names
),
len
(
params
))
}
for
i
:=
range
params
{
if
ns
[
i
]
!=
params
[
i
]
.
Name
{
t
.
Fatalf
(
"order of returned parameter does not required: parameter name: %s, required name: %s"
,
ns
[
i
],
params
[
i
]
.
Name
)
}
}
wg
.
Done
()
}(
ns
)
}
wg
.
Wait
()
}
func
TestNativeClient
(
t
*
testing
.
T
)
{
...
...
@@ -169,13 +215,14 @@ func TestNativeClient(t *testing.T) {
servers
[
i
]
=
client
.
Server
{
Index
:
i
,
Addr
:
":"
+
strconv
.
Itoa
(
pserverClientPorts
[
i
])}
}
c1
:=
client
.
NewClient
(
lister
(
servers
),
len
(
servers
),
selector
(
true
))
ClientTes
t
(
t
,
c1
)
testClien
t
(
t
,
c1
)
}
// TODO: tmperary disable etcdClient test for dependency of etcd)
// EtcdClient is a disabled test, since we have not embedded etcd into
// our test.
func
EtcdClient
(
t
*
testing
.
T
)
{
initEtcdClient
()
etcdClient
:=
client
.
NewEtcd
(
etcdEndpoints
)
c2
:=
client
.
NewClient
(
etcdClient
,
etcdClient
.
Desired
(),
selector
(
true
))
ClientTes
t
(
t
,
c2
)
testClien
t
(
t
,
c2
)
}
go/pserver/optimizer.go
浏览文件 @
f49fda5e
...
...
@@ -19,6 +19,7 @@ var nullPtr = unsafe.Pointer(uintptr(0))
type
optimizer
struct
{
opt
*
C
.
struct_paddle_optimizer
elementType
ElementType
contentLen
int
}
func
cArrayToSlice
(
p
unsafe
.
Pointer
,
len
int
)
[]
byte
{
...
...
@@ -37,10 +38,11 @@ func cArrayToSlice(p unsafe.Pointer, len int) []byte {
func
newOptimizer
(
paramWithConfigs
ParameterWithConfig
,
State
[]
byte
)
*
optimizer
{
o
:=
&
optimizer
{}
o
.
elementType
=
paramWithConfigs
.
Param
.
ElementType
o
.
contentLen
=
len
(
paramWithConfigs
.
Param
.
Content
)
p
:=
paramWithConfigs
.
Param
c
:=
paramWithConfigs
.
Config
s
:=
State
paramBufferSize
:=
C
.
size_t
(
len
(
p
.
Content
)
/
C
.
sizeof_float
)
paramBufferSize
:=
C
.
size_t
(
len
(
p
.
Content
))
log
.
WithFields
(
log
.
Fields
{
"ElementType"
:
p
.
ElementType
,
"ParamSize"
:
paramBufferSize
,
...
...
@@ -78,7 +80,11 @@ func (o *optimizer) UpdateParameter(g Gradient) error {
return
fmt
.
Errorf
(
"Name: %s, parameter and gradient element type not match, parameter: %v, gradient: %v"
,
g
.
Name
,
o
.
elementType
,
g
.
ElementType
)
}
r
:=
C
.
paddle_update_parameter
(
o
.
opt
,
C
.
paddle_element_type
(
g
.
ElementType
),
unsafe
.
Pointer
(
&
g
.
Content
[
0
]),
C
.
int
(
len
(
g
.
Content
))
/
C
.
sizeof_float
)
if
o
.
contentLen
!=
len
(
g
.
Content
)
{
return
fmt
.
Errorf
(
"Name: %s, parameter and gradient does not have same content len, parameter: %d, gradient: %d"
,
g
.
Name
,
o
.
contentLen
,
len
(
g
.
Content
))
}
r
:=
C
.
paddle_update_parameter
(
o
.
opt
,
C
.
paddle_element_type
(
g
.
ElementType
),
unsafe
.
Pointer
(
&
g
.
Content
[
0
]),
C
.
int
(
len
(
g
.
Content
)))
if
r
!=
0
{
return
fmt
.
Errorf
(
"optimizer update returned error code: %d"
,
r
)
}
...
...
go/pserver/service_test.go
浏览文件 @
f49fda5e
...
...
@@ -31,7 +31,7 @@ func TestServiceFull(t *testing.T) {
err
=
s
.
InitParam
(
pserver
.
ParameterWithConfig
{
Param
:
p
,
Config
:
config
},
nil
)
if
err
!=
nil
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
err
)
}
var
p1
pserver
.
Parameter
...
...
@@ -40,40 +40,40 @@ func TestServiceFull(t *testing.T) {
p1
.
ElementType
=
pserver
.
Float32
err
=
s
.
InitParam
(
pserver
.
ParameterWithConfig
{
Param
:
p1
,
Config
:
config
},
nil
)
if
err
!=
nil
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
err
)
}
err
=
s
.
FinishInitParams
(
0
,
nil
)
if
err
!=
nil
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
err
)
}
var
param
pserver
.
Parameter
err
=
s
.
GetParam
(
"param_b"
,
&
param
)
if
err
!=
nil
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
err
)
}
if
!
reflect
.
DeepEqual
(
param
,
p1
)
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
"not equal:"
,
param
,
p1
)
}
g1
,
g2
:=
pserver
.
Gradient
(
p1
),
pserver
.
Gradient
(
p
)
err
=
s
.
SendGrad
(
g1
,
nil
)
if
err
!=
nil
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
err
)
}
err
=
s
.
SendGrad
(
g2
,
nil
)
if
err
!=
nil
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
err
)
}
var
param1
pserver
.
Parameter
err
=
s
.
GetParam
(
"param_a"
,
&
param1
)
if
err
!=
nil
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
err
)
}
// don't compare content, since it's already changed by
...
...
@@ -82,7 +82,7 @@ func TestServiceFull(t *testing.T) {
p
.
Content
=
nil
if
!
reflect
.
DeepEqual
(
param1
,
p
)
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
"not equal:"
,
param1
,
p
)
}
}
...
...
@@ -90,16 +90,16 @@ func TestMultipleInit(t *testing.T) {
var
cp
pserver
.
Checkpoint
s
,
err
:=
pserver
.
NewService
(
0
,
1
,
""
,
nil
,
cp
)
if
err
!=
nil
{
t
.
Error
(
err
)
t
.
Fatal
(
err
)
}
err
=
s
.
FinishInitParams
(
0
,
nil
)
if
err
!=
nil
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
err
)
}
err
=
s
.
FinishInitParams
(
0
,
nil
)
if
err
.
Error
()
!=
pserver
.
AlreadyInitialized
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
err
)
}
}
...
...
@@ -108,7 +108,7 @@ func TestUninitialized(t *testing.T) {
s
,
err
:=
pserver
.
NewService
(
0
,
1
,
""
,
nil
,
cp
)
err
=
s
.
SendGrad
(
pserver
.
Gradient
{},
nil
)
if
err
.
Error
()
!=
pserver
.
Uninitialized
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
err
)
}
}
...
...
@@ -154,12 +154,12 @@ func TestBlockUntilInitialized(t *testing.T) {
err
=
s
.
InitParam
(
pserver
.
ParameterWithConfig
{
Param
:
p
,
Config
:
config
},
nil
)
if
err
!=
nil
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
err
)
}
err
=
s
.
FinishInitParams
(
0
,
nil
)
if
err
!=
nil
{
t
.
Fa
ilNow
(
)
t
.
Fa
tal
(
err
)
}
wg
.
Wait
()
...
...
paddle/optimizer/optimizer.cc
浏览文件 @
f49fda5e
...
...
@@ -44,8 +44,8 @@ paddle_optimizer* paddle_create_optimizer(const unsigned char* config_proto,
const
int
state_len
)
{
paddle_optimizer
*
optimizer
=
new
paddle_optimizer
;
std
::
string
config
(
config_proto
,
config_proto
+
config_proto_len
);
Tensor
*
parameter
=
new
Tensor
(
reinterpret_cast
<
float
*>
(
param_buffer
),
num_bytes
);
Tensor
*
parameter
=
new
Tensor
(
reinterpret_cast
<
float
*>
(
param_buffer
),
num_bytes
/
sizeof
(
float
)
);
optimizer
->
impl
=
ParameterOptimizer
::
Create
(
config
,
parameter
);
if
(
state
!=
nullptr
)
{
std
::
string
s
(
state
,
state
+
state_len
);
...
...
@@ -65,7 +65,8 @@ int paddle_update_parameter(paddle_optimizer* o,
int
num_bytes
)
{
// TOOD(zhihong): datatype not work. need to add the runtime datatype
auto
grad_type
=
reinterpret_cast
<
const
float
*>
(
grad_buffer
);
Tensor
*
gradient
=
new
Tensor
(
const_cast
<
float
*>
(
grad_type
),
num_bytes
);
Tensor
*
gradient
=
new
Tensor
(
const_cast
<
float
*>
(
grad_type
),
num_bytes
/
sizeof
(
float
));
o
->
impl
->
Update
(
gradient
);
return
PADDLE_SUCCESS
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录