| 
22 | 22 | import paddle.fluid.optimizer as optimizer  | 
23 | 23 | from paddle.fluid.framework import Program, program_guard  | 
24 | 24 | import paddle.fluid.core as core  | 
 | 25 | +import paddle.fluid.compiler as compiler  | 
 | 26 | +import os  | 
25 | 27 | 
 
  | 
26 | 28 | BATCH_SIZE = 1  | 
27 | 29 | INPUT_SIZE = 784  | 
@@ -104,20 +106,20 @@ def fn_2(opt, avg_loss=None, pred=None, label=None):  | 
104 | 106 |             avg_loss = layers.case([(mod_two, lambda: fn_1(adam, avg_loss_1))],  | 
105 | 107 |                                    lambda: fn_2(sgd, avg_loss_2))  | 
106 | 108 | 
 
  | 
107 |  | -        place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()  | 
108 |  | -        exe = fluid.Executor(place)  | 
109 |  | -        exe.run(fluid.default_startup_program())  | 
110 |  | - | 
111 |  | -        for epoch in range(EPOCH_NUM):  | 
112 |  | -            feed_image, feed_label = train_data[epoch]  | 
113 |  | -            fetch_list = [hidden, prediction, avg_loss]  | 
114 |  | -            feed = {  | 
115 |  | -                'image': feed_image,  | 
116 |  | -                'label': feed_label,  | 
117 |  | -                'id': np.array([epoch]).astype('int32')  | 
118 |  | -            }  | 
119 |  | -            out = exe.run(main_program, feed=feed, fetch_list=fetch_list)  | 
120 |  | -            out_hidden, out_pred, loss = out  | 
 | 109 | +    place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()  | 
 | 110 | +    exe = fluid.Executor(place)  | 
 | 111 | +    exe.run(startup_program)  | 
 | 112 | + | 
 | 113 | +    for epoch in range(EPOCH_NUM):  | 
 | 114 | +        feed_image, feed_label = train_data[epoch]  | 
 | 115 | +        fetch_list = [hidden, prediction, avg_loss]  | 
 | 116 | +        feed = {  | 
 | 117 | +            'image': feed_image,  | 
 | 118 | +            'label': feed_label,  | 
 | 119 | +            'id': np.array([epoch]).astype('int32')  | 
 | 120 | +        }  | 
 | 121 | +        out = exe.run(main_program, feed=feed, fetch_list=fetch_list)  | 
 | 122 | +        out_hidden, out_pred, loss = out  | 
121 | 123 | 
 
  | 
122 | 124 |     return out_hidden, out_pred, loss  | 
123 | 125 | 
 
  | 
@@ -225,5 +227,58 @@ def test_optimzier_in_switch(self):  | 
225 | 227 |                                                                    loss_2))  | 
226 | 228 | 
 
  | 
227 | 229 | 
 
  | 
 | 230 | +class TestMultiOptimizersMultiCardsError(unittest.TestCase):  | 
 | 231 | +    def test_error(self):  | 
 | 232 | +        startup_program = Program()  | 
 | 233 | +        main_program = Program()  | 
 | 234 | +        use_cuda = core.is_compiled_with_cuda()  | 
 | 235 | +        with program_guard(main_program, startup_program):  | 
 | 236 | + | 
 | 237 | +            def fn_1(opt, avg_loss):  | 
 | 238 | +                opt.minimize(avg_loss)  | 
 | 239 | + | 
 | 240 | +            def fn_2(opt, avg_loss):  | 
 | 241 | +                opt.minimize(avg_loss)  | 
 | 242 | + | 
 | 243 | +            x = fluid.layers.data("X", [10], 'float32')  | 
 | 244 | +            hidden = layers.fc(x, 5)  | 
 | 245 | +            avg_loss = layers.mean(hidden)  | 
 | 246 | + | 
 | 247 | +            adam = optimizer.Adam(learning_rate=LR)  | 
 | 248 | +            sgd = optimizer.SGD(learning_rate=LR)  | 
 | 249 | + | 
 | 250 | +            cond = layers.fill_constant([1], 'bool', True)  | 
 | 251 | + | 
 | 252 | +            layers.case([(cond, lambda: fn_1(adam, avg_loss))],  | 
 | 253 | +                        lambda: fn_2(sgd, avg_loss))  | 
 | 254 | + | 
 | 255 | +        cpu_place = fluid.CPUPlace()  | 
 | 256 | +        cuda_place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()  | 
 | 257 | + | 
 | 258 | +        for place in [cpu_place, cuda_place]:  | 
 | 259 | + | 
 | 260 | +            exe = fluid.Executor(place)  | 
 | 261 | +            exe.run(startup_program)  | 
 | 262 | + | 
 | 263 | +            np.random.seed(SEED)  | 
 | 264 | +            os.environ['CPU_NUM'] = str(2)  | 
 | 265 | +            pe_exe = fluid.ParallelExecutor(  | 
 | 266 | +                use_cuda=use_cuda,  | 
 | 267 | +                main_program=main_program,  | 
 | 268 | +                loss_name=avg_loss.name)  | 
 | 269 | +            num_devices = pe_exe.device_count  | 
 | 270 | + | 
 | 271 | +            def not_implemented_error():  | 
 | 272 | +                pe_exe.run(feed={  | 
 | 273 | +                    'X': np.random.random(size=[64, 10]).astype('float32'),  | 
 | 274 | +                },  | 
 | 275 | +                           fetch_list=[avg_loss.name])  | 
 | 276 | + | 
 | 277 | +            if num_devices > 1:  | 
 | 278 | +                self.assertRaises(NotImplementedError, not_implemented_error)  | 
 | 279 | +            else:  | 
 | 280 | +                not_implemented_error()  | 
 | 281 | + | 
 | 282 | + | 
228 | 283 | if __name__ == '__main__':  | 
229 | 284 |     unittest.main()  | 
0 commit comments