O PPQ é uma ferramenta escalável de quantização de rede neural de alto desempenho para aplicações industriais.
A quantização da rede neural, como uma solução de aceleração de rede neural comumente usada, tem sido amplamente utilizada desde 2016. Comparado com a poda de rede neural e a pesquisa de arquitetura, a quantização da rede é mais versátil e possui alto valor prático industrial. Especialmente para o chip do lado final, em cenários em que a área do chip e o consumo de energia são limitados, sempre queremos converter todas as operações de ponto flutuante em operações de ponto fixo. O valor da tecnologia quantitativa reside no fato de que a aritmética e a busca de memória de ponto flutuante são muito caras e depende de aritmética de ponto flutuante complexo e alta largura de banda de memória. Se pudermos aproximar os resultados do ponto flutuante usando uma operação de ponto fixo com larguras de bits mais baixas dentro de um intervalo aceitável, isso nos dará vantagens significativas no projeto do circuito de chip, consumo de energia do sistema, latência e taxa de transferência do sistema.
Estamos na maré dos tempos, e a inteligência artificial baseada nas redes neurais está se desenvolvendo rapidamente, e tecnologias como reconhecimento de imagem, super resolução de imagem, geração de conteúdo e reconstrução do modelo estão mudando nossas vidas. O que vem com isso é a estrutura de modelo em constante mudança, que se tornou a primeira dificuldade antes da quantificação e implantação do modelo. Para lidar com estruturas complexas, projetamos uma estrutura completa da lógica de gráfico computacional e a lógica de agendamento de gráficos. Esses esforços permitem que o PPQ analise e modifique estruturas de modelos complexos, determine automaticamente as áreas de quantização e não quantização da rede e permitem que os usuários controlem manualmente a lógica de agendamento.
A quantização e otimização do desempenho da rede são sérios problemas de engenharia. Esperamos que os usuários possam participar da quantização e implantação da rede e participar da otimização de desempenho da rede neural. Para isso, fornecemos materiais de aprendizagem relacionados à implantação correspondentes no GitHub e enfatizamos deliberadamente a flexibilidade da interface no design do software. Por meio de nossas tentativas e explorações contínuas, abstraímos o tipo lógico de quantizador, responsável por inicializar estratégias de quantização em diferentes plataformas de hardware e permitimos que os usuários personalizassem a largura do bit de quantização, a granularidade e os algoritmos de calibração de cada operador e cada tensor na rede. Reorganizamos a lógica quantitativa em 27 processos de otimização quantitativa independentes. Os usuários de PPQ podem combinar arbitrariamente o processo de otimização de acordo com suas necessidades de concluir tarefas quantitativas altamente flexíveis. Como usuário do PPQ, você pode adicionar e modificar todos os processos de otimização de acordo com suas necessidades e explorar novos limites da tecnologia quantitativa.
Esta é uma estrutura criada para lidar com tarefas complexas de quantização - o mecanismo de execução do PPQ é especialmente projetado para quantização. A partir da versão PPQ 0.6.6, o software integrou a lógica de execução do operador ONNX 99 e suporta nativamente as operações de simulação quantitativa durante a execução. O PPQ pode concluir a inferência e quantificação do modelo ONNX sem OnNxRuntime. Como parte do design da arquitetura, permitimos que os usuários registrem novas implementações de operador para PPQ usando o Python+ Pytorch ou C ++ / Cuda, e a nova lógica também pode substituir a lógica de implementação do operador existente. O PPQ permite que o mesmo operador tenha uma lógica de execução diferente em diferentes plataformas, apoiando assim a simulação operacional de diferentes plataformas de hardware. Com a ajuda de mecanismos de execução personalizados e implementação de alto desempenho do kernel PPQ CUDA, o PPQ possui vantagens de desempenho extremamente significativas e geralmente podem concluir tarefas quantitativas com eficiência incrível.
O desenvolvimento do PPQ está intimamente relacionado à estrutura de inferência, o que nos permite entender muitos detalhes da inferência de hardware e, portanto, controlar estritamente os erros de simulação de hardware. Com os esforços conjuntos de muitos trabalhadores de código aberto em casa e no exterior, o PPQ atualmente suporta trabalhos colaborativos com várias estruturas de inferência, como Tensorrt, OpenPPL, Openvino, NCNN, MNN, OnnxRuntime, Tengine, SNPE, GraphCore, Metax, etc., e quantizes de exportação pré -fabricados. O PPQ é uma estrutura de quantização de modelo altamente escalável. Com a funcionalidade da função no PPQ.lib, você pode estender os recursos de quantização do PPQ a outros possíveis bibliotecas de hardware e raciocínio. Estamos ansiosos para trabalhar com você para trazer inteligência artificial a milhares de famílias.
Instale o CUDA do CUDA Toolkit
Instale o complier
apt-get install ninja-build # for debian/ubuntu user
yum install ninja-build # for redhat/centos userPara o usuário do Windows:
(1) Faça o download do ninja.exe em https://github.com/ninja-build/ninja/releases, adicione-o ao caminho do Windows.
(2) Instale o Visual Studio 2019 em https://visualstudio.microsoft.com.
(3) Adicione seu compilador C ++ ao ambiente do Windows Path, se você estiver usando o Visual Studio, deve ser como "C: Arquivos de Programas Microsoft Visual Studio 2019 Community VC Tools MSVC 14.16.27023 bin hostx86 x86"
(4) Atualize a versão pytorch para 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| Descrição | Link de link | |
|---|---|---|
| 01 | Quantização do modelo | Onnx, Caffe, Pytorch |
| 02 | Atuador | executor |
| 03 | Análise de erros | analisador |
| 04 | Calibrador | Calibração |
| 05 | Ajuste fino de rede | afinar |
| 06 | Programação de rede | expedição |
| 07 | Práticas recomendadas | Prática recomendada |
| 08 | Plataforma de destino | plataforma |
| 09 | Processo de otimização | Optim |
| 10 | Fusão de imagem | Fusão |
| Descrição | Link de link | |
|---|---|---|
| 01 | QuantsimplifyPass (processo geral de racionalização quantitativa) | Doc |
| 02 | QuantfusionPass (processo geral de fusão quantitativa de gráfico) | Doc |
| 03 | QuantalignmentPass (processo de alinhamento de quantização geral) | Doc |
| 04 | RunTimecalibrationPass (processo de calibração de parâmetros) | Doc |
| 05 | BiasscorrectionPass (processo de correção de polarização) | Doc |
| 06 | QuantsimplifyPass (processo geral de racionalização quantitativa) | Doc |
| 07 | LayerwiseequalizationPass (processo de equalização de peso entre camadas) | Doc |
| 08 | LayerspilitPass (processo de divisão do operador) | Doc |
| 09 | LeardStepsizePass (processo de ajuste de rede) | Doc |
| 10 | Outro (outro) | Consulte |
| Introdução descendente | Link de link | |
|---|---|---|
| 01 | Noções básicas de arquitetura de computador | link |
| 02 | Análise de desempenho da rede | link |
| 03 | Princípio de cálculo quantitativo | Part1, parte2 |
| 04 | Otimização de gráficos e simulação quantitativa | link |
| 05 | Programação de gráficos e correspondência de padrão | link |
| 06 | Implantação de rede neural | link |
| 07 | Seleção quantitativa de parâmetros | link |
| 08 | Análise quantitativa de propagação de erro | link |
| Exemplos | Plataforma de implantação de rede (plataforma) | Formato do modelo de entrada (formato) | Link (link) | Vídeos relacionados (vídeo) |
|---|---|---|---|---|
TensorRT | ||||
| Use Torch2trt para acelerar sua rede | Pytorch | Pytorch | link | link |
| Treinamento quantitativo tensorrt | Tensorrt | Pytorch | link | link |
| Quantização pós-treinamento Tensorrt (PPQ) | Tensorrt | ONNX | 1. Quant com tensorrt onnxparser 2. Quant com API Tensorrt | |
| Implantação Tensorrt Fp32 | Tensorrt | ONNX | link | link |
| Comparação de desempenho Tensorrt | Tensorrt | Pytorch | link | link |
| Profiler Tensorrt | Tensorrt | Pytorch | link | link |
onnxruntime | ||||
| Use onnxRuntime para acelerar sua rede | OnnxRuntime | ONNX | link | link |
| Quantização pós-treinamento ONNX (PPQ) | OnnxRuntime | ONNX | link | link |
| Comparação de desempenho OnnxRuntime | OnnxRuntime | Pytorch | link | link |
openvino | ||||
| Use OpenVino para acelerar sua rede | Openvino | ONNX | link | |
| Treinamento quantitativo do OpenVino | Openvino | Pytorch | link | |
| Quantificação pós-treinamento OpenVino (PPQ) | Openvino | ONNX | link | |
| Comparação de desempenho OpenVino | Openvino | Pytorch | link | |
snpe | ||||
| Quantização de treinamento pós-SNPE (PPQ) | SNPE | Caffe | link | |
ncnn | ||||
| NCNN Quantização pós-treinamento (PPQ) | ncnn | ONNX | link | |
OpenPPL | ||||
| Quantização pós-treinamento PPL CUDA (PPQ) | ppl cuda | ONNX | link |
| Introdução descendente | Link de link | |
|---|---|---|
| 01 | Processo de execução quantitativa de PPQ | link |
| 02 | Análise de rede PPQ | link |
| 03 | A programação quantitativa de gráficos de PPQ | link |
| 04 | Plataforma de destino PPQ e TQC | link |
| 05 | Quantizer PPQ | link |
| 06 | Processo de otimização quantitativa de PPQ | link |
| 07 | Função quantitativa de PPQ | link |
| Conta oficial do WeChat | Grupo QQ |
|---|---|
| Openppl | 627853444 |
![]() | ![]() |
E -mail: [email protected]
Agradecemos todas as contribuições. Se você planeja contribuir com correções de bugs, faça -o sem nenhuma discussão adicional.
Se você planeja contribuir com novos recursos, funções de utilidade ou extensões até o núcleo, primeiro abra um problema e discuta o recurso conosco. Enviar um PR sem discussão pode acabar resultando em um PR rejeitado, porque podemos estar tomando o núcleo em uma direção diferente da que você pode estar ciente.
O PPQ é testado com modelos de MMLab-Classification, MMLab-Detection, MMLab-Segamentation, MMLab-Editing, aqui listamos parte do resultado do teste.
| Modelo | Tipo | Calibração | Expedidor | Métrica | PPQ (SIM) | Pplcuda | Fp32 |
|---|---|---|---|---|---|---|---|
| Resnet-18 | Classificação | 512 IMGs | Conservador | ACC-TOP-1 | 69,50% | 69,42% | 69,88% |
| Resnext-101 | Classificação | 512 IMGs | Conservador | ACC-TOP-1 | 78,46% | 78,37% | 78,66% |
| SE-RESNET-50 | Classificação | 512 IMGs | Conservador | ACC-TOP-1 | 77,24% | 77,26% | 77,76% |
| Shufflenetv2 | Classificação | 512 IMGs | Conservador | ACC-TOP-1 | 69,13% | 68,85% | 69,55% |
| MobileNetv2 | Classificação | 512 IMGs | Conservador | ACC-TOP-1 | 70,99% | 71,1% | 71,88% |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| Retinnet | Detecção | 32 IMGs | pplnn | bbox_map | 36,1% | 36,1% | 36,4% |
| FASTER_RCNN | Detecção | 32 IMGs | pplnn | bbox_map | 36,6% | 36,7% | 37,0% |
| fsaf | Detecção | 32 IMGs | pplnn | bbox_map | 36,5% | 36,6% | 37,4% |
| Mask_rcnn | Detecção | 32 IMGs | pplnn | bbox_map | 37,7% | 37,6% | 37,9% |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| DeepBv3 | Segmentação | 32 IMGs | Conservador | AACC / MIOU | 96,13% / 78,81% | 96,14% / 78,89% | 96,17% / 79,12% |
| DeepBv3plus | Segmentação | 32 IMGs | Conservador | AACC / MIOU | 96,27% / 79,39% | 96,26% / 79,29% | 96,29% / 79,60% |
| fcn | Segmentação | 32 IMGs | Conservador | AACC / MIOU | 95,75% / 74,56% | 95,62% / 73,96% | 95,68% / 72,35% |
| PSPNET | Segmentação | 32 IMGs | Conservador | AACC / MIOU | 95,79% / 77,40% | 95,79% / 77,41% | 95,83% / 77,74% |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| srcnn | Edição | 32 IMGs | Conservador | PSNR / SSIM | 27,88% / 79,70% | 27,88% / 79,07% | 28,41% / 81,06% |
| Esrgan | Edição | 32 IMGs | Conservador | PSNR / SSIM | 27,84% / 75,20% | 27,49% / 72,90% | 27,51% / 72,84% |

Este projeto é distribuído sob a licença Apache, versão 2.0.