Resumen de los métodos de compresión del modelo pytorch
1. La escala y el punto cero de la función torch.quantize_per_tensor() deben ser configurados por usted mismo.
La llamada dinámica significa que la función torch.quantization.quantize_dynamic seleccionará automáticamente la escala y el punto cero más apropiados.
QuantStub utiliza un HistogramObserver y se basa en la distribución de entrada de . El observador de histograma calcula que min_val y max_val son -3 y 2 respectivamente.
QuantStub usa HistogramObserver Según la distribución de entrada, HistogramObserver calcula que min_val y max_val son -3 y 2.9971 respectivamente, qmin y qmax son respectivamente. 0 y 127, sus modos son per_tensor_affine, por lo que aplicando la lógica per_tensor_affine anterior, obtenemos:
QuantStub usa HistogramObserver Según la distribución de entrada, HistogramObserver calcula que min_val y max_val son -3 y 2.9971, qmin y. qmax respectivamente son 0 y 127 respectivamente. p> La cuantificación dinámica posterior al entrenamiento, denominada cuantificación dinámica, se refiere a cuantificar los parámetros de ciertas operaciones en el modelo en INT8 por adelantado, luego cuantificar dinámicamente la entrada a INT8 en tiempo de ejecución y luego cuantificar dinámicamente la entrada en tiempo de ejecución. INT8, luego cuantice el resultado nuevamente a float32 en la salida de la operación actual. De forma predeterminada, la cuantificación dinámica solo funciona en variantes lineales y RNN.
Al convertir todo el modelo, solo se convierten las siguientes operaciones de forma predeterminada:
Lineal
LSTM
LSTMCell
RNNCell
GRUCell
¿Por qué? Debido a que la cuantificación dinámica solo cuantifica parámetros ponderados, y estas capas generalmente tienen una gran cantidad de parámetros, y los parámetros representan una proporción muy alta en todo el modelo, el beneficio marginal es muy alto. La cuantización dinámica de otras capas casi no tiene significado real.
En lugar de describir qué es la cuantificación estática post-entrenamiento, primero expliquemos las similitudes y diferencias entre la cuantificación estática y la cuantificación dinámica. Lo mismo es que ambos convierten los parámetros de peso de la red de float32 a int8, la diferencia es que necesita ingresar un conjunto de entrenamiento o datos similares a la distribución del conjunto de entrenamiento en el modelo (tenga en cuenta que no hay retropropagación). y luego de acuerdo con cada Las características de distribución de cada entrada operacional calculan los parámetros de cuantificación de activación (escala y zp), llamados Calibrar. -llamado calibración. Sí, la cuantificación estática incluye activación y la activación es un posprocesamiento, después de la operación previa. ¿Por qué es necesario activar la cuantificación estática? Debido a que el proceso de inferencia directa de cuantificación estática es un cálculo INT desde (inicio+1) hasta (final-1), se necesita activación para garantizar que la entrada de una operación coincida con la entrada de la siguiente operación.
PyTorch utilizará un proceso de cinco partes para lograr la cuantificación estática del modelo:
Este paso no es entrenamiento.
Este paso no es entrenamiento, sino obtener las características de distribución de los datos para calcular mejor la proporción de activación y zp.
Cada tensor y cada canal alimenta datos durante al menos unos cientos de iteraciones.
Cada tensor significa que todos los valores en el tensor se escalan y compensan de la misma manera; canal significa que los valores en una dimensión del tensor (generalmente la dimensión del canal) se escalan y compensan de manera que:
Todos los valores en cada tensor se escalan de la misma manera y compensaciones; cada canal es una forma en que los valores en una dimensión del tensor (generalmente la dimensión del canal) se escalan y compensan, hay muchas escalas y compensaciones diferentes en la forma del tensor (formando un vector), por lo que la cuantificación plantea menos problemas que los métodos por tensor. PyTorch actualmente admite la cuantificación por canal utilizando conv2d(), conv3d() y linear().