16位模型量化

1. float16模型量化能将模型减少为原来的1/2,在int8量化掉点严重的情况下,可以尝试浮点16位量化

2.量化过程:

1)安装tf-nightly

pip install tf-nightly-gpu==1.15.0.dev20190821

pip install tensorflow-estimator=1.15

注意版本,一定要是1.15,其他版本好像不行,可以用下面的代码进行测试

tf.lite.constants.FLOAT16

如果不报错,说明版本正确,可以进行16位量化

2)生成pb模型,主要有两种方式:

    a)以签名的方式生成pb,模型导出成SavedModel格式,这样就可以直接使用通用的TensorFlow Serving服务,模型导出即可上线不需要改任何代码。不同的模型导出时只要指定输入和输出的signature即可参考链接:https://zhuanlan.zhihu.com/p/34471266

tf.saved_model.predict_signature_def
builder = tf.saved_model.Builder('exports')
    signature_def = tf.saved_model.predict_signature_def(inputs={'image' : image},outputs={'output1':output1,'output2':output2})
    builder.add_meta_graph_and_variables(
                                        sess=sess,
                                        tags=[tf.saved_model.tag_constants.SERVING],
                                        signature_def_map={tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY : signature_def},
                                        saver=saver)
    builder.save()

    b)frozen graph

frozen_graph = tf.graph_util.convert_variables_to_constants(sess=sess,
                                input_graph_def=input_graph_def,
                                output_node_names=output_node_name.split(","))

但是浮点量化只有签名的方式(a)才能行得通,直接frozen尝试过好像不行

3)浮点16位量化,量化后生成tflite模型

     量化过程和int8量化过程基本上差不多,只是部分参数有所差异,具体可参考官方文档:https://www.tensorflow.org/lite/performance/post_training_float16_quant

converter = tf.lite.TFLiteConverter.from_saved_model('./exports',input_arrays=["image_input"],output_arrays=["output1","output2"], input_shapes={"image_input":[768,768,3]},tag_set=[tf.saved_model.tag_constants.SERVING])    # ocr server
    converter.post_training_quantize = True
    converter.target_spec.supported_types = [tf.lite.constants.FLOAT16]
    tflite_models_dir = pathlib.Path("./exports")
    #tflite_models_dir.mkdir(exist_ok=True, parents=True)
    tflite_model_file = tflite_models_dir/"model_fp16.tflite"
    tflite_model_file.write_bytes(converter.convert())

4)tflite模型推理,和int8推理类似,但是输入是float32,输出结果也是float32,不需要做任何的dequantize操作

      小模型(8M左右的Pb)实验结果存在一定的掉点现象,好在掉的不算多,大模型估计几乎不会掉点

你可能感兴趣的:(算法)