def func_out_scale_acc(self): seed = 1000 lr = 0.001 weight_quantize_type = 'abs_max' activation_quantize_type = 'moving_average_abs_max' imperative_out_scale = ImperativeQuantAware( weight_quantize_type=weight_quantize_type, activation_quantize_type=activation_quantize_type) with fluid.dygraph.guard(): np.random.seed(seed) fluid.default_main_program().random_seed = seed fluid.default_startup_program().random_seed = seed lenet = ImperativeLenet() lenet = fix_model_dict(lenet) imperative_out_scale.quantize(lenet) reader = paddle.batch(paddle.dataset.mnist.test(), batch_size=32, drop_last=True) adam = AdamOptimizer(learning_rate=lr, parameter_list=lenet.parameters()) loss_list = train_lenet(lenet, reader, adam) lenet.eval() param_save_path = "test_save_quantized_model/lenet.pdparams" save_dict = lenet.state_dict() paddle.save(save_dict, param_save_path) save_path = "./dynamic_outscale_infer_model/lenet" imperative_out_scale.save_quantized_model( layer=lenet, path=save_path, input_spec=[ paddle.static.InputSpec(shape=[None, 1, 28, 28], dtype='float32') ]) for i in range(len(loss_list) - 1): self.assertTrue(loss_list[i] > loss_list[i + 1], msg='Failed to do the imperative qat.')
def test_save_quantized_model(self): lr = 0.001 load_param_path = "test_save_quantized_model/lenet.pdparams" save_path = "./dynamic_outscale_infer_model_from_checkpoint/lenet" weight_quantize_type = 'abs_max' activation_quantize_type = 'moving_average_abs_max' imperative_out_scale = ImperativeQuantAware( weight_quantize_type=weight_quantize_type, activation_quantize_type=activation_quantize_type) with fluid.dygraph.guard(): lenet = ImperativeLenet() load_dict = paddle.load(load_param_path) imperative_out_scale.quantize(lenet) lenet.set_dict(load_dict) reader = paddle.batch( paddle.dataset.mnist.test(), batch_size=32, drop_last=True) adam = AdamOptimizer( learning_rate=lr, parameter_list=lenet.parameters()) loss_list = train_lenet(lenet, reader, adam) lenet.eval() imperative_out_scale.save_quantized_model( layer=lenet, path=save_path, input_spec=[ paddle.static.InputSpec( shape=[None, 1, 28, 28], dtype='float32') ]) for i in range(len(loss_list) - 1): self.assertTrue( loss_list[i] > loss_list[i + 1], msg='Failed to do the imperative qat.')
def func_out_scale_acc(self): paddle.disable_static() seed = 1000 lr = 0.1 qat = ImperativeQuantAware() np.random.seed(seed) reader = paddle.batch(paddle.dataset.mnist.test(), batch_size=512, drop_last=True) lenet = ImperativeLenetWithSkipQuant() lenet = fix_model_dict(lenet) qat.quantize(lenet) adam = AdamOptimizer(learning_rate=lr, parameter_list=lenet.parameters()) dynamic_loss_rec = [] lenet.train() loss_list = train_lenet(lenet, reader, adam) lenet.eval() path = "./save_dynamic_quant_infer_model/lenet" save_dir = "./save_dynamic_quant_infer_model" qat.save_quantized_model(layer=lenet, path=path, input_spec=[ paddle.static.InputSpec( shape=[None, 1, 28, 28], dtype='float32') ]) paddle.enable_static() if core.is_compiled_with_cuda(): place = core.CUDAPlace(0) else: place = core.CPUPlace() exe = fluid.Executor(place) [inference_program, feed_target_names, fetch_targets] = (fluid.io.load_inference_model( dirname=save_dir, executor=exe, model_filename="lenet" + INFER_MODEL_SUFFIX, params_filename="lenet" + INFER_PARAMS_SUFFIX)) model_ops = inference_program.global_block().ops conv2d_count, matmul_count = 0, 0 conv2d_skip_count, matmul_skip_count = 0, 0 find_conv2d = False find_matmul = False for i, op in enumerate(model_ops): if op.type == 'conv2d': find_conv2d = True if op.has_attr("skip_quant"): conv2d_skip_count += 1 if conv2d_count > 0: self.assertTrue( 'fake_quantize_dequantize' in model_ops[i - 1].type) else: self.assertTrue( 'fake_quantize_dequantize' not in model_ops[i - 1].type) conv2d_count += 1 if op.type == 'matmul': find_matmul = True if op.has_attr("skip_quant"): matmul_skip_count += 1 if matmul_count > 0: self.assertTrue( 'fake_quantize_dequantize' in model_ops[i - 1].type) else: self.assertTrue( 'fake_quantize_dequantize' not in model_ops[i - 1].type) matmul_count += 1 if find_conv2d: self.assertTrue(conv2d_skip_count == 1) if find_matmul: self.assertTrue(matmul_skip_count == 1)