test_dist_fleet_ps5.py 6.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#   Copyright (c) 2018 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.

import unittest
P
pangyoki 已提交
16

T
tangwei12 已提交
17
import paddle
18

P
pangyoki 已提交
19
paddle.enable_static()
20

T
tangwei12 已提交
21
import paddle.distributed.fleet as fleet
22 23
import paddle.distributed.fleet.base.role_maker as role_maker
import paddle.fluid as fluid
T
tangwei12 已提交
24

25 26 27 28 29 30 31 32 33 34 35 36 37 38
# For Net
base_lr = 0.2
emb_lr = base_lr * 3
dict_dim = 1500
emb_dim = 128
hid_dim = 128
margin = 0.1
sample_rate = 1
batch_size = 4


class TestPSPassWithBow(unittest.TestCase):
    def net(self):
        def get_acc(cos_q_nt, cos_q_pt, batch_size):
L
LiYuRio 已提交
39
            cond = paddle.less_than(cos_q_nt, cos_q_pt)
40
            cond = fluid.layers.cast(cond, dtype='float64')
41
            cond_3 = paddle.sum(cond)
42
            acc = paddle.divide(
43 44 45 46 47 48
                cond_3,
                fluid.layers.fill_constant(
                    shape=[1], value=batch_size * 1.0, dtype='float64'
                ),
                name="simnet_acc",
            )
49 50 51
            return acc

        def get_loss(cos_q_pt, cos_q_nt):
52
            loss_op1 = paddle.subtract(
53 54 55 56 57
                fluid.layers.fill_constant_batch_size_like(
                    input=cos_q_pt, shape=[-1, 1], value=margin, dtype='float32'
                ),
                cos_q_pt,
            )
58
            loss_op2 = paddle.add(loss_op1, cos_q_nt)
H
HongyuJia 已提交
59
            loss_op3 = paddle.maximum(
60 61 62 63 64
                fluid.layers.fill_constant_batch_size_like(
                    input=loss_op2, shape=[-1, 1], value=0.0, dtype='float32'
                ),
                loss_op2,
            )
65
            avg_cost = paddle.mean(loss_op3)
66 67 68 69 70 71
            return avg_cost

        is_distributed = False
        is_sparse = True

        # query
G
GGBond8488 已提交
72 73
        q = paddle.static.data(
            name="query_ids", shape=[-1, 1], dtype="int64", lod_level=1
74
        )
75 76 77 78 79 80
        # embedding
        q_emb = fluid.layers.embedding(
            input=q,
            is_distributed=is_distributed,
            size=[dict_dim, emb_dim],
            param_attr=fluid.ParamAttr(
81
                initializer=paddle.nn.initializer.Constant(value=0.01),
82
                name="__emb__",
83 84 85 86
                learning_rate=emb_lr,
            ),
            is_sparse=is_sparse,
        )
87
        q_emb = paddle.reshape(q_emb, [-1, emb_dim])
88
        # vsum
89 90 91
        q_sum = paddle.static.nn.sequence_lod.sequence_pool(
            input=q_emb, pool_type='sum'
        )
92
        q_ss = paddle.nn.functional.softsign(q_sum)
93
        # fc layer after conv
C
Charles-hit 已提交
94 95
        q_fc = paddle.static.nn.fc(
            x=q_ss,
96
            size=hid_dim,
C
Charles-hit 已提交
97
            weight_attr=fluid.ParamAttr(
98
                initializer=paddle.nn.initializer.Constant(value=0.01),
99
                name="__q_fc__",
100 101 102
                learning_rate=base_lr,
            ),
        )
103
        # label data
G
GGBond8488 已提交
104
        label = paddle.static.data(name="label", shape=[-1, 1], dtype="int64")
105
        # pt
G
GGBond8488 已提交
106 107
        pt = paddle.static.data(
            name="pos_title_ids", shape=[-1, 1], dtype="int64", lod_level=1
108
        )
109 110 111 112 113 114
        # embedding
        pt_emb = fluid.layers.embedding(
            input=pt,
            is_distributed=is_distributed,
            size=[dict_dim, emb_dim],
            param_attr=fluid.ParamAttr(
115
                initializer=paddle.nn.initializer.Constant(value=0.01),
116
                name="__emb__",
117 118 119 120
                learning_rate=emb_lr,
            ),
            is_sparse=is_sparse,
        )
121
        pt_emb = paddle.reshape(pt_emb, [-1, emb_dim])
122
        # vsum
123 124 125
        pt_sum = paddle.static.nn.sequence_lod.sequence_pool(
            input=pt_emb, pool_type='sum'
        )
126
        pt_ss = paddle.nn.functional.softsign(pt_sum)
127
        # fc layer
C
Charles-hit 已提交
128 129
        pt_fc = paddle.static.nn.fc(
            x=pt_ss,
130
            size=hid_dim,
C
Charles-hit 已提交
131
            weight_attr=fluid.ParamAttr(
132
                initializer=paddle.nn.initializer.Constant(value=0.01),
133
                name="__fc__",
134 135 136 137
                learning_rate=base_lr,
            ),
            bias_attr=fluid.ParamAttr(name="__fc_b__"),
        )
138
        # nt
G
GGBond8488 已提交
139 140
        nt = paddle.static.data(
            name="neg_title_ids", shape=[-1, 1], dtype="int64", lod_level=1
141
        )
142 143 144 145 146 147
        # embedding
        nt_emb = fluid.layers.embedding(
            input=nt,
            is_distributed=is_distributed,
            size=[dict_dim, emb_dim],
            param_attr=fluid.ParamAttr(
148
                initializer=paddle.nn.initializer.Constant(value=0.01),
149
                name="__emb__tmp_",
150 151 152 153
                learning_rate=emb_lr,
            ),
            is_sparse=False,
        )
154
        nt_emb = paddle.reshape(nt_emb, [-1, emb_dim])
155
        # vsum
156 157 158
        nt_sum = paddle.static.nn.sequence_lod.sequence_pool(
            input=nt_emb, pool_type='sum'
        )
159
        nt_ss = paddle.nn.functional.softsign(nt_sum)
160
        # fc layer
C
Charles-hit 已提交
161 162
        nt_fc = paddle.static.nn.fc(
            x=nt_ss,
163
            size=hid_dim,
C
Charles-hit 已提交
164
            weight_attr=fluid.ParamAttr(
165
                initializer=paddle.nn.initializer.Constant(value=0.01),
166
                name="__fc__",
167 168 169 170
                learning_rate=base_lr,
            ),
            bias_attr=fluid.ParamAttr(name="__fc_b__"),
        )
C
ccrrong 已提交
171 172
        cos_q_pt = paddle.nn.functional.cosine_similarity(q_fc, pt_fc)
        cos_q_nt = paddle.nn.functional.cosine_similarity(q_fc, nt_fc)
173 174 175 176 177 178 179 180
        # loss
        avg_cost = get_loss(cos_q_pt, cos_q_nt)
        # acc
        acc = get_acc(cos_q_nt, cos_q_pt, batch_size)
        return [avg_cost, acc, cos_q_pt]

    def test(self):
        endpoints = [
181 182 183 184
            "127.0.0.1:36004",
            "127.0.0.1:36005",
            "127.0.0.1:36006",
            "127.0.0.1:36007",
185 186
        ]

187 188 189 190 191 192
        role = role_maker.UserDefinedRoleMaker(
            current_id=0,
            role=role_maker.Role.SERVER,
            worker_num=2,
            server_endpoints=endpoints,
        )
193 194 195 196

        fleet.init(role)
        loss, acc, _ = self.net()

T
tangwei12 已提交
197
        optimizer = fluid.optimizer.Adam(
198 199 200 201 202 203 204
            learning_rate=fluid.layers.exponential_decay(
                learning_rate=base_lr,
                decay_steps=500,
                decay_rate=0.969,
                staircase=True,
            )
        )
T
tangwei12 已提交
205

T
tangwei12 已提交
206 207 208
        strategy = paddle.distributed.fleet.DistributedStrategy()
        strategy.a_sync = True

209 210 211 212 213 214
        optimizer = fleet.distributed_optimizer(optimizer, strategy)
        optimizer.minimize(loss)


if __name__ == '__main__':
    unittest.main()