将经过训练的模型转换为在Tensorflow中使用混合精度



为了提高训练模型的延迟,我尝试使用Tensorflow混合精度。

只是设置中提到的策略https://www.tensorflow.org/guide/mixed_precision似乎并没有提高模型的速度:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras import mixed_precision
policy = mixed_precision.Policy('mixed_float16')
mixed_precision.set_global_policy(policy)

但当我在其他CNN网络上尝试一个玩具示例时,我发现如果我使用混合精度训练模型,速度会增加x2倍。

我试图避免用混合精度重新训练模型,因为我使用的模型非常复杂,将其转换为适合混合精度的模型不是一件容易的事。

有没有一种方法可以将已经训练好的转换为真正在混合精度模式下工作(当然也可以获得混合精度加速(?

要提高训练模型的延迟,可以尝试OpenVINO。这是一个经过大量优化的推理工具包。然而,它可以使用英特尔的硬件,如CPU和iGPU(将GPU集成到CPU中,如英特尔高清显卡(,而不是英伟达GPU,但我认为值得一试。以下是一些性能基准。

将Keras模型转换为OpenVINO是相当简单的,除非你有花哨的自定义层。关于如何做到这一点的完整教程可以在这里找到。下面的一些片段。

安装OpenVINO

最简单的方法是使用PIP。或者,您可以使用此工具在您的情况下找到最佳方法。

pip install openvino-dev[tensorflow2]

将您的模型另存为SavedModel

OpenVINO无法转换HDF5模型,因此必须先将其保存为SavedModel。

import tensorflow as tf
from custom_layer import CustomLayer
model = tf.keras.models.load_model('model.h5', custom_objects={'CustomLayer': CustomLayer})
tf.saved_model.save(model, 'model')

使用模型优化器转换SavedModel模型

模型优化器是来自OpenVINO开发包的命令行工具。它将Tensorflow模型转换为IR,这是OpenVINO的默认格式。您也可以尝试FP16的精度,它应该会在精度没有显著下降的情况下为您提供更好的性能(只需更改data_type(。在命令行中运行:

mo --saved_model_dir "model" --input_shape "[1, 3, 224, 224]" --data_type FP32 --output_dir "model_ir"

运行推断

转换后的模型可以由运行时加载,并针对特定设备进行编译,例如CPU或GPU(集成到您的CPU中,如Intel HD Graphics(。如果你不知道什么是最适合你的选择,只需使用AUTO。

# Load the network
ie = Core()
model_ir = ie.read_model(model="model_ir/model.xml")
compiled_model_ir = ie.compile_model(model=model_ir, device_name="CPU")
# Get output layer
output_layer_ir = compiled_model_ir.output(0)
# Run inference on the input image
result = compiled_model_ir([input_image])[output_layer_ir]

免责声明:我在OpenVINO工作。

最新更新