Poda, cuantificación e inferencia de TensorRT del modelo de aprendizaje profundo

Poda, cuantificación e inferencia de TensorRT del modelo de aprendizaje profundo

Algoritmo de poda de modelo

        Repensar el valor de la poda de red Este documento presenta principalmente los siguientes algoritmos de poda y el código de fuente abierta en github, probado en los conjuntos de datos ImageNet y cifar, el documento también verificó y comparó el modelo de poda Realice un ajuste fino y reentrene la precisión de la red basado en la estructura de la red podada En la precisión proporcionada por el autor, en general, para la red de clasificación, la precisión del entrenamiento de novo es mayor que la precisión del ajuste fino después de la poda.

Poda de estructura de red predefinida

Método de poda referencias github Principio de poda
Poda de filtro basada en la norma L1 Filtros de poda para conversiones eficientes poda-norma-l1 En cada capa convolucional, de acuerdo con el tamaño de la norma L1 del valor de peso del núcleo de convolución, se recorta el porcentaje correspondiente del número de canales.
ThiNet ThiNet: un método de reducción de nivel de filtro para la compresión de redes neuronales profundas https://github.com/Roll920/ThiNet Al podar, la poda no se realiza de acuerdo con la capa actual, pero se poda el valor de peso que tiene el menor impacto en el valor de activación de la siguiente capa convolucional.
Reconstrucción de características basada en regresión Poda de canales para acelerar redes neuronales muy profundas https://github.com/yihui-he/channel-pruning De acuerdo con el algoritmo de regresión LASSO, se seleccionan los canales de la capa convolucional representativos, se reducen las ramas para eliminar los canales redundantes y se utiliza el método de mínimos cuadrados para reconstruir los canales restantes.

Poda automática de la estructura de la red

Método de poda referencias github Principio de poda
Red de adelgazamiento (1) Aprendizaje de redes convolucionales eficientes a través del adelgazamiento de la red
(2) SlimYOLOv3: más estrecho, más rápido y mejor para aplicaciones UAV en tiempo real
(1) adelgazamiento de la red
(2) https://github.com/PengyiZhang/SlimYOLOv3
Durante la poda, penalice los parámetros gamma de la capa BN para un entrenamiento escaso. Al podar, seleccione los parámetros con valores gamma más grandes de la capa BN después del entrenamiento escaso para retener
Selección de estructura dispersa Selección de estructura dispersa basada en datos para redes neuronales profundas https://github.com/TuSimple/sparse-structure-selection Además del entrenamiento escaso del canal, también se puede realizar un entrenamiento escaso del módulo residual.
  • Código de entrenamiento escaso
def updateBN():
    for m in model.modules():
        if isinstance(m, nn.BatchNorm2d):
            m.weight.grad.data.add_(args.s*torch.sign(m.weight.data))
  • Nota: La estrategia de poda para el canal del módulo residual debe tenerse en cuenta al podar. El esquema no incluye poda (menos parámetros restados) o poda de acuerdo con una determinada capa del módulo residual, y también hay una estrategia de poda para todos los canales residuales. La mascarilla realiza una operación OR. El efecto de la poda se muestra en la siguiente figura Al podar, el número de canales de las dos capas convolucionales conectadas por atajo debe ser igual.
  • Cuando se utiliza el algoritmo de adelgazamiento de la red, cada capa convolucional debe tener al menos 1 canal restante.
    Inserte la descripción de la imagen aquí

Algoritmo de cuantificación TensorRT int8

Conexión de referencia: inferencia de 8 bits con TensorRT

Resumen cuantitativo

  • Objetivo: convertir la red neuronal convolucional fp32 en int8 sin causar una pérdida obvia de precisión;
  • Razón: el método int8 tiene un mayor rendimiento y menores requisitos de memoria;
  • Desafío: la precisión y el rango dinámico de int8 son significativamente más bajos que fp32;
  Gama dinámica Precisión mínima
fp32 -3,4 x 10 38 ~ +3,4 x 10 38 1,4 x 10 -45
fp16 -65504 ~ +65504 5,96 x 10 -8
int8 -128 ~ +127 1
  • Solución: Minimice la pérdida de información cuando el peso del modelo entrenado se convierte en int8 y cuando int8 se calcula y activa;
  • Resultado: el método int8 está implementado en TensorRT y no requiere ningún ajuste fino o reentrenamiento adicional.
  • Pregunta:
    ¿Por qué cuantificar y no usar int8 para entrenamiento directo?
    El entrenamiento del modelo requiere propagación hacia atrás y descenso de gradiente. Los hiperparámetros durante el entrenamiento son generalmente tipos de punto flotante, como la tasa de aprendizaje, etc.

Cuantización lineal

Fórmula:
Tensor Values = fp32 scale factor * int8 array

De acuerdo con la fórmula de cuantificación, solo se puede usar el factor de escala fp32 para la cuantificación int8, entonces, ¿cómo encontrar el factor de escala fp32?
Inserte la descripción de la imagen aquí

        Como se puede ver en la figura anterior, hay dos métodos de cuantificación int8, uno es mapeo insaturado (izquierda) y el otro es mapeo saturado (derecha). Después de la verificación, el mapeo insaturado causará una gran pérdida de precisión. La razón es que las distribuciones positivas y negativas calculadas por la capa convolucional son muy desiguales. Si se utiliza el mapeo insaturado simétrico (la intención original es retener la mayor cantidad de información original como sea posible), entonces hay un área en el lado + max que se desperdicia. Es decir, después de que la escala es int8, el rango dinámico de int8 es aún menor. Un ejemplo del límite es que no hay muestras positivas después de la cuantificación, y todos los negativos se apilan en un pequeño Cerca del valor, esto provocará una grave pérdida de precisión. El método de mapeo de saturación consiste en encontrar primero un umbral T y mapear todos los valores por debajo del umbral más bajo a -127, como se muestra en los tres puntos rojos a la izquierda de la imagen superior derecha.

¿Cómo elegir el umbral de cuantificación?

1. Pasos de calibración:

  • Realice una inferencia de fp32 en el conjunto de datos de calibración.
  • Para cada capa convolucional:
    • Recopile histogramas activados;
    • Genere distribuciones cuantificadas con diferentes umbrales de saturación;
    • Elija un umbral que minimice la divergencia de KL.
  • En general, todo el proceso de calibración toma unos minutos.

2. Selección del conjunto de datos de calibración:

  • Representante
  • diversificación
  • Idealmente, un subconjunto del conjunto de datos de validación
  • 1000+ muestras

Modelo de aprendizaje profundo para TensorRT

[1] Entrenamiento de PyTorch del modelo de aprendizaje profundo y transferencia a ONNX y la implementación de TensorRT
[2] Modelo de darknet YOLOv4 a ONNX a la implementación de TensorRT
[3] Modelo de yolov5 PyTorch a TensorRT
[4] Modelo de CenterFace a TensorRT
[5] Modelo de RetinaFace MXNet a ONNX a TensorRT

Supongo que te gusta

Origin blog.csdn.net/linghu8812/article/details/109585506
Recomendado
Clasificación