Skip to content

Commit bed3915

Browse files
authored
migrate quant code to paddle2.0 (#488)
* migrate quant code to paddle2.0 * fix quant unittest * fix demo
1 parent 3a33f1a commit bed3915

12 files changed

+354
-325
lines changed

demo/quant/pact_quant_aware/train.py

+55-58
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import numpy as np
1010
from collections import defaultdict
1111

12-
import paddle.fluid as fluid
1312
sys.path.append(os.path.dirname("__file__"))
1413
sys.path.append(
1514
os.path.join(os.path.dirname("__file__"), os.path.pardir, os.path.pardir))
@@ -21,8 +20,6 @@
2120
from paddle.fluid.layer_helper import LayerHelper
2221
quantization_model_save_dir = './quantization_models/'
2322

24-
from paddle.fluid.contrib.slim.quantization import AddQuantDequantPass
25-
2623
_logger = get_logger(__name__, level=logging.INFO)
2724

2825
parser = argparse.ArgumentParser(description=__doc__)
@@ -74,29 +71,32 @@
7471

7572

7673
def piecewise_decay(args):
77-
places = fluid.cuda_places() if args.use_gpu else fluid.cpu_places()
74+
places = paddle.static.cuda_places(
75+
) if args.use_gpu else paddle.static.cpu_places()
7876
step = int(
7977
math.ceil(float(args.total_images) / (args.batch_size * len(places))))
8078
bd = [step * e for e in args.step_epochs]
8179
lr = [args.lr * (0.1**i) for i in range(len(bd) + 1)]
82-
learning_rate = fluid.layers.piecewise_decay(boundaries=bd, values=lr)
83-
optimizer = fluid.optimizer.Momentum(
80+
learning_rate = paddle.optimizer.lr.PiecewiseDecay(
81+
boundaries=bd, values=lr, verbose=False)
82+
optimizer = paddle.optimizer.Momentum(
8483
learning_rate=learning_rate,
8584
momentum=args.momentum_rate,
86-
regularization=fluid.regularizer.L2Decay(args.l2_decay))
85+
weight_decay=paddle.regularizer.L2Decay(args.l2_decay))
8786
return learning_rate, optimizer
8887

8988

9089
def cosine_decay(args):
91-
places = fluid.cuda_places() if args.use_gpu else fluid.cpu_places()
90+
places = paddle.static.cuda_places(
91+
) if args.use_gpu else paddle.static.cpu_places()
9292
step = int(
9393
math.ceil(float(args.total_images) / (args.batch_size * len(places))))
94-
learning_rate = fluid.layers.cosine_decay(
95-
learning_rate=args.lr, step_each_epoch=step, epochs=args.num_epochs)
96-
optimizer = fluid.optimizer.Momentum(
94+
learning_rate = paddle.optimizer.lr.CosineAnnealingDecay(
95+
learning_rate=args.lr, T_max=step * args.num_epochs, verbose=False)
96+
optimizer = paddle.optimizer.Momentum(
9797
learning_rate=learning_rate,
9898
momentum=args.momentum_rate,
99-
regularization=fluid.regularizer.L2Decay(args.l2_decay))
99+
weight_decay=paddle.regularizer.L2Decay(args.l2_decay))
100100
return learning_rate, optimizer
101101

102102

@@ -127,41 +127,43 @@ def compress(args):
127127
image_shape = [int(m) for m in image_shape.split(",")]
128128
assert args.model in model_list, "{} is not in lists: {}".format(args.model,
129129
model_list)
130-
image = fluid.layers.data(name='image', shape=image_shape, dtype='float32')
130+
image = paddle.static.data(
131+
name='image', shape=[None] + image_shape, dtype='float32')
131132
if args.use_pact:
132133
image.stop_gradient = False
133-
label = fluid.layers.data(name='label', shape=[1], dtype='int64')
134+
label = paddle.static.data(name='label', shape=[None, 1], dtype='int64')
134135
# model definition
135136
model = models.__dict__[args.model]()
136137
out = model.net(input=image, class_dim=class_dim)
137-
cost = fluid.layers.cross_entropy(input=out, label=label)
138-
avg_cost = fluid.layers.mean(x=cost)
139-
acc_top1 = fluid.layers.accuracy(input=out, label=label, k=1)
140-
acc_top5 = fluid.layers.accuracy(input=out, label=label, k=5)
138+
cost = paddle.nn.functional.loss.cross_entropy(input=out, label=label)
139+
avg_cost = paddle.mean(x=cost)
140+
acc_top1 = paddle.metric.accuracy(input=out, label=label, k=1)
141+
acc_top5 = paddle.metric.accuracy(input=out, label=label, k=5)
141142

142-
train_prog = fluid.default_main_program()
143-
val_program = fluid.default_main_program().clone(for_test=True)
143+
train_prog = paddle.static.default_main_program()
144+
val_program = paddle.static.default_main_program().clone(for_test=True)
144145

145146
if not args.analysis:
146147
learning_rate, opt = create_optimizer(args)
147148
opt.minimize(avg_cost)
148149

149-
place = fluid.CUDAPlace(0) if args.use_gpu else fluid.CPUPlace()
150-
exe = fluid.Executor(place)
151-
exe.run(fluid.default_startup_program())
150+
place = paddle.CUDAPlace(0) if args.use_gpu else paddle.CPUPlace()
151+
exe = paddle.static.Executor(place)
152+
exe.run(paddle.static.default_startup_program())
152153

153-
train_reader = paddle.fluid.io.batch(
154+
train_reader = paddle.batch(
154155
train_reader, batch_size=args.batch_size, drop_last=True)
155-
train_loader = fluid.io.DataLoader.from_generator(
156+
train_loader = paddle.io.DataLoader.from_generator(
156157
feed_list=[image, label],
157158
capacity=512,
158159
use_double_buffer=True,
159160
iterable=True)
160-
places = fluid.cuda_places() if args.use_gpu else fluid.cpu_places()
161+
places = paddle.static.cuda_places(
162+
) if args.use_gpu else paddle.static.cpu_places()
161163
train_loader.set_sample_list_generator(train_reader, places)
162164

163-
val_reader = paddle.fluid.io.batch(val_reader, batch_size=args.batch_size)
164-
valid_loader = fluid.io.DataLoader.from_generator(
165+
val_reader = paddle.batch(val_reader, batch_size=args.batch_size)
166+
valid_loader = paddle.io.DataLoader.from_generator(
165167
feed_list=[image, label],
166168
capacity=512,
167169
use_double_buffer=True,
@@ -246,21 +248,21 @@ def pact(x):
246248
helper = LayerHelper("pact", **locals())
247249
dtype = 'float32'
248250
init_thres = values[x.name.split('_tmp_input')[0]]
249-
u_param_attr = fluid.ParamAttr(
251+
u_param_attr = paddle.ParamAttr(
250252
name=x.name + '_pact',
251-
initializer=fluid.initializer.ConstantInitializer(value=init_thres),
252-
regularizer=fluid.regularizer.L2Decay(0.0001),
253+
initializer=paddle.nn.initializer.Constant(value=init_thres),
254+
regularizer=paddle.regularizer.L2Decay(0.0001),
253255
learning_rate=1)
254256
u_param = helper.create_parameter(
255257
attr=u_param_attr, shape=[1], dtype=dtype)
256258

257-
part_a = fluid.layers.relu(fluid.layers.elementwise_sub(x, u_param))
258-
part_b = fluid.layers.relu(fluid.layers.elementwise_sub(-u_param, x))
259+
part_a = paddle.nn.functional.relu(x - u_param)
260+
part_b = paddle.nn.functional.relu(-u_param - x)
259261
x = x - part_a + part_b
260262
return x
261263

262264
def get_optimizer():
263-
return fluid.optimizer.MomentumOptimizer(args.lr, 0.9)
265+
return paddle.optimizer.Momentum(args.lr, 0.9)
264266

265267
if args.use_pact:
266268
act_preprocess_func = pact
@@ -294,11 +296,7 @@ def get_optimizer():
294296
args.pretrained_model), "pretrained_model doesn't exist"
295297

296298
if args.pretrained_model:
297-
298-
def if_exist(var):
299-
return os.path.exists(os.path.join(args.pretrained_model, var.name))
300-
301-
fluid.io.load_vars(exe, args.pretrained_model, predicate=if_exist)
299+
paddle.static.load(train_prog, args.pretrained_model, exe)
302300

303301
def test(epoch, program):
304302
batch_id = 0
@@ -325,44 +323,42 @@ def test(epoch, program):
325323
np.mean(np.array(acc_top1_ns)), np.mean(np.array(acc_top5_ns))))
326324
return np.mean(np.array(acc_top1_ns))
327325

328-
def train(epoch, compiled_train_prog):
326+
def train(epoch, compiled_train_prog, lr):
329327

330328
batch_id = 0
331329
for data in train_loader():
332330
start_time = time.time()
333-
lr_n, loss_n, acc_top1_n, acc_top5_n = exe.run(
331+
loss_n, acc_top1_n, acc_top5_n = exe.run(
334332
compiled_train_prog,
335333
feed=data,
336-
fetch_list=[
337-
learning_rate.name, avg_cost.name, acc_top1.name,
338-
acc_top5.name
339-
])
334+
fetch_list=[avg_cost.name, acc_top1.name, acc_top5.name])
340335

341336
end_time = time.time()
342-
lr_n = np.mean(lr_n)
343337
loss_n = np.mean(loss_n)
344338
acc_top1_n = np.mean(acc_top1_n)
345339
acc_top5_n = np.mean(acc_top5_n)
346340
if batch_id % args.log_period == 0:
347341
_logger.info(
348342
"epoch[{}]-batch[{}] lr: {:.6f} - loss: {:.6f}; acc_top1: {:.6f}; acc_top5: {:.6f}; time: {:.3f}".
349-
format(epoch, batch_id, lr_n, loss_n, acc_top1_n,
343+
format(epoch, batch_id,
344+
learning_rate.get_lr(), loss_n, acc_top1_n,
350345
acc_top5_n, end_time - start_time))
351346

352347
if args.use_pact and batch_id % 1000 == 0:
353348
threshold = {}
354349
for var in val_program.list_vars():
355350
if 'pact' in var.name:
356-
array = np.array(fluid.global_scope().find_var(var.name)
357-
.get_tensor())
351+
array = np.array(paddle.static.global_scope().find_var(
352+
var.name).get_tensor())
358353
threshold[var.name] = array[0]
359354
_logger.info(threshold)
360355
batch_id += 1
356+
lr.step()
361357

362-
build_strategy = fluid.BuildStrategy()
358+
build_strategy = paddle.static.BuildStrategy()
363359
build_strategy.enable_inplace = False
364360
build_strategy.fuse_all_reduce_ops = False
365-
exec_strategy = fluid.ExecutionStrategy()
361+
exec_strategy = paddle.static.ExecutionStrategy()
366362
compiled_train_prog = compiled_train_prog.with_data_parallel(
367363
loss_name=avg_cost.name,
368364
build_strategy=build_strategy,
@@ -377,37 +373,38 @@ def train(epoch, compiled_train_prog):
377373
ckpt_path = args.checkpoint_dir
378374
assert args.checkpoint_epoch is not None, "checkpoint_epoch must be set"
379375
start_epoch = args.checkpoint_epoch
380-
fluid.io.load_persistables(
376+
paddle.static.load_vars(
381377
exe, dirname=args.checkpoint_dir, main_program=val_program)
382378
start_step = start_epoch * int(
383379
math.ceil(float(args.total_images) / args.batch_size))
384-
v = fluid.global_scope().find_var('@LR_DECAY_COUNTER@').get_tensor()
380+
v = paddle.static.global_scope().find_var(
381+
'@LR_DECAY_COUNTER@').get_tensor()
385382
v.set(np.array([start_step]).astype(np.float32), place)
386383

387384
best_eval_acc1 = 0
388385
best_acc1_epoch = 0
389386
for i in range(start_epoch, args.num_epochs):
390-
train(i, compiled_train_prog)
387+
train(i, compiled_train_prog, learning_rate)
391388
acc1 = test(i, val_program)
392389
if acc1 > best_eval_acc1:
393390
best_eval_acc1 = acc1
394391
best_acc1_epoch = i
395392
_logger.info("Best Validation Acc1: {:.6f}, at epoch {}".format(
396393
best_eval_acc1, best_acc1_epoch))
397-
fluid.io.save_persistables(
394+
paddle.static.save(
398395
exe,
399396
dirname=os.path.join(args.output_dir, str(i)),
400397
main_program=val_program)
401398
if acc1 > best_acc1:
402399
best_acc1 = acc1
403400
best_epoch = i
404-
fluid.io.save_persistables(
401+
paddle.static.save(
405402
exe,
406403
dirname=os.path.join(args.output_dir, 'best_model'),
407404
main_program=val_program)
408405

409406
if os.path.exists(os.path.join(args.output_dir, 'best_model')):
410-
fluid.io.load_persistables(
407+
paddle.static.load(
411408
exe,
412409
dirname=os.path.join(args.output_dir, 'best_model'),
413410
main_program=val_program)
@@ -430,7 +427,7 @@ def train(epoch, compiled_train_prog):
430427
if not os.path.isdir(model_path):
431428
os.makedirs(model_path)
432429

433-
fluid.io.save_inference_model(
430+
paddle.static.save_inference_model(
434431
dirname=float_path,
435432
feeded_var_names=[image.name],
436433
target_vars=[out],

0 commit comments

Comments
 (0)