Dominando a Otimização YOLO e ResNet nas NPUs HiSilicon
Você deseja obter o melhor desempenho de seus modelos em NPUs HiSilicon. Esta pode ser uma tarefa difícil. Você pode ver performan
Você deseja obter o melhor desempenho de seus modelos em NPUs HiSilicon. Esta pode ser uma tarefa difícil. Você pode ver gargalos de desempenho ou mau uso do hardware. A arquitetura NPU Ascend apresenta desafios únicos. Por exemplo,Ele não usa paralelismo massivo de nível de thread para ocultar atrasos no acesso à memória-A.
Objetivo: Este guia fornece um fluxo de trabalho completo para Otimizar YOLO/ResNet. Você aprenderá a preparar modelos, convertê-los com o Compilador Ascend Tensor, aplicar a quantização INT8 e implantá-los usando AscendCL para eficiência máxima.🚀
Principais Takeaways
- Prepare seu modelo paraNPUs HiSilicon-A. Converta-o para o formato ONNX. Poda-o para torná-lo menor e mais rápido.
- Use o Ascend Tensor Compiler (ATC) para converter seu modelo ONNX. Isso cria um arquivo '.om' otimizado para a NPU.
- Aplique a quantização INT8 para aumentar o desempenho. Use Quantização Pós-Treinamento (PTQ) ou Treinamento Consciente de Quantização (QAT).
- Use o Ascend Profiler para encontrar partes lentas do seu modelo. Isso ajuda a corrigir problemas de desempenho.
- Implantar seuModelo otimizadoUsando AscendCL. Meça sua latência e FPS para verificar sua velocidade.
PREPARAÇÃO E OTIMIZAÇÃO DE YOLO/RESNET PARA CONVERSÃO
Seu primeiro passo é preparar o modelo para a NPU HiSilicon. Um modelo bem preparado converte suavemente e tem melhor desempenho. Esta preparação envolve várias etapas principais.
- Conversão do modelo: Você converterá seu modelo treinado em um formato compatível com NPU. O Ascend Tensor Compiler (ATC) ajuda com este processo.
- Adaptação do operador: Seu modelo pode ter operadores personalizados. Você precisa de adaptar estes para o NPU se não são suportados nativamente.
- Inferência modelo: Você irá implantar o modelo convertido no NPU. Isso envolve carregar o modelo e alimentá-lo com dados para obter previsões.
- Otimização do desempenho: Você pode melhorar ainda mais o desempenho com técnicas como quantização e fusão do operador.
Usando o ResNet como uma espinha dorsal do YOLO
Você pode usar uma arquitetura ResNet como backbone para o seu modelo YOLO. O ResNet é excelente para extrair recursos complexos de imagens. Esse poder vem com um custo. ResNet adiciona peso computacional significativo. Isso torna o próximo passo, a poda, muito importante para Otimizar YOLO/ResNet em dispositivos com recursos limitados.
Poda para compatibilidade NPU
A poda remove conexões desnecessárias ou neurônios de sua rede neural. Esse processo cria um modelo menor e mais rápido sem uma grande perda de precisão. Um modelo podado tem menos parâmetros e operações. Isso o torna ideal para o NPU, reduzindoMemóriaUso e acelerando a inferência. Esta é uma técnica crítica para Otimizar YOLO/ResNet.
Exportar modelos para ONNX
Você deve exportar seu modelo para o formato ONNX (Open Neural Network Exchange). O ONNX é um formato intermediário que a ferramenta ATC entende. Você pode exportar facilmente um modelo PyTorch usando um comando simples.
Exemplo: Exportando um modelo YOLOV8n para ONNX.
# Este comando cria 'yolov8n.onnx' do seu modelo PyTorch Yolo export model = yolov8n.pt format = onnxNota: Você pode encontrar erros durante a exportação. Questões como
Unsupported ONNX data type: INT64Ou moldar incompatibilidades emFusedMatMulSão comuns. Muitas vezes, você pode corrigir isso garantindo que o tamanho do tensor de entrada esteja correto ou convertendo os tipos de dados antes da exportação.
Verificando o gráfico ONNX
Você deve sempre verificar o arquivo ONNX exportado. Essa verificação garante que a estrutura do modelo esteja correta antes de prosseguir para a conversão. Várias ferramentas podem ajudá-lo nesta etapa final de preparação.⚙️
- Nétron: Esta é uma ferramenta visual. Você pode carregar seu
-A. OnnxPara ver o gráfico do modelo inteiro. Ele permite que você inspecione as propriedades, entradas e saídas de cada camada. - Verificador ONNX: Esta é uma biblioteca Python. Você pode usar o
Onnx. checker.check_model()Função em um script. Ele confirma programaticamente que a estrutura do seu modelo é válida e irá gerar um erro se encontrar algum problema.
MODELO DE CONVERSÃO COM ATC
Depois de preparar seu modelo ONNX, sua próxima tarefa é convertê-lo em um formato que a NPU HiSilicon possa entender. Você vai usar oCompilador Tensor Ascend (ATC)Para este passo crítico. O ATC é uma ferramenta poderosa dentro da cadeia de ferramentas CANN (Compute Architecture for Neural Networks).
Seu principal trabalho é transformar seu modelo em um modelo off-line altamente otimizado.
- O ATC é uma ferramenta de conversão central na cadeia de ferramentas Huawei CANN.
- Você o usa para adaptar modelos de frameworks populares para um formato compatível com Ascend.
- Ele ajuda você a implantar modelos AI treinados eficientemente no hardware Huawei Ascend.
Este processo de conversão cria-A. OMArquivo, que é o modelo executável final que você implantará na NPU.
Conversão ATC básica
Você pode começar com um comando básico para converter seu verificado-A. OnnxArquivo. Este comando informa ao ATC o modelo de entrada, a estrutura original, o nome do arquivo de saída desejado e a versão do chip Ascend.
💡O que é um modelo offline (
-A. OM)? Um modelo offline é um arquivo que foi pré-processado e otimizado para um destino de hardware específico. Inclui tarefas como fusão do operador e otimização da memória, o que significa que o NPU pode executá-lo com tempo mínimo de configuração durante a inferência.
Aqui está um fundamentalATCExemplo da linha de comando:
Atc -- model = yolov8n.onnx \
-- Framework = 5 \
-- Output = yolov8n \
-- Soc_version = Ascend310
Vamos quebrar o que cada parte deste comando faz:
| Bandeira | Descrição |
|---|---|
-- Modelo | Especifica o caminho para a entrada-A. OnnxArquivo. |
-- Quadro = 5 | Diz ATC o modelo está no formato ONNX. (Outros valores são para Caffe, etc.) |
-- Saída | Define o nome base para sua saída-A. OMArquivo (nenhuma extensão necessária). |
-- Soc_version | Especifica o processador Ascend alvo, comoAscendo310OuAscenda710-A. |
Configurar Entradas
Seu modelo precisa saber o tamanho exato e o formato dos dados que você enviará. Você configura isso durante a conversão ATC usando sinalizadores específicos. Esta etapa é vital para o desempenho e evitar erros runtime.
Você usa o-- Input_shapeFlag para definir as dimensões do tensor de entrada. Você pode definir um tamanho de lote fixo para desempenho consistente ou um tamanho de lote dinâmico para flexibilidade.
- Tamanho do lote estático:
"-- Input_shape = imagens: 1,3,640,640"(Lote de 1) - Tamanho dinâmico do lote:
"-- Input_shape = imagens:-1,3,640,640"(Tamanho variável do lote)
Você também precisa especificar o layout de dados. A maioria dos modelos de visão computacional treinados usam PyTorchNCHWFormato. Este layout organiza os dados do tensor como (Número de amostras, Canais, Altura, Largura). Conseguir isso é essencial para a eficiência computacional, pois afeta a forma como a NPU acessa os dados na memória. Você pode usar o-- Input_formatBandeira para definir isso.
Aqui está o comando aprimorado com configuração input:
Atc -- model = yolov8n.onnx \
-- Framework = 5 \
-- Output = yolov8n \
-- Input_format = NCHW \
-- Input_shape = "imagens: 1,3,640,640" \
-- Soc_version = Ascend310
Manusear Operações Não Apoiadas
Às vezes, seu modelo pode conter camadas especiais ou operações ("ops") que o ATC não suporta nativamente. Quando isso acontece, a conversão irá falhar. Você tem uma ferramenta poderosa para resolver isso: oMotor do impulso do tensor (TBE)-A. O TBE permite que você defina e implemente operadores personalizados de uma maneira que a NPU Ascend possa executar.⚙️
Desenvolver um operador personalizado com TBE é um processo avançado que envolve várias etapas:
- Módulo DSL: Você primeiro escreve a lógica matemática central do operador. Use uma linguagem específica do domínio para definir as etapas do cálculo e o fluxo de dados.
- Módulo Programação: Em seguida, você diz ao hardware como executar sua lógica de forma eficiente. Isso envolve planejar como segmentar dados (tiling) para otimizar o acesso e o desempenho da memória.
- Módulo IR: O TBE gera então uma Representação Intermediária (IR) do seu operador. Este é um formato padronizado que o compilador pode entender e começar a otimizar.
- Módulo transferência compilador: O compilador usa o IR e aplica otimizações adicionais. Ele usa técnicas como buffering duplo e alocação de memória inteligente para preparar o operador para o hardware NPU específico.
- Módulo CodeGen: Finalmente, o módulo CodeGen produz um arquivo de código semelhante a C. Este arquivo é compilado em um operador executável que o framework CANN pode carregar e executar diretamente no NPU.
⚠️ Nota: Criar operadores personalizados requer um profundo entendimento tanto da função do operador quanto da arquitetura NPU subjacente. Você deve sempre verificar a lista oficial do operador CANN primeiro. Apenas crie um operador personalizado se não conseguir encontrar uma alternativa suportada.
OTIMIZAÇÃO AVANÇADA E TUNING
Você converteu seu modelo. Agora você pode desbloquear o verdadeiro poder da NPU HiSilicon. Técnicas avançadas de otimização levarão o desempenho do seu modelo ao pico. Este estágio se concentra em reduzir a precisão do modelo e analisar seu comportamento em tempo de execução para encontrar e corrigir gargalos.
NPUs como a arquitetura Da Vinci da HiSilicon são construídas para acelerar operações matemáticas específicas. Seu modelo deve usar esses operadores "compatíveis com NPU" para convolução, agrupamento e ativação para atingir a velocidade máxima. Qualquer operação não suportada pelo NPU é executada na CPU mais lenta, criando um gargalo de desempenho.A quantização é uma técnica fundamental que torna seu modelo mais amigável para NPU. Reduz a precisão dos números do modelo, por exemplo, de ponto flutuante de 32 bits (FP32) para inteiro de 8 bits (INT8). Essa mudança torna o modelo menor e mais rápido.UmTeste do benchmark AIMostra esse impacto claramente.Um modelo rodando a 12 quadros por segundo usando FP32 pode atingir 30 quadros por segundo quando otimizado com quantização INT8-A.
Quantização Pós-Treinamento (PTQ)
A quantização pós-treinamento (PTQ) é uma técnica poderosa para otimizar o YOLO/ResNet. Você o aplica a um modelo FP32 já treinado. A principal ferramenta que você usará para isso é o Ascend Model Compression Toolkit (AMCT). O PTQ é popular porque é uma maneira rápida e direta de obter um aumento significativo de desempenho sem treinar novamente seu modelo.
No entanto, o PTQ às vezes pode causar uma queda na precisão do seu modelo.Para um modelo como YOLOV8 Nano, você pode ver uma ligeira diminuição na precisão da inferência. Em alguns casos, especialmente com modelos menores, essa perda de precisão pode ser mais significativa. A quantização estática INT8 pode levar a uma queda de precisão moderada de cerca de 3-7% em mAP50-95 absoluto.
Se a perda de precisão do PTQ for muito alta, você tem outra opção:Treinamento Consciente de Quantização (QAT)-A. QAT introduz a simulação de quantização durante o próprio processo de treinamento. Isso permite que o modelo aprenda a compensar a perda de precisão, muitas vezes resultando em melhor precisão final.
Aqui está uma comparação para ajudá-lo a decidir qual método usar:
| Característica | Quantização Pós-Treinamento (PTQ) | Treinamento Consciente de Quantização (QAT) |
|---|---|---|
| Aplicação Fase | Aplicado a um modelo pré-treinado | Incorporado diretamente no processo de treinamento do modelo |
| Reciboração Necessária | Não, você não precisa de treinar | Sim, requer mais tempo de treinamento para se adaptar à quantização |
| Complexidade | Simples e rápido de implementar | Mais complexo, pois simula a quantização durante o treinamento |
| Precisão Impacto | Pode resultar numa queda de precisão notável | Frequentemente alcança melhor precisão otimizando a inferência quantizada |
Quando você deve escolher um sobre o outro?
- Escolha PTQQuando você não pode treinar seu modelo ou quando uma ligeira queda de precisão é aceitável para um grande ganho de velocidade.
- Escolha QATQuando a precisão é sua principal prioridade e você tem os recursos para um ciclo de treinamento mais longo e complexo.
Preparando um Calibration Dataset
Para executar o PTQ, você precisaCalibração conjunto-A. Esta é uma coleção pequena e representativa de dados de entrada (por exemplo, imagens) que o AMCT usa. Ele executa esses dados no modelo para analisar o intervalo de valores de ativação. Esta informação ajuda a calcular os fatores de escala ideais para converter valores FP32 para INT8 sem perder muita informação.
Criar um bom conjunto de dados é crucial para a quantização bem sucedida.
- Qualidade sobre a quantidade: Você não precisa de um conjunto massivo. Um conjunto de ao redor1024 imagens diversas e bem preparadasÉ muitas vezes suficiente. Simplesmente usar mais imagens nem sempre é melhor. Um conjunto de dados desbalanceado ou redundante pode distorcer as estatísticas. Isso pode fazer com que o modelo quantizado tenha um desempenho ruim durante a inferência do mundo real.
- Representação é chave: Suas imagens de calibração devem refletir a variedade de dados que seu modelo verá na produção. Inclua imagens com diferentes condições de iluminação, tamanhos de objetos e fundos para garantir que o processo de calibração seja robusto.
Um conjunto de calibração bem escolhido é uma pedra angular da quantização eficaz ao otimizar o YOLO/ResNet.
Profiling com Ascend Profiler
Depois de converter e quantificar seu modelo, você precisa medir seu desempenho. OAscend ProfilerÉ a ferramenta que você usará para encontrar gargalos de desempenho restantes. Dá-lhe uma análise detalhada de como o seu modelo executa no NPU.
Você pode usar os dados do profiler para responder a perguntas críticas:
- Quais operadores estão levando a maior parte do tempo?
- Há algum operador inesperadamente em execução na CPU em vez da NPU?
- Existe um movimento de dados ineficiente entre o host e o dispositivo?
O Ascend Profiler tem dois componentes chave para esta análise:
-
Análise Cronológica: Esta vista dá-lhe uma representação visual de baixo nível da execução do seu modelo. Cada bloco colorido na linha do tempo mostra a hora de início e a duração de um operador. Você pode ver exatamente quais operadores estão em execução noAICORE(O NPU principal), oCGPU, Ou oHOSTCPU-A. Isso ajuda a identificar operadores com longos tempos de execução. Você pode baixar esses dados do cronograma como um arquivo JSON e abri-lo em ferramentas como
Chrome: // rastreamentoPara um olhar mais profundo. -
Análise do desempenho do operador: Este componente fornece estatísticas de alto nível. Exibe os tempos de execução do operador em tabelas e gráficos classificados por duração. Você pode ver rapidamente quais tipos de operadores (por exemplo, AICORE vs. AICPU) e quais operadores específicos estão consumindo mais tempo. Isso é perfeito para identificar se uma parte significativa do tempo de execução do seu modelo é gasta em algumas operações lentas.
Ao usar essas duas exibições juntas, você pode diagnosticar problemas de desempenho. Por exemplo, se o profiler mostrar que um operador personalizado ou sem suporte está sendo executado no HOSTCPU, você saberá que criar um operador TBE personalizado para ele provavelmente fornecerá uma aceleração importante.
IMPLANTAÇÃO E INFERÊNCIA
Você otimizou seu modelo. Agora você vai implantá-lo no HiSilicon NPU. Este estágio final é onde você executa seu modelo para fazer previsões do mundo real. Você vai usar oAscend Compute Language(AscendCL) para comunicar com o hardware e medir o desempenho final do seu modelo.
Inicializando o dispositivo com AscendCL
Primeiro, você precisa configurar o NPU para inferência. Você vai usar AscendCL para fazer isso. A Python Ascend Computing Language (pyACL) é uma biblioteca de API Python que simplifica esse processo. Ele permite que você controle o processador Ascend AI diretamente do seu código Python.
O workflow padrão para executar um modelo segue uma sequência clara:
- Inicializar o pyACL: Você inicia a biblioteca pyACL para preparar os recursos do sistema.
- Alocar recursos: Você separa os recursos runtime que seu aplicativo precisa.
- Transferir dados: Você move seus dados de entrada, como imagens, na memória do dispositivo.
- Dados do processo: Você pode realizar alterações de imagem de última hora, como redimensionamento.
- Executar Modelo: Você carrega seu
-A. OMModelo e executar o processo inferência. - Destruir alocações: Você liberta recursos de tempo de execução após a conclusão da inferência.
- Desinicializar pyACL: Você fecha a biblioteca para liberar todos os recursos.
Escrevendo código inferência
Seu script inferência traz todos esses passos juntos. Esse código é o mecanismo que carrega o modelo, alimenta os dados e recupera as previsões.
💡Usando pyACL para inferência O
PiACLBiblioteca é a sua principal ferramenta para esta tarefa. Você usa suas funções para gerenciar o dispositivo, lidar com a memória, carregar o seu-A. OMModelo e executá-lo. Ele lhe dá controle total sobre todo o pipeline de inferência em um ambiente Python.
Seu script carregará os dados de entrada pré-processados, os enviará para a NPU, acionará a execução do modelo e processará a saída do modelo.
Desempenho benchmarking
Após a implantação, você precisa medir o desempenho do modelo. Isto diz-lhe o quão rápido o seu modelo corre. Duas métricas principais são essenciais para essa avaliação:
- Latência: Este é o tempo que seu modelo leva para processar uma entrada, medida em milissegundos (ms). Menor latência é melhor.
- Quadros Por Segundo (FPS): Isso mede quantas entradas seu modelo pode processar em um segundo. FPS maior é melhor.
Essas duas métricas estão diretamente relacionadas.Para um aplicativo de vídeo em tempo real rodando a 30 FPS, a latência do modelo deve ser menor que 33,3 ms-A.Outras métricas importantes de latência também podem fornecer insights mais profundos-A.
- Tempo para o primeiro token: O tempo que leva para obter a primeira peça de saída.
- Tempo total geração: O tempo de ponta a ponta desde a entrada até a saída total.
Medir esses números ajuda a confirmar que seu trabalho de otimização foi bem-sucedido.🚀
Agora você domina um fluxo de trabalho completo para otimização NPU. Este guia guiou você por quatro etapas essenciais:
- Preparação do modelo
- Conversão ATC
- Quantização Tuning
- Implantação AscendCL
Seguir esse processo estruturado é a chave para desbloquear o desempenho total de seus modelos de visão computacionalHardware HiSilicon-A.
Agora, aplique essas técnicas aos seus próprios projetos! Para mais ajuda, consulte a documentação oficial do CANN ou fóruns comunitários. Boa sorte!🚀
FAQ
Qual é a principal diferença entre PTQ e QAT?
Você aplica a quantização pós-treinamento (PTQ) a um modelo já treinado. É rápido, mas pode diminuir a precisão. Você usa Quantization-Aware Training (QAT) durante o processo de treinamento. Esse método leva mais tempo, mas geralmente mantém a precisão alta.
Por que ONNX é o formato preferido para conversão?
Você usa ONNX como um formato universal. O Ascend Tensor Compiler (ATC) compreende arquivos ONNX. Isso permite converter facilmente modelos de frameworks como o PyTorch para o-A. OMFormato que a NPU pode executar.
O que devo fazer se minha conversão ATC falhar?
Uma falha ATC geralmente significa que seu modelo tem um operador não suportado. Primeiro, verifique os logs de erros por pistas. Talvez seja necessário criar um operador personalizado usando o Tensor Boost Engine (TBE) para resolver o problema.⚙️
Quantas imagens preciso para um conjunto de dados?
Você não precisa de milhares de imagens. Um conjunto diversificado de cerca de 1024 imagens é suficiente. A chave é a qualidade, não a quantidade. Seus dados de calibração devem representar o que seu modelo verá em produção.







