Skip to content

Commit 74ca73b

Browse files
authored
Update trainer api (#10674)
1 parent 6af0593 commit 74ca73b

File tree

6 files changed

+103
-119
lines changed

6 files changed

+103
-119
lines changed

python/paddle/fluid/inferencer.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,35 @@
1313
# limitations under the License.
1414

1515
import core
16-
import framework
16+
1717
import executor
18+
import framework
1819
import io
20+
import unique_name
1921
from trainer import check_and_get_place
2022

2123
__all__ = ['Inferencer', ]
2224

2325

2426
class Inferencer(object):
25-
def __init__(self, param_path, place=None):
27+
def __init__(self, infer_func, param_path, place=None):
2628
"""
27-
:param param_path: the path where the inference model is saved by fluid.io.save_inference_model
29+
:param infer_func: a function that will return predict Variable
30+
:param param_path: the path where the inference model is saved by fluid.io.save_params
2831
:param place: place to do the inference
2932
"""
3033
self.param_path = param_path
3134
self.scope = core.Scope()
3235

36+
self.inference_program = framework.Program()
37+
with framework.program_guard(self.inference_program):
38+
with unique_name.guard():
39+
self.predict_var = infer_func()
40+
3341
self.exe = executor.Executor(check_and_get_place(place))
3442
with executor.scope_guard(self.scope):
3543
# load params from param_path into scope
36-
[self.inference_program, _,
37-
self.fetch_targets] = io.load_inference_model(
38-
executor=self.exe, dirname=param_path)
44+
io.load_params(self.exe, param_path, self.inference_program)
3945

4046
def infer(self, inputs, return_numpy=True):
4147
"""
@@ -51,7 +57,7 @@ def infer(self, inputs, return_numpy=True):
5157
with executor.scope_guard(self.scope):
5258
results = self.exe.run(self.inference_program,
5359
feed=inputs,
54-
fetch_list=self.fetch_targets,
60+
fetch_list=[self.predict_var],
5561
return_numpy=return_numpy)
5662

5763
return results

python/paddle/fluid/tests/book/high-level-api/fit_a_line/test_fit_a_line.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,11 @@ def linear():
4848
return avg_loss
4949

5050

51-
def train(use_cuda, save_dirname):
51+
def train(use_cuda, train_program, save_dirname):
5252
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
5353

5454
trainer = fluid.Trainer(
55-
train_func=linear,
56-
infer_func=inference_program,
55+
train_func=train_program,
5756
place=place,
5857
optimizer=fluid.optimizer.SGD(learning_rate=0.001))
5958

@@ -72,11 +71,7 @@ def event_handler(event):
7271
'''
7372
if float(test_metrics[0]) < 20.0:
7473
if save_dirname is not None:
75-
# NOT clear yet
76-
# fluid.io.save_inference_model(save_dirname, ['x'], [y_predict])
77-
# trainer.save_params(save_dirname)
78-
# https://github.com/PaddlePaddle/Paddle/pull/10445
79-
trainer.save_inference_model(save_dirname)
74+
trainer.save_params(save_dirname)
8075
return
8176

8277
trainer.train(
@@ -87,12 +82,13 @@ def event_handler(event):
8782

8883

8984
# infer
90-
def infer(use_cuda, save_dirname=None):
85+
def infer(use_cuda, inference_program, save_dirname=None):
9186
if save_dirname is None:
9287
return
9388

9489
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
95-
inferencer = fluid.Inferencer(param_path=save_dirname, place=place)
90+
inferencer = fluid.Inferencer(
91+
infer_func=inference_program, param_path=save_dirname, place=place)
9692

9793
batch_size = 10
9894
tensor_x = numpy.random.uniform(0, 10, [batch_size, 13]).astype("float32")
@@ -108,8 +104,8 @@ def main(use_cuda):
108104
# Directory for saving the trained model
109105
save_dirname = "fit_a_line.inference.model"
110106

111-
train(use_cuda, save_dirname)
112-
infer(use_cuda, save_dirname)
107+
train(use_cuda, linear, save_dirname)
108+
infer(use_cuda, inference_program, save_dirname)
113109

114110

115111
class TestFitALine(unittest.TestCase):

python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_conv.py

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -53,48 +53,40 @@ def train_program():
5353
predict = inference_program()
5454
cost = fluid.layers.cross_entropy(input=predict, label=label)
5555
avg_cost = fluid.layers.mean(cost)
56-
# acc = fluid.layers.accuracy(input=predict, label=label)
57-
# return avg_cost, acc
58-
return avg_cost
56+
acc = fluid.layers.accuracy(input=predict, label=label)
57+
return [avg_cost, acc]
5958

6059

61-
def train(use_cuda, save_dirname):
60+
def train(use_cuda, train_program, save_dirname):
6261
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
6362
optimizer = fluid.optimizer.Adam(learning_rate=0.001)
6463

6564
trainer = fluid.Trainer(
66-
train_func=train_program,
67-
infer_func=inference_program,
68-
place=place,
69-
optimizer=optimizer)
65+
train_func=train_program, place=place, optimizer=optimizer)
7066

7167
def event_handler(event):
7268
if isinstance(event, fluid.EndEpochEvent):
73-
# if (event.epoch + 1) % 10 == 0:
74-
# trainer.save_params(save_dirname)
75-
trainer.save_inference_model(save_dirname)
76-
77-
# TODO: Uncomment this part once we are sure that .train is working
78-
# test_reader = paddle.batch(
79-
# paddle.dataset.mnist.test(), batch_size=BATCH_SIZE)
80-
# test_metrics = trainer.test(reader=test_reader)
81-
# avg_cost_set = test_metrics[0]
82-
# acc_set = test_metrics[1]
83-
#
84-
# # get test acc and loss
85-
# acc = numpy.array(acc_set).mean()
86-
# avg_cost = numpy.array(avg_cost_set).mean()
87-
#
88-
# print("avg_cost: %s" % avg_cost)
89-
# print("acc : %s" % acc)
90-
#
91-
# if float(acc) > 0.2: # Smaller value to increase CI speed
92-
# trainer.save_params(save_dirname)
93-
# else:
94-
# print('BatchID {0}, Test Loss {1:0.2}, Acc {2:0.2}'.format(
95-
# event.epoch + 1, float(avg_cost), float(acc)))
96-
# if math.isnan(float(avg_cost)):
97-
# sys.exit("got NaN loss, training failed.")
69+
test_reader = paddle.batch(
70+
paddle.dataset.mnist.test(), batch_size=BATCH_SIZE)
71+
test_metrics = trainer.test(
72+
reader=test_reader, feed_order=['img', 'label'])
73+
avg_cost_set = test_metrics[0]
74+
acc_set = test_metrics[1]
75+
76+
# get test acc and loss
77+
acc = numpy.array(acc_set).mean()
78+
avg_cost = numpy.array(avg_cost_set).mean()
79+
80+
print("avg_cost: %s" % avg_cost)
81+
print("acc : %s" % acc)
82+
83+
if float(acc) > 0.2: # Smaller value to increase CI speed
84+
trainer.save_params(save_dirname)
85+
else:
86+
print('BatchID {0}, Test Loss {1:0.2}, Acc {2:0.2}'.format(
87+
event.epoch + 1, float(avg_cost), float(acc)))
88+
if math.isnan(float(avg_cost)):
89+
sys.exit("got NaN loss, training failed.")
9890

9991
train_reader = paddle.batch(
10092
paddle.reader.shuffle(
@@ -108,10 +100,11 @@ def event_handler(event):
108100
feed_order=['img', 'label'])
109101

110102

111-
def infer(use_cuda, save_dirname=None):
103+
def infer(use_cuda, inference_program, save_dirname=None):
112104
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
113105

114-
inferencer = fluid.Inferencer(param_path=save_dirname, place=place)
106+
inferencer = fluid.Inferencer(
107+
infer_func=inference_program, param_path=save_dirname, place=place)
115108

116109
batch_size = 1
117110
tensor_img = numpy.random.uniform(-1.0, 1.0,
@@ -126,8 +119,14 @@ def main(use_cuda):
126119
save_dirname = "recognize_digits_conv.inference.model"
127120

128121
# call train() with is_local argument to run distributed train
129-
train(use_cuda=use_cuda, save_dirname=save_dirname)
130-
infer(use_cuda=use_cuda, save_dirname=save_dirname)
122+
train(
123+
use_cuda=use_cuda,
124+
train_program=train_program,
125+
save_dirname=save_dirname)
126+
infer(
127+
use_cuda=use_cuda,
128+
inference_program=inference_program,
129+
save_dirname=save_dirname)
131130

132131

133132
if __name__ == '__main__':

python/paddle/fluid/tests/book/high-level-api/recognize_digits/test_recognize_digits_mlp.py

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -40,47 +40,40 @@ def train_program():
4040
predict = inference_program()
4141
cost = fluid.layers.cross_entropy(input=predict, label=label)
4242
avg_cost = fluid.layers.mean(cost)
43-
# acc = fluid.layers.accuracy(input=predict, label=label)
44-
# return avg_cost, acc
45-
return avg_cost
43+
acc = fluid.layers.accuracy(input=predict, label=label)
44+
return [avg_cost, acc]
4645

4746

48-
def train(use_cuda, save_dirname):
47+
def train(use_cuda, train_program, save_dirname):
4948
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
5049
optimizer = fluid.optimizer.Adam(learning_rate=0.001)
5150

5251
trainer = fluid.Trainer(
53-
train_func=train_program,
54-
infer_func=inference_program,
55-
place=place,
56-
optimizer=optimizer)
52+
train_func=train_program, place=place, optimizer=optimizer)
5753

5854
def event_handler(event):
5955
if isinstance(event, fluid.EndEpochEvent):
60-
# if (event.epoch + 1) % 10 == 0:
61-
trainer.save_inference_model(save_dirname)
62-
63-
# TODO: Uncomment this part once we are sure that .train is working
64-
# test_reader = paddle.batch(
65-
# paddle.dataset.mnist.test(), batch_size=BATCH_SIZE)
66-
# test_metrics = trainer.test(reader=test_reader)
67-
# avg_cost_set = test_metrics[0]
68-
# acc_set = test_metrics[1]
69-
#
70-
# # get test acc and loss
71-
# acc = numpy.array(acc_set).mean()
72-
# avg_cost = numpy.array(avg_cost_set).mean()
73-
#
74-
# print("avg_cost: %s" % avg_cost)
75-
# print("acc : %s" % acc)
76-
#
77-
# if float(acc) > 0.2: # Smaller value to increase CI speed
78-
# trainer.save_params(save_dirname)
79-
# else:
80-
# print('BatchID {0}, Test Loss {1:0.2}, Acc {2:0.2}'.format(
81-
# event.epoch + 1, float(avg_cost), float(acc)))
82-
# if math.isnan(float(avg_cost)):
83-
# sys.exit("got NaN loss, training failed.")
56+
test_reader = paddle.batch(
57+
paddle.dataset.mnist.test(), batch_size=BATCH_SIZE)
58+
test_metrics = trainer.test(
59+
reader=test_reader, feed_order=['img', 'label'])
60+
avg_cost_set = test_metrics[0]
61+
acc_set = test_metrics[1]
62+
63+
# get test acc and loss
64+
acc = numpy.array(acc_set).mean()
65+
avg_cost = numpy.array(avg_cost_set).mean()
66+
67+
print("avg_cost: %s" % avg_cost)
68+
print("acc : %s" % acc)
69+
70+
if float(acc) > 0.2: # Smaller value to increase CI speed
71+
trainer.save_params(save_dirname)
72+
else:
73+
print('BatchID {0}, Test Loss {1:0.2}, Acc {2:0.2}'.format(
74+
event.epoch + 1, float(avg_cost), float(acc)))
75+
if math.isnan(float(avg_cost)):
76+
sys.exit("got NaN loss, training failed.")
8477

8578
train_reader = paddle.batch(
8679
paddle.reader.shuffle(
@@ -94,10 +87,11 @@ def event_handler(event):
9487
feed_order=['img', 'label'])
9588

9689

97-
def infer(use_cuda, save_dirname=None):
90+
def infer(use_cuda, inference_program, save_dirname=None):
9891
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
9992

100-
inferencer = fluid.Inferencer(param_path=save_dirname, place=place)
93+
inferencer = fluid.Inferencer(
94+
infer_func=inference_program, param_path=save_dirname, place=place)
10195

10296
batch_size = 1
10397
tensor_img = numpy.random.uniform(-1.0, 1.0,
@@ -112,8 +106,14 @@ def main(use_cuda):
112106
save_dirname = "recognize_digits_mlp.inference.model"
113107

114108
# call train() with is_local argument to run distributed train
115-
train(use_cuda=use_cuda, save_dirname=save_dirname)
116-
infer(use_cuda=use_cuda, save_dirname=save_dirname)
109+
train(
110+
use_cuda=use_cuda,
111+
train_program=train_program,
112+
save_dirname=save_dirname)
113+
infer(
114+
use_cuda=use_cuda,
115+
inference_program=inference_program,
116+
save_dirname=save_dirname)
117117

118118

119119
if __name__ == '__main__':

python/paddle/fluid/tests/book/high-level-api/word2vec/no_test_word2vec_new_api.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ def train_program(is_sparse):
9090
return avg_cost
9191

9292

93-
def train(use_cuda, is_sparse, save_path):
93+
def train(use_cuda, train_program, save_path):
9494
train_reader = paddle.batch(
9595
paddle.dataset.imikolov.train(word_dict, N), BATCH_SIZE)
9696
test_reader = paddle.batch(
@@ -105,23 +105,21 @@ def event_handler(event):
105105
print("loss= ", avg_cost)
106106

107107
if avg_cost < 5.0:
108-
trainer.save_inference_model(save_path)
108+
trainer.save_params(save_path)
109109
return
110110
if math.isnan(avg_cost):
111111
sys.exit("got NaN loss, training failed.")
112112

113113
trainer = fluid.Trainer(
114-
partial(train_program, is_sparse),
115-
partial(inference_program, is_sparse),
116-
fluid.optimizer.SGD(learning_rate=0.001),
117-
place=place)
114+
train_program, fluid.optimizer.SGD(learning_rate=0.001), place=place)
118115
trainer.train(
119116
reader=train_reader, num_epochs=1, event_handler=event_handler)
120117

121118

122-
def infer(use_cuda, is_sparse, save_path):
119+
def infer(use_cuda, inference_program, save_path):
123120
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
124-
inferencer = fluid.Inferencer(param_path=save_path, place=place)
121+
inferencer = fluid.Inferencer(
122+
infer_func=inference_program, param_path=save_path, place=place)
125123

126124
lod = [0, 1]
127125
first_word = create_random_lodtensor(lod, place, low=0, high=dict_size - 1)
@@ -144,9 +142,9 @@ def main(use_cuda, is_sparse):
144142
if use_cuda and not fluid.core.is_compiled_with_cuda():
145143
return
146144

147-
save_path = "word2vec.inference.model"
148-
train(use_cuda, is_sparse, save_path)
149-
infer(use_cuda, is_sparse, save_path)
145+
save_path = "word2vec.params"
146+
train(use_cuda, partial(train_program, is_sparse), save_path)
147+
infer(use_cuda, partial(inference_program, is_sparse), save_path)
150148

151149

152150
if __name__ == '__main__':

0 commit comments

Comments
 (0)