PPQ es una herramienta de cuantización de redes neuronal escalable, de alto rendimiento para aplicaciones industriales.
La cuantización de la red neuronal, como una solución de aceleración de red neuronal de uso común, se ha utilizado ampliamente desde 2016. En comparación con la poda de redes neuronales y la búsqueda de arquitectura, la cuantificación de la red es más versátil y tiene un alto valor práctico industrial. Especialmente para el chip del lado final, en escenarios en los que tanto el área en el chip como el consumo de energía son limitados, siempre queremos convertir todas las operaciones de punto flotante en operaciones de punto fijo. El valor de la tecnología cuantitativa radica en el hecho de que la aritmética de punto flotante y la recuperación de la memoria son muy costosos, y se basa en el ancho de banda de obtención de la recolección de memoria de la memoria y la alta memoria de punto flotante complejo. Si podemos aproximar los resultados del punto flotante utilizando una operación de punto fijo con anchos de bits más bajos dentro de un rango aceptable, esto nos dará ventajas significativas en el diseño del circuito de chips, el consumo de energía del sistema, la latencia del sistema y el rendimiento.
Estamos en la marea de los tiempos, y la inteligencia artificial basada en redes neuronales se está desarrollando rápidamente, y las tecnologías como el reconocimiento de imágenes, la super resolución de la imagen, la generación de contenido, la reconstrucción del modelo están cambiando nuestras vidas. Lo que viene con ella es la estructura del modelo en constante cambio, que se ha convertido en la primera dificultad antes de la cuantificación y la implementación del modelo. Para lidiar con estructuras complejas, diseñamos una estructura lógica de gráficos computacional completo y una lógica de programación de gráficos. Estos esfuerzos permiten a PPQ analizar y modificar estructuras de modelos complejas, determinar automáticamente las áreas de cuantización y no cuantización en la red, y permiten a los usuarios controlar manualmente la lógica de programación.
La cuantización y la optimización del rendimiento de la red son serios problemas de ingeniería. Esperamos que los usuarios puedan participar en la cuantización y la implementación de la red y participar en la optimización del rendimiento de la red neuronal. Con este fin, proporcionamos materiales de aprendizaje relacionados con la implementación correspondientes en GitHub, y enfatizamos deliberadamente la flexibilidad de la interfaz en el diseño de software. A través de nuestros intentos y exploraciones continuas, abstraimos el tipo de cuantizador lógico, responsable de inicializar estrategias de cuantización en diferentes plataformas de hardware, y permitimos a los usuarios personalizar el ancho de bit de cuantización, la granularidad de la cuantización y los algoritmos de calibración de cada operador y cada tensor en la red. Reorganizamos la lógica cuantitativa en 27 procesos de optimización cuantitativos independientes. Los usuarios de PPQ pueden combinar arbitrariamente el proceso de optimización de acuerdo con sus necesidades para completar tareas cuantitativas altamente flexibles. Como usuario de PPQ, puede agregar y modificar todos los procesos de optimización de acuerdo con sus necesidades y explorar nuevos límites de la tecnología cuantitativa.
Este es un marco creado para manejar tareas de cuantización complejas: el motor de ejecución de PPQ está especialmente diseñado para la cuantización. A partir de la versión 0.6.6 de PPQ, el software tiene una lógica de ejecución de operador ONNX ONNX incorporada incorporada y admite nativamente las operaciones de simulación cuantitativa durante la ejecución. PPQ puede completar la inferencia y la cuantificación del modelo ONNX sin OnXruntime. Como parte del diseño arquitectónico, permitimos a los usuarios registrar nuevas implementaciones de operadores para PPQ utilizando Python+ Pytorch o C ++ / CUDA, y la nueva lógica también puede reemplazar la lógica de implementación del operador existente. PPQ permite que el mismo operador tenga una lógica de ejecución diferente en diferentes plataformas, lo que respalda la simulación operativa de diferentes plataformas de hardware. Con la ayuda de motores de ejecución personalizados y la implementación de alto rendimiento del núcleo CUDA PPQ, PPQ tiene ventajas de rendimiento extremadamente significativas y, a menudo, puede completar tareas cuantitativas con una eficiencia sorprendente.
El desarrollo de PPQ está estrechamente relacionado con el marco de inferencia, que nos permite comprender muchos detalles de la inferencia de hardware y, por lo tanto, controlar estrictamente los errores de simulación de hardware. Con los esfuerzos conjuntos de muchos trabajadores de código abierto en el hogar y en el extranjero, PPQ actualmente admite un trabajo colaborativo con múltiples marcos de inferencia como Tensorrt, OpenPPL, OpenVino, NCNN, MNN, Onxruntime, Tengine, SNPE, GraphCore, Metax, etc., y cuantificadores correspondientes prefabricados y la logia de exportación. PPQ es un marco de cuantización de modelo altamente escalable. Con la funcionalidad de la función en ppq.lib, puede extender las capacidades de cuantización de PPQ a otras posibles bibliotecas de hardware y razonamiento. Esperamos trabajar con usted para traer inteligencia artificial a miles de hogares.
Instale CUDA en CUDA Toolkit
Instalar cumplido
apt-get install ninja-build # for debian/ubuntu user
yum install ninja-build # for redhat/centos userPara el usuario de Windows:
(1) Descargue ninja.exe desde https://github.com/ninja-build/ninja/releases, agrégalo a la ruta de Windows.
(2) Instale Visual Studio 2019 desde https://visualstudio.microsoft.com.
(3) Agregue su compilador C ++ al entorno de ruta de Windows, si está utilizando Visual Studio, debe ser como "C: Archivos de programa Microsoft Visual Studio 2019 Community VC Tools MSVC 14.16.27023 bin hostx86 x86" "
(4) Actualice la versión de Pytorch a 1.10+.
git clone https://github.com/openppl-public/ppq.git
cd ppq
pip install -r requirements.txt
python setup.py installdocker pull stephen222/ppq:ubuntu18.04_cuda11.4_cudnn8.4_trt8.4.1.5
docker run -it --rm --ipc=host --gpus all --mount type=bind,source=your custom path,target=/workspace stephen222/ppq:ubuntu18.04_cuda11.4_cudnn8.4_trt8.4.1.5 /bin/bash
git clone https://github.com/openppl-public/ppq.git
cd ppq
export PYTHONPATH= ${PWD} : ${PYTHONPATH}python3 -m pip install ppq| Descripción | Enlace | |
|---|---|---|
| 01 | Cuantización del modelo | Onnx, Caffe, Pytorch |
| 02 | Solenoide | ejecutor |
| 03 | Análisis de errores | analizador |
| 04 | Calibrador | Calibración |
| 05 | Network Finuning | afinar |
| 06 | Programación de redes | despacho |
| 07 | Mejores prácticas | Mejor práctica |
| 08 | Plataforma objetivo | plataforma |
| 09 | Proceso de optimización | Óptimo |
| 10 | Fusión de imágenes | Fusión |
| Descripción | Enlace | |
|---|---|---|
| 01 | Quantsimplifypass (proceso de racionalización cuantitativa general) | doc |
| 02 | QuantfusionPass (proceso de fusión de gráficos cuantitativos generales) | doc |
| 03 | CantalignmentPass (proceso general de alineación de cuantificación) | doc |
| 04 | RuntimeCalibrationPass (proceso de calibración de parámetros) | doc |
| 05 | BiascorrectionPass (proceso de corrección de sesgo) | doc |
| 06 | Quantsimplifypass (proceso de racionalización cuantitativa general) | doc |
| 07 | LayerwiseequalizationPass (proceso de ecualización de peso entre capas) | doc |
| 08 | Capaspilitpass (proceso de división del operador) | doc |
| 09 | LearnstepSizePass (proceso de ajuste fino de la red) | doc |
| 10 | Otro (otro) | Referirse a |
| Introducción de Desc | Enlace | |
|---|---|---|
| 01 | Conceptos básicos de la arquitectura informática | enlace |
| 02 | Análisis de rendimiento de la red | enlace |
| 03 | Principio de cálculo cuantitativo | Parte1, parte2 |
| 04 | Optimización de gráficos y simulación cuantitativa | enlace |
| 05 | Programación de gráficos y coincidencia de patrones | enlace |
| 06 | Implementación de la red neuronal | enlace |
| 07 | Selección de parámetros cuantitativos | enlace |
| 08 | Análisis de propagación de errores cuantitativos | enlace |
| Ejemplos | Plataforma de implementación de red (plataforma) | Formato de modelo de entrada (formato) | Enlace (enlace) | Videos relacionados (video) |
|---|---|---|---|---|
TensorRT | ||||
| Use Torch2Trt para acelerar su red | pytorch | pytorch | enlace | enlace |
| Entrenamiento cuantitativo tensorrt | Tensor | pytorch | enlace | enlace |
| Cuantización de post-entrenamiento tensorrt (PPQ) | Tensor | ONNX | 1. Quant con tensorrt onnxparser 2. Quant con API Tensorrt | |
| Despliegue Tensorrt FP32 | Tensor | ONNX | enlace | enlace |
| Comparación de rendimiento de Tensorrt | Tensor | pytorch | enlace | enlace |
| Tensorrt Profiler | Tensor | pytorch | enlace | enlace |
onnxruntime | ||||
| Use Onnxruntime para acelerar su red | onnxruntime | ONNX | enlace | enlace |
| Cuantización ONNX posterior a la capacitación (PPQ) | onnxruntime | ONNX | enlace | enlace |
| Comparación de rendimiento de onnxruntime | onnxruntime | pytorch | enlace | enlace |
openvino | ||||
| Use OpenVino para acelerar su red | abierto | ONNX | enlace | |
| Entrenamiento cuantitativo de OpenVino | abierto | pytorch | enlace | |
| Cuantificación posterior al entrenamiento de OpenVino (PPQ) | abierto | ONNX | enlace | |
| Comparación de rendimiento de OpenVino | abierto | pytorch | enlace | |
snpe | ||||
| Cuantización de entrenamiento posterior a SNPE (PPQ) | snpe | cafetería | enlace | |
ncnn | ||||
| Cuantización posterior al entrenamiento de NCNN (PPQ) | ncnn | ONNX | enlace | |
OpenPPL | ||||
| Cuantización PPL CUDA posterior a la capacitación (PPQ) | PPL CUDA | ONNX | enlace |
| Introducción de Desc | Enlace | |
|---|---|---|
| 01 | Proceso de ejecución cuantitativa de PPQ | enlace |
| 02 | Análisis de red PPQ | enlace |
| 03 | Programación de gráficos cuantitativos de PPQ | enlace |
| 04 | Plataforma de destino PPQ y TQC | enlace |
| 05 | Cuantizador PPQ | enlace |
| 06 | Proceso de optimización cuantitativa de PPQ | enlace |
| 07 | Función cuantitativa de PPQ | enlace |
| Cuenta oficial de WeChat | Grupo QQ |
|---|---|
| OpenPPL | 627853444 |
![]() | ![]() |
Correo electrónico: [email protected]
Apreciamos todas las contribuciones. Si planea contribuir con las correcciones de errores, hágalo sin más discusión.
Si planea contribuir con nuevas funciones, funciones de utilidad o extensiones al núcleo, primero abra un problema y discuta la función con nosotros. Enviar un PR sin discusión podría terminar resultando en un PR rechazado porque podríamos estar tomando el núcleo en una dirección diferente de lo que podría tener en cuenta.
PPQ se prueba con modelos de MMLAB-Classification, MMLAB-Detection, MMLAB-Segentation, MMLAB-editing, aquí enumeramos parte del resultado de las pruebas.
| Modelo | Tipo | Calibración | Transportista | Métrico | PPQ (SIM) | Pplcuda | FP32 |
|---|---|---|---|---|---|---|---|
| Resnet-18 | Clasificación | 512 IMGS | Conservador | Top-1 | 69.50% | 69.42% | 69.88% |
| Resnext-101 | Clasificación | 512 IMGS | Conservador | Top-1 | 78.46% | 78.37% | 78.66% |
| SE-Resnet-50 | Clasificación | 512 IMGS | Conservador | Top-1 | 77.24% | 77.26% | 77.76% |
| Shufflenetv2 | Clasificación | 512 IMGS | Conservador | Top-1 | 69.13% | 68.85% | 69.55% |
| Mobilenetv2 | Clasificación | 512 IMGS | Conservador | Top-1 | 70.99% | 71.1% | 71.88% |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| retinanet | Detección | 32 IMGS | pplnn | bbox_map | 36.1% | 36.1% | 36.4% |
| FASTER_RCNN | Detección | 32 IMGS | pplnn | bbox_map | 36.6% | 36.7% | 37.0% |
| FSAF | Detección | 32 IMGS | pplnn | bbox_map | 36.5% | 36.6% | 37.4% |
| MASK_RCNN | Detección | 32 IMGS | pplnn | bbox_map | 37.7% | 37.6% | 37.9% |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| profundoBV3 | Segmentación | 32 IMGS | Conservador | AACC / MIOU | 96.13% / 78.81% | 96.14% / 78.89% | 96.17% / 79.12% |
| profundo | Segmentación | 32 IMGS | Conservador | AACC / MIOU | 96.27% / 79.39% | 96.26% / 79.29% | 96.29% / 79.60% |
| FCN | Segmentación | 32 IMGS | Conservador | AACC / MIOU | 95.75% / 74.56% | 95.62% / 73.96% | 95.68% / 72.35% |
| PSPNET | Segmentación | 32 IMGS | Conservador | AACC / MIOU | 95.79% / 77.40% | 95.79% / 77.41% | 95.83% / 77.74% |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| srcnn | Edición | 32 IMGS | Conservador | PSNR / SSIM | 27.88% / 79.70% | 27.88% / 79.07% | 28.41% / 81.06% |
| esrgan | Edición | 32 IMGS | Conservador | PSNR / SSIM | 27.84% / 75.20% | 27.49% / 72.90% | 27.51% / 72.84% |

Este proyecto se distribuye bajo la licencia Apache, versión 2.0.