如何利用量化技术为边缘设备浓缩深度学习模型

185 阅读7分钟

量化 深度学习机器学习模型部署到边缘设备上的过程,如智能手机、智能电视、智能手表等等。但由于内存的限制,在边缘设备上部署庞大的模型是不可能的,这就是量化过程的运用。它浓缩了巨大的模型,使其能够完美地部署在边缘设备上。本文简要介绍了如何使用TensorFlow lite和Tensorflow ModelOptimization将庞大的Tensorflow模型浓缩为轻量级模型。

目录

  1. 量化简介
  2. 不同类型的量化技术
  3. 从头开始建立一个深度学习模型
  4. 训练后量化技术的实现
  5. 感知模型量化技术的实现
  6. 比较原始模型和量化模型的预测结果
  7. 总结

量化技术简介

关于深度学习的量化是将通过各层传播后获得的神经网络权重近似为最接近的整数值或更低的比特数的过程。这种转换有利于任何沉重的深度学习模型轻松地在边缘设备上无缝部署,因为沉重的模型现在将被浓缩为较轻的模型,模型的结果可以在边缘设备上可视化。

在智能设备等较低的处理单元上运行较重的深度学习模型所带来的差异是通过量化来克服的,其中模型的整体内存消耗将被削减到几乎三分之一或四分之一的原始Tensorflow模型权重。

现在让我们来看看不同类型的量化技术。

不同类型的量化技术

对于较重的深度学习模型,主要有两种类型的量化技术,它们是:

  • 训练后量化
  • 感知训练量化

这两种量化技术都是在TensorFlow-lite模块的监督下进行的,该模块用于浓缩较重的模型并将其推送到边缘设备。

培训后量化

在训练后量化技术中,使用Tensorflow-lite模块将较重的TensorFlow模型压缩成较小的模型,在边缘设备中,它可能会被部署为小型Tensorflow模型。但这种量化技术的问题是,只有边缘设备上的模型的内存占用被压缩,但边缘设备上的模型不能用于任何参数,甚至在测试阶段与Tensorflow模型相比,如果在准确性的基础上比较,模型的性能也会降低。所以这种量化技术在生产中会产生一个不可靠的模型,显示出性能不佳的迹象。

意识训练量化

意识到的训练量化技术是用来克服后训练技术的局限性,该技术负责在开发过程中使沉重的TensorFlow模型成熟,通过一个具有明确定义的参数的量化模型,产生一个微调的量化模型,可以传递给Tensorflow-lite模块进行微调,获得一个完整的较轻的Tensorflow模型开发,准备部署在边缘设备上。

从头开始建立一个深度学习模型

在本案例研究中,时尚MNIST数据集被用来构建Tensorflow模型。这个数据集有10类衣服需要分类。因此,让我们来看看如何建立一个深度学习模型来对数据集中的10个类别进行分类。

最初的步骤是从导入所需的TensorFlow库和获取数据集开始。这个数据集在Tensorflow模块中很容易获得,这个数据集必须通过适当地将数据集分割成训练和测试来进行预处理,并执行必要的重塑和编码。一旦有了完整的预处理数据,就可以用所需的层数来建立模型,并用适当的损失函数和指标来编译。有了这一切,模型就可以在所需的迭代次数中进行最后的拟合。

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.layers import Flatten,Dense,Dropout,Conv2D,MaxPooling2D
from tensorflow.keras.models import Sequential
from tensorflow.keras.utils import to_categorical
 
%matplotlib inline
from tensorflow.keras.datasets import fashion_mnist
(X_train,Y_train),(X_test,Y_test)=fashion_mnist.load_data()
plt.figure(figsize=(15,5))
for i in range(10):
 plt.subplot(2,5,i+1)
 plt.imshow(X_train[i])
 plt.axis('off')
plt.show()

所以现在我们已经成功地验证了数据的分割,我们可以继续建立模型:

model1=Sequential()
model1.add(Conv2D(32,kernel_size=2,input_shape=(28,28,1),activation='relu'))
model1.add(MaxPooling2D(pool_size=(2,2)))
model1.add(Conv2D(16,kernel_size=2,activation='relu'))
model1.add(MaxPooling2D(pool_size=(2,2)))
model1.add(Flatten())
model1.add(Dense(125,activation='relu'))
model1.add(Dense(10,activation='softmax'))
model1.summary()

model1.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
model1_fit_res=model1.fit(X_train,Y_train,epochs=10,validation_data=(X_test,Y_test))

print('Model training loss : {} and training accuracy is : {}'.format(model1.evaluate(X_train,Y_train)[0],model1.evaluate(X_train,Y_train)[1]))

print('Model testing loss : {} and testing accuracy is : {}'.format(model1.evaluate(X_test,Y_test)[0],model1.evaluate(X_test,Y_test)[1]))

现在让我们保存这个Tensorflow模型,因为它可以在以后用于量化:

model1.save('TF-Model')

现在让我们看看如何使用保存的模型来实现量化技术。

训练后量化

在执行量化之前,让我们观察一下工作环境中完整的Tensorflow的整体内存占用情况:

tf_lite_conv=tf.lite.TFLiteConverter.from_saved_model('/content/drive/MyDrive/Colab notebooks/Quantization in neural network]/TF-Model')
tf_lite_mod=tf_lite_conv.convert()
print('Memory of the TF Model on the disk is ',len(tf_lite_mod))

执行训练后量化

这个量化技术是通过使用TensorFlow lite模块的默认优化技术来实现的,获得的默认优化将使用转换函数转换为量化模型,使用这个模型我们可以通过训练后优化来验证量化模型的内存占用:

post_tr_conv=tf.lite.TFLiteConverter.from_saved_model("/content/drive/MyDrive/Colab notebooks/Quantization in neural network]/TF-Model")
post_tr_conv.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_quant_model = post_tr_conv.convert()
print('Memory of the Quantized TF Model on the disk is ',len(tflite_quant_model))

因此,在这里我们可以清楚地观察到原始Tensorflow模型和量化模型的内存占用的差异,其中我们可以清楚地看到量化技术已经将原始Tensorflow模型浓缩到原始内存占用的三分之一。但正如前面提到的,这种技术只适合于压缩模型和验证内存占用率。因此,为了更好地评估模型在边缘设备上的性能,我们采用了感知训练量化技术。

自觉模型量化技术的实施

这种量化技术是最有效的量化技术之一,因为它不仅浓缩了较重的模型,而且还产生了可靠的模型性能参数,当浓缩的TensorFlow模型部署在边缘设备上时,也显示出相当的性能。让我们看看这个量化技术的实施步骤:

!pip install tensorflow-model-optimization
import tensorflow_model_optimization as tfmod_opt
quant_aw_model=tfmod_opt.quantization.keras.quantize_model
quant_aw_model_fit=quant_aw_model(model1)

因此,现在我们已经创建了一个量化的模型,我们必须再次用适当的损失函数和度量来编译模型,然后用分割的数据来拟合这个相同的模型:

quant_aw_model_fit.compile(loss='sparse_categorical_crossentropy',metrics=['accuracy'],optimizer='adam')
quant_aw_model_fit.summary()

quant_mod_res=quant_aw_model_fit.fit(X_train,Y_train,epochs=10,validation_data=(X_test,Y_test))

评估量化后的模型参数

print('Quantized Model training loss : {} and training accuracy is : {}'.
 format(quant_aw_model_fit.evaluate(X_train,Y_train)[0],quant_aw_model_fit.evaluate(X_train,Y_train)[1]))

print('Quantized Model testing loss : {} and testing accuracy is : {}'.
     format(quant_aw_model_fit.evaluate(X_test,Y_test)[0],quant_aw_model_fit.evaluate(X_test,Y_test)[1]))

现在,让我们使用一些TensorFlow精简包来验证量化模型和原始Tensorflow模型的内存占用情况:

print('Memory of the TF Model on the disk is ',len(tf_lite_mod))
print()
print('Memory allocation of Quantization Aware Model',len(tflite_qaware_model))

因此,在这里我们可以清楚地看到量化的模型位和原始TensorFlow模型位在内存消耗方面的差异。由于我们也评估了原始Tensorflow模型和量化模型的某些参数,并没有观察到任何性能的下降。为了更好地进行比较,让我们尝试比较Tensorflow和量化模型对不同类型的衣服进行正确分类的能力。

比较原始模型和量化模型的预测结果

y_pred=model1.predict(X_test)
figure = plt.figure(figsize=(15,5))
for i, index in enumerate(np.random.choice(X_test.shape[0], size=15, replace=False)):
   ax = figure.add_subplot(3, 5, i + 1, xticks=[], yticks=[])
   ax.imshow(np.squeeze(X_test[index]))
   predict_index=np.argmax(y_pred[index])
   true_index=Y_test[index]
   ax.set_title("{} ({})".format(labels[predict_index],
                                 labels[true_index]),
                                 color=("green" if predict_index == true_index else "red"))

由于我们已经直观地看到了原始TensorFlow模型对衣服的分类能力,让我们尝试验证量化模型是否存在任何错误的分类,并将其部署到边缘设备的生产中。

y_pred_quant_aw=quant_aw_model_fit.predict(X_test)
figure = plt.figure(figsize=(15,5))
for i, index in enumerate(np.random.choice(X_test.shape[0], size=15, replace=False)):
   ax = figure.add_subplot(3, 5, i + 1, xticks=[], yticks=[])
   ax.imshow(np.squeeze(X_test[index]))
   predict_index=np.argmax(y_pred[index])
   true_index=Y_test[index]
   ax.set_title("{} ({})".format(labels[predict_index],
                                 labels[true_index]),
                                 color=("green" if predict_index == true_index else "red"))

总结

因此,正如本文明确提到的,这就是不同的量化技术是如何将巨大的深度学习模型浓缩成更小的比特,将开发的模式的整体内存占用率降低到模型总内存占用率的三分之一或四分之一,并将其部署在内存相对较低的边缘设备。因此,如果采用量化技术,任何复杂的深度学习模型都可以被压缩成更轻的模型,并被部署在边缘设备上。

参考文献