[Aprendizaje profundo] Cuantificación del modelo - Notas/Experimentos

contenido

1. Método de cuantificación

1. Cuantificación asimétrica

2. Cuantificación simétrica

 3. Cuantificación aleatoria

El tipo de cuantificación

1. Cuantificación dinámica

2. Cuantificación estática

3. Entrenamiento consciente de la cuantización

3. Práctica cuantitativa

1. Configuración experimental

2. Resultados experimentales

3. Código experimental

4. Referencia


Se ha demostrado que el aprendizaje profundo funciona bien en diversas tareas, como la clasificación de imágenes, la detección de objetos, la segmentación semántica, el procesamiento del lenguaje natural, etc. En la implementación industrial, a menudo existen restricciones muy estrictas en el modelo. Para aplicar el modelo de manera más efectiva a dispositivos móviles o dispositivos integrados, es necesario comprimir efectivamente el tamaño del modelo. Hay dos métodos comúnmente utilizados:

(1) Diseñar arquitecturas modelo más efectivas, como mobilenet y squeezenet;

(2) Reducir el tamaño de la red mediante compresión, codificación, etc.

Si el tipo de parámetro del modelo de aprendizaje profundo es FP32, cada valor necesita un espacio de almacenamiento de 32 bits cuando se almacena. Si se convierte a int8 o uint8 para guardar, el tamaño del modelo se reducirá a 1/4. La siguiente tabla muestra el costo de cálculo numérico de diferentes precisiones.Se puede ver que el costo de cálculo del valor de 8 bits es mucho menor que el del cálculo de 32 bits.

1. Método de cuantificación

Métodos de cuantificación: cuantificación asimétrica, cuantificación simétrica, cuantificación aleatoria.

1. Cuantificación asimétrica

 Suponiendo que el rango de entrada de los números de coma flotante es (X_min, X_max), el rango después de la cuantificación es (0, N_levels - 1), para la cuantificación de 8 bits, N_levels es 256, y la fórmula de cálculo de la escala y el punto cero es la siguiente :

\Delta =(X\_max-X\_min)/255

z = -X\_min/\Delta

Después de obtener la escala y el punto cero, para cualquier entrada x, el proceso de cálculo de cuantificación es:

x_{int}=redondo(\frac{x}{\Delta})+z

x_Q=abrazadera(0, N\_niveles-1,x_{inicio})

 La fórmula de cuantificación inversa correspondiente es:

 Nota : para distribuciones unilaterales como (2.5, 3.5), el rango debe relajarse a (0, 3.5) y luego cuantificarse, lo que perderá precisión en el caso de distribuciones unilaterales extremas.

2. Cuantificación simétrica

La fórmula de cálculo de la escala es la siguiente:

\Delta =\frac{max(abs(x))}{N\_niveles-1}

La cuantificación simétrica es relativamente simple, limita el valor cero a 0. La fórmula de cuantificación es la siguiente:

 Fórmula de cuantificación inversa:

 3. Cuantificación aleatoria

La cuantificación aleatoria es similar a la cuantificación asimétrica. La diferencia es que se introduce ruido durante la cuantificación. El cálculo de parámetros y el proceso de cuantificación inversa son los mismos que los de la cuantificación asimétrica, que no se repetirá aquí.

El tipo de cuantificación

Hay tres métodos de cuantificación en pytorch: cuantificación dinámica, cuantificación estática y entrenamiento consciente de la cuantificación.

1. Cuantificación dinámica

Cuando se entrena la red, se ha determinado su valor de peso, por lo que se ha determinado el factor de cuantificación del peso, pero para diferentes valores de entrada, su factor de escala se calcula dinámicamente (el origen de "dinámico"). La cuantificación dinámica tiene el peor rendimiento entre varios métodos de cuantificación.

La cuantificación dinámica se usa a menudo para modelos muy grandes.

2. Cuantificación estática

La diferencia entre la cuantificación estática y la cuantificación dinámica es que el método de cálculo del factor de escala de entrada es diferente. El modelo de cuantificación estática tiene un proceso de ajuste fino (calibración del factor de escala) antes de su uso: prepare parte de la entrada (para el modelo de clasificación de imágenes es para preparar algunas imágenes, otras tareas son similares), use un modelo cuantificado estáticamente para hacer predicciones, durante las cuales el factor de escala del modelo cuantificado se ajusta de acuerdo con la distribución de los datos de entrada.

Una vez que se completa el ajuste fino, los pesos y los factores de escala de entrada se fijan (el origen de "estático"). La cuantificación estática generalmente funciona mejor que la cuantificación dinámica y, a menudo, se usa para modelos medianos y grandes.

3. Entrenamiento consciente de la cuantización

El entrenamiento consciente de la cuantificación (QAT) es el más alto de los tres métodos, inserta la cuantificación estática directamente en el proceso de entrenamiento de la red, eliminando el proceso de calibración después de entrenar la red. Este método reduce la velocidad de entrenamiento, pero puede lograr una mayor precisión.

3. Práctica cuantitativa

Pytorch admite la cuantificación lineal asimétrica de por tensor y por canal. Por tensor significa que todos los valores en el tensor tienen un factor de escala uniforme (escala), y por canal significa que diferentes canales del tensor tienen diferentes factores de escala.

1. Configuración experimental

El entorno experimental es el siguiente:

antorcha==1.11.0

procesador windows 10

gráfico de efectos

En el proceso, el modelo torchvision.models.mobilenet_v2 se usa como modelo de prueba, los parámetros del modelo no se entrenan, solo se usan datos cifar10 para probar la velocidad de funcionamiento del modelo después de la cuantificación, y el modelo se prueba después del fusible.

2. Resultados experimentales

Nota: La cuantificación dinámica no admite la cuantificación convolucional, por lo que solo se cuantifica la capa completamente conectada, por lo que sus parámetros y consumo de tiempo casi no cambian.

Parámetros (tamaño pt, kb) Tiempo (s)
modelo original 8971 68.94
Cuantificación dinámica 8671 68.38
cuantización estática 2293 45.94
Percepción cuantitativa 2293 46.68

3. Código experimental

Hay muchos códigos experimentales. Aquí hay un código de prueba para el entrenamiento consciente de la cuantificación. El resto del código se puede descargar consultando el enlace al final del artículo:

import torch
import torchvision
from torchvision.transforms import ToTensor, Normalize, Compose
from torch.quantization.quantize_fx import convert_fx, prepare_fx, prepare_qat_fx, fuse_fx
import time

transforms = Compose(
    [
        ToTensor(),
        Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
    ]
)

cifar10_dataset = torchvision.datasets.CIFAR10(root='data', transform=transforms, download=False)
data_loader = torch.utils.data.DataLoader(cifar10_dataset,
                                          batch_size=32,
                                          shuffle=True,
                                          num_workers=0)

model = torchvision.models.mobilenet_v2(num_classes=10)
qconfig_dict = {"": torch.quantization.get_default_qat_qconfig('qnnpack')}

model.train()
model_quant = prepare_qat_fx(model, qconfig_dict)

ce_loss = torch.nn.CrossEntropyLoss()
learning_rate = 0.01
optimizer = torch.optim.SGD(model_quant.parameters(), momentum=0.1, lr=learning_rate)
epochs = 1
for i in range(epochs):
    for idx, (image, label) in enumerate(data_loader):
        logits = model_quant(image)
        loss = ce_loss(logits, label)
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()
        if idx % 100:
            print("epochs: {}, loss: ".format(i), loss.detach().numpy())
            break
model_quant = convert_fx(model_quant)

torch.save(model_quant.state_dict(), "model_qat.pt")

model_quant.eval()
model_quant = fuse_fx(model_quant)

beg = time.time()
with torch.no_grad():
    model_quant.eval()
    for idx, (image, label) in enumerate(data_loader):
        logits = model_quant(image)

end = time.time()
print('time consume: ', end - beg)

4. Referencia

1, Una guía fácil de usar para desarrolladores sobre la cuantificación de modelos con PyTorch

2, introducción a la cuantificación en pytorch

3, código de prueba cuantitativa pytorch, mobilenetv2 en la prueba de velocidad cifar10

4. Práctica de cuantificación del modelo NCNN: modelo MODNet de esteras de retrato

Supongo que te gusta

Origin blog.csdn.net/qq_40035462/article/details/123745290
Recomendado
Clasificación