test_dist_fleet_ps4.py 6.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#   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.

from __future__ import print_function

T
tangwei12 已提交
17
import os
18
import unittest
P
pangyoki 已提交
19

T
tangwei12 已提交
20
import paddle
21

P
pangyoki 已提交
22
paddle.enable_static()
23

T
tangwei12 已提交
24 25 26 27
import paddle.fluid as fluid
import paddle.distributed.fleet.base.role_maker as role_maker
import paddle.distributed.fleet as fleet

28 29 30 31 32 33 34 35 36 37 38 39
# 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):
40

41
    def net(self):
42

43 44 45 46
        def get_acc(cos_q_nt, cos_q_pt, batch_size):
            cond = fluid.layers.less_than(cos_q_nt, cos_q_pt)
            cond = fluid.layers.cast(cond, dtype='float64')
            cond_3 = fluid.layers.reduce_sum(cond)
47 48 49 50 51 52
            acc = fluid.layers.elementwise_div(cond_3,
                                               fluid.layers.fill_constant(
                                                   shape=[1],
                                                   value=batch_size * 1.0,
                                                   dtype='float64'),
                                               name="simnet_acc")
53 54 55 56
            return acc

        def get_loss(cos_q_pt, cos_q_nt):
            loss_op1 = fluid.layers.elementwise_sub(
57 58 59 60
                fluid.layers.fill_constant_batch_size_like(input=cos_q_pt,
                                                           shape=[-1, 1],
                                                           value=margin,
                                                           dtype='float32'),
61 62 63
                cos_q_pt)
            loss_op2 = fluid.layers.elementwise_add(loss_op1, cos_q_nt)
            loss_op3 = fluid.layers.elementwise_max(
64 65 66 67
                fluid.layers.fill_constant_batch_size_like(input=loss_op2,
                                                           shape=[-1, 1],
                                                           value=0.0,
                                                           dtype='float32'),
68
                loss_op2)
69
            avg_cost = paddle.mean(loss_op3)
70 71 72 73 74 75
            return avg_cost

        is_distributed = False
        is_sparse = True

        # query
76 77 78 79
        q = fluid.layers.data(name="query_ids",
                              shape=[1],
                              dtype="int64",
                              lod_level=1)
80
        # embedding
T
tangwei12 已提交
81
        q_emb = fluid.contrib.layers.sparse_embedding(
82 83 84 85 86
            input=q,
            size=[dict_dim, emb_dim],
            param_attr=fluid.ParamAttr(
                initializer=fluid.initializer.Constant(value=0.01),
                name="__emb__",
T
tangwei12 已提交
87
                learning_rate=emb_lr))
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
        q_emb = fluid.layers.reshape(q_emb, [-1, emb_dim])
        # vsum
        q_sum = fluid.layers.sequence_pool(input=q_emb, pool_type='sum')
        q_ss = fluid.layers.softsign(q_sum)
        # fc layer after conv
        q_fc = fluid.layers.fc(
            input=q_ss,
            size=hid_dim,
            param_attr=fluid.ParamAttr(
                initializer=fluid.initializer.Constant(value=0.01),
                name="__q_fc__",
                learning_rate=base_lr))
        # label data
        label = fluid.layers.data(name="label", shape=[1], dtype="int64")
        # pt
103 104 105 106
        pt = fluid.layers.data(name="pos_title_ids",
                               shape=[1],
                               dtype="int64",
                               lod_level=1)
107
        # embedding
T
tangwei12 已提交
108
        pt_emb = fluid.contrib.layers.sparse_embedding(
109 110 111 112 113
            input=pt,
            size=[dict_dim, emb_dim],
            param_attr=fluid.ParamAttr(
                initializer=fluid.initializer.Constant(value=0.01),
                name="__emb__",
T
tangwei12 已提交
114
                learning_rate=emb_lr))
115 116 117 118 119 120 121 122 123 124 125 126 127 128
        pt_emb = fluid.layers.reshape(pt_emb, [-1, emb_dim])
        # vsum
        pt_sum = fluid.layers.sequence_pool(input=pt_emb, pool_type='sum')
        pt_ss = fluid.layers.softsign(pt_sum)
        # fc layer
        pt_fc = fluid.layers.fc(
            input=pt_ss,
            size=hid_dim,
            param_attr=fluid.ParamAttr(
                initializer=fluid.initializer.Constant(value=0.01),
                name="__fc__",
                learning_rate=base_lr),
            bias_attr=fluid.ParamAttr(name="__fc_b__"))
        # nt
129 130 131 132
        nt = fluid.layers.data(name="neg_title_ids",
                               shape=[1],
                               dtype="int64",
                               lod_level=1)
133
        # embedding
T
tangwei12 已提交
134
        nt_emb = fluid.contrib.layers.sparse_embedding(
135 136 137 138 139
            input=nt,
            size=[dict_dim, emb_dim],
            param_attr=fluid.ParamAttr(
                initializer=fluid.initializer.Constant(value=0.01),
                name="__emb__",
T
tangwei12 已提交
140
                learning_rate=emb_lr))
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
        nt_emb = fluid.layers.reshape(nt_emb, [-1, emb_dim])
        # vsum
        nt_sum = fluid.layers.sequence_pool(input=nt_emb, pool_type='sum')
        nt_ss = fluid.layers.softsign(nt_sum)
        # fc layer
        nt_fc = fluid.layers.fc(
            input=nt_ss,
            size=hid_dim,
            param_attr=fluid.ParamAttr(
                initializer=fluid.initializer.Constant(value=0.01),
                name="__fc__",
                learning_rate=base_lr),
            bias_attr=fluid.ParamAttr(name="__fc_b__"))
        cos_q_pt = fluid.layers.cos_sim(q_fc, pt_fc)
        cos_q_nt = fluid.layers.cos_sim(q_fc, nt_fc)
        # 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 = [
            "127.0.0.1:36004", "127.0.0.1:36005", "127.0.0.1:36006",
            "127.0.0.1:36007"
        ]

168 169 170 171
        role = role_maker.UserDefinedRoleMaker(current_id=0,
                                               role=role_maker.Role.SERVER,
                                               worker_num=2,
                                               server_endpoints=endpoints)
172 173 174

        fleet.init(role)
        loss, acc, _ = self.net()
T
tangwei12 已提交
175
        optimizer = fluid.optimizer.Adam(base_lr)
T
tangwei12 已提交
176 177 178 179

        strategy = paddle.distributed.fleet.DistributedStrategy()
        strategy.a_sync = True

180 181 182 183 184 185
        optimizer = fleet.distributed_optimizer(optimizer, strategy)
        optimizer.minimize(loss)


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