Dominar la optimización de YOLO y ResNet en NPUs de HiSilicon

Desea obtener el mejor rendimiento de sus modelos en HiSilicon NPUs. Esto puede ser una tarea difícil. Usted puede ver performan

Masterización

Desea obtener el mejor rendimiento de sus modelos en HiSilicon NPUs. Esto puede ser una tarea difícil. Puede ver cuellos de botella de rendimiento o un uso deficiente del hardware. La arquitectura Ascend NPU presenta desafíos únicos. Por ejemplo,No utiliza paralelismo masivo a nivel de subprocesos para ocultar los retrasos de acceso a la memoria.

Objetivo: Esta guía le ofrece un flujo de trabajo completo para optimizar YOLO/ResNet. Aprenderá a preparar modelos, convertirlos con Ascend Tensor Compiler, aplicar cuantización INT8 e implementarlos usando AscendCL para obtener la máxima eficiencia.🚀

Puntos clave

  • Prepare su modelo paraHiSilicon NPUs. Convertir a formato ONNX. Puela para que sea más pequeño y más rápido.
  • Utilice Ascend Tensor Compiler (ATC) para convertir su modelo ONNX. Esto crea un archivo '.om' optimizado para la NPU.
  • Aplicar cuantización INT8 para aumentar el rendimiento. Utilice la cuantificación posterior al entrenamiento (PTQ) o el entrenamiento consciente de la cuantificación (QAT).
  • Utilice Ascend Profiler para encontrar partes lentas de su modelo. Esto ayuda a solucionar problemas de rendimiento.
  • Despliegue suModelo optimizadoUsando AscendCL. Mide su latencia y FPS para comprobar su velocidad.

PREPARACIÓN Y OPTIMIZACIÓN DE YOLO/RESNET PARA LA CONVERSIÓN

PREPARACIÓN

Su primer paso es preparar el modelo para la HiSilicon NPU. Un modelo bien preparado convierte suavemente y funciona mejor. Esta preparación implica varias etapas clave.

  1. Conversión de modeloConvertirás tu modelo entrenado en un formato compatible con NPU. El compilador Ascend Tensor (ATC) ayuda con este proceso.
  2. Adaptación del operador: El modelo puede tener operadores personalizados. Es necesario adaptarlos para la NPU si no son compatibles de forma nativa.
  3. Inferencia del modelo: Implementará el modelo convertido en la NPU. Esto implica cargar el modelo y alimentarlo con datos para obtener predicciones.
  4. Optimización del rendimientoPuede mejorar aún más el rendimiento con técnicas como la cuantificación y la fusión de operadores.

Uso de ResNet como backbone de YOLO

Puede utilizar una arquitectura ResNet como columna vertebral de su modelo YOLO. ResNet es excelente para extraer características complejas de las imágenes. Este poder tiene un costo. ResNet agrega un peso computacional significativo. Esto hace que el siguiente paso, la poda, sea muy importante para optimizar YOLO/ResNet en dispositivos con recursos limitados.

Poda para compatibilidad NPU

La poda elimina conexiones innecesarias o neuronas de su red neuronal. Este proceso crea un modelo más pequeño y más rápido sin una gran pérdida de precisión. Un modelo podado tiene menos parámetros y operaciones. Esto lo hace ideal para la NPU, reduciendoMemoriaUso y aceleración de la inferencia. Esta es una técnica crítica para la optimización de YOLO/ResNet.

Exportación de modelos a ONNX

Debe exportar el modelo al formato Open Neural Network Exchange (ONNX). ONNX es un formato intermedio que la herramienta ATC entiende. Puede exportar fácilmente un modelo PyTorch usando un comando simple.

Ejemplo: Exportación de un modelo YOLOv8n a ONNX.

# Este comando crea 'yolov8n.onnx' a partir de tu modelo PyTorch
Modelo de exportación yolo = formato yolov8n.pt = onnx

NotaPuede encontrar errores durante la exportación. Cuestiones comoTipo de datos ONNX no compatible: INT64O discordancias de forma enFusedMatMulSon comunes. A menudo puede solucionarlos asegurándose de que el tamaño del tensor de entrada sea correcto o convirtiendo los tipos de datos antes de exportar.

Verificación del gráfico ONNX

Siempre debe verificar el archivo ONNX exportado. Esta comprobación garantiza que la estructura del modelo es correcta antes de proceder a la conversión. Varias herramientas pueden ayudarle con este paso final de preparación.⚙️

  • NetrónEs una herramienta visual. Puedes subir tu. OnnxPara ver todo el gráfico del modelo. Le permite inspeccionar las propiedades, entradas y salidas de cada capa.
  • Comprobador ONNXEsta es una biblioteca de Python. Usted puede utilizar elOnnx. checker.check_model()Función en un script. Confirma mediante programación que la estructura de su modelo es válida y generará un error si encuentra algún problema.

CONVERSIÓN DEL MODELO CON ATC

Después de preparar su modelo ONNX, su siguiente tarea es convertirlo a un formato que la HiSilicon NPU pueda entender. Usted utilizará elCompilador de Tensor Ascend (ATC)Para este paso crítico. ATC es una poderosa herramienta dentro de la cadena de herramientas CANN (Compute Architecture for Neural Networks).

Su trabajo principal es transformar su modelo en un modelo fuera de línea altamente optimizado.

  • ATC es una herramienta de conversión central en la cadena de herramientas Huawei CANN.
  • Lo usa para adaptar modelos de marcos populares a un formato compatible con Ascend.
  • Te ayuda a implementar modelos de IA entrenados de manera eficiente en el hardware de Huawei Ascend.

Este proceso de conversión crea un. Om (en inglés), Que es el modelo ejecutable final que implementará en la NPU.

Conversión básica de ATC

Puede comenzar con un comando básico para convertir su verificación. OnnxArchivo. Este comando indica al ATC el modelo de entrada, el marco original, el nombre del archivo de salida deseado y la versión del chip Ascend de destino.

💡¿Qué es un modelo offline?. Om (en inglés)¿)? Un modelo fuera de línea es un archivo que se ha preprocesado y optimizado para un destino de hardware específico. Incluye tareas como la fusión del operador y la optimización de la memoria, lo que significa que la NPU puede ejecutarlo con un tiempo de configuración mínimo durante la inferencia.

Aquí hay una fundamentalAtc (en inglés)Ejemplo de línea de comandos:

Atc -- model = yolov8n.onnx \
-- Marco = 5 \
-- Output = yolov8n \
-- Soc_version = Ascend310

Vamos a desglosar lo que hace cada parte de este comando:

BanderaDescripción
-- ModeloEspecifica la ruta a la entrada. OnnxArchivo.
-- Marco = 5Le dice a ATC que el modelo está en formato ONNX. (Otros valores son para Caffe, etc.)
-- SalidaDefine el nombre base para la salida. Om (en inglés)Archivo (no necesita extensión).
-- Soc_versionEspecifica el procesador Ascend de destino, comoAscend310OAscend710.

Configuración de entradas

Su modelo necesita saber el tamaño exacto y el formato de los datos que enviará. Usted configura esto durante la conversión ATC usando los indicadores específicos. Este paso es vital para el rendimiento y la prevención de errores de tiempo de ejecución.

Usted utiliza el-- Input_shapePara definir las dimensiones de su tensor de entrada. Puede establecer un tamaño de lote fijo para obtener un rendimiento uniforme o un tamaño de lote dinámico para mayor flexibilidad.

  • Tamaño de lote estático:"-- Input_shape = imágenes: 1,3, 640.640"(Lote de 1)
  • Tamaño de lote dinámico:"-- Input_shape = imágenes:-1,3, 640.640"(Tamaño de lote variable)

También debe especificar el diseño de datos. La mayoría de los modelos de visión por computadora entrenados en PyTorch usan elNCHWFormato. Este diseño organiza los datos tenséricos como (Número de muestras, Canales, Altura, Ancho). Hacer esto bien es esencial para la eficiencia computacional, ya que afecta la forma en que la NPU accede a los datos en la memoria. Usted puede utilizar el-- Input_formatBandera para establecer esto.

Aquí está el comando mejorado con configuración de entrada:

Atc -- model = yolov8n.onnx \
-- Marco = 5 \
-- Output = yolov8n \
-- Input_format = NCHW \
-- Input_shape = "imágenes: 1,3, 640.640" \
-- Soc_version = Ascend310

Manejo de Operaciones no soportadas

A veces, su modelo puede contener capas u operaciones especiales ("ops") que ATC no admite de forma nativa. Si esto sucede, la conversión fallará. Tienes una poderosa herramienta para resolver esto: elTensor Boost Engine (TBE). TBE le permite definir e implementar operadores personalizados de una manera que el Ascend NPU puede ejecutar.⚙️

Desarrollar un operador personalizado con TBE es un proceso avanzado que implica varias etapas:

  1. Módulo DSLPrimero se escribe la lógica matemática básica del operador. Utilice un lenguaje específico del dominio para definir los pasos de cálculo y el flujo de datos.
  2. Módulo de programaciónA continuación, le dice al hardware cómo ejecutar su lógica de manera eficiente. Esto implica la planificación de cómo segmentar los datos (tiling) para optimizar el acceso a la memoria y el rendimiento.
  3. Módulo IR: TBE genera una representación intermedia (IR) de su operador. Este es un formato estandarizado que el compilador puede entender y comenzar a optimizar.
  4. Módulo de transferencia del compilador: El compilador toma el IR y aplica optimizaciones adicionales. Utiliza técnicas como el doble búfer y la asignación de memoria inteligente para preparar al operador para el hardware específico de la NPU.
  5. Módulo CodeGenFinalmente, el módulo CodeGen produce un archivo de código similar a C. Este archivo se compila en un operador ejecutable que el framework CANN puede cargar y ejecutar directamente en la NPU.

⚠️ NotaCrear operadores personalizados requiere una comprensión profunda tanto de la función del operador como de la arquitectura subyacente de la NPU. Siempre debe verificar primero la lista oficial de operadores de CANN. Sólo cree un operador personalizado si no puede encontrar una alternativa compatible.

OPTIMIZACIÓN Y SINTONIZACIÓN AVANZADA

Has transformado tu modelo. Ahora puede desbloquear el verdadero poder de la NPU HiSilicon. Las técnicas avanzadas de optimización impulsarán el rendimiento de su modelo a su punto máximo. Esta etapa se centra en reducir la precisión del modelo y analizar su comportamiento en tiempo de ejecución para encontrar y corregir cuellos de botella.

Las NPUs como la arquitectura Da Vinci de HiSilicon están construidas para acelerar operaciones matemáticas específicas. Su modelo debe utilizar estos operadores "compatibles con NPU" para la convolución, la agrupación y la activación para lograr la máxima velocidad. Cualquier operación no soportada por la NPU se ejecuta en la CPU más lenta, creando un cuello de botella de rendimiento.La cuantificación es una técnica clave que hace que su modelo sea más compatible con NPU. Reduce la precisión de los números de su modelo, por ejemplo, de punto flotante de 32 bits (FP32) a entero de 8 bits (INT8). Este cambio hace que el modelo sea más pequeño y más rápido.UnPrueba de referencia de AIMuestra este impacto claramente.Un modelo que se ejecuta a 12 cuadros por segundo utilizando FP32 puede alcanzar 30 cuadros por segundo cuando se optimiza con la cuantificación INT8.

Cuantización posterior al entrenamiento (PTQ)

La cuantificación posterior al entrenamiento (PTQ) es una técnica poderosa para optimizar YOLO/ResNet. Se aplica a un modelo de FP32 ya entrenado. La herramienta principal que utilizará para esto es el Ascend Model Compression Toolkit (AMCT). PTQ es popular porque es una forma rápida y directa de obtener un aumento significativo del rendimiento sin volver a entrenar su modelo.

Sin embargo, PTQ a veces puede causar una caída en la precisión de su modelo.Para un modelo como YOLOv8 Nano, es posible que vea una ligera disminución en la precisión de la inferencia. En algunos casos, especialmente con modelos más pequeños, esta pérdida de precisión puede ser más significativa. La cuantificación estática INT8 puede conducir a una caída de precisión moderada de alrededor del 3-7% en mAP50-95 absolutos.

Si la pérdida de precisión de PTQ es demasiado alta, tiene otra opción:Capacitación consciente de la cuantificación (QAT). QAT introduce la simulación de cuantización durante el propio proceso de entrenamiento. Esto permite que el modelo aprenda a compensar la pérdida de precisión, lo que a menudo resulta en una mejor precisión final.

Aquí hay una comparación para ayudarlo a decidir qué método usar:

CaracterísticaCuantización posterior al entrenamiento (PTQ)Capacitación consciente de la cuantificación (QAT)
Etapa de aplicaciónAplicado a un modelo pre-entrenadoIncorporado directamente en el proceso de formación del modelo
Reentrenamiento RequeridoNo, no necesitas volver a entrenarSí, requiere más tiempo de entrenamiento para adaptarse a la cuantización
ComplejidadMás sencillo y rápido de implementarMás complejo, ya que simula la cuantificación durante el entrenamiento
Impacto de precisiónPuede resultar en una notable caída de la precisiónA menudo logra una mejor precisión optimizando la inferencia cuantificada

¿Cuándo elegir uno sobre el otro?

  • Elegir PTQCuando no puede volver a entrenar su modelo o cuando una ligera caída de precisión es aceptable para una gran ganancia de velocidad.
  • Elegir QATCuando la precisión es su principal prioridad y tiene los recursos para un ciclo de capacitación más largo y complejo.

Preparación de un conjunto de datos de calibración

Para realizar el PTQ, se necesita unDataset de calibración. Esta es una pequeña colección representativa de datos de entrada (por ejemplo, imágenes) que utiliza la AMCT. Se ejecuta estos datos a través de su modelo para analizar el rango de valores de activación. Esta información le ayuda a calcular los factores de escala óptimos para convertir los valores de FP32 a INT8 sin perder demasiada información.

Crear un buen conjunto de datos de calibración es crucial para una cuantificación exitosa.

  • Calidad sobre cantidadNo necesitas un conjunto de datos masivo. Un conjunto de alrededor1024 imágenes diversas y bien preparadasCon frecuencia es suficiente. Simplemente usar más imágenes no siempre es mejor. Un dataset no balanceado o redundante puede sesgarse las estadísticas de calibración. Esto puede hacer que el modelo cuantizado funcione mal durante la inferencia del mundo real.
  • La representación es claveSus imágenes de calibración deben reflejar la variedad de datos que su modelo verá en producción. Incluya imágenes con diferentes condiciones de iluminación, tamaños de objetos y fondos para garantizar que el proceso de calibración sea robusto.

Un conjunto de calibración bien elegido es una piedra angular de la cuantificación efectiva al optimizar YOLO/ResNet.

Perfilado con Ascend Profiler

Después de convertir y cuantificar el modelo, es necesario medir su rendimiento. ElAscend PerfiladorEs la herramienta que usará para encontrar cuellos de botella de rendimiento restantes. Le da un desglose detallado de cómo se ejecuta su modelo en la NPU.

Puede usar los datos del perfilador para responder preguntas críticas:

  • ¿Qué operadores toman más tiempo?
  • ¿Hay algún operador que se ejecute inesperadamente en la CPU en lugar de la NPU?
  • ¿Hay movimiento de datos ineficiente entre el host y el dispositivo?

Ascend Profiler tiene dos componentes clave para este análisis:

  1. Análisis de la línea de tiempoEsta vista proporciona una representación visual de bajo nivel de la ejecución del modelo. Cada bloque de color en la línea de tiempo muestra la hora de inicio y la duración de un operador. Puede ver exactamente qué operadores se están ejecutando en elAicore(La NPU principal), elAICPU, O elHOSTCPU. Esto le ayuda a identificar operadores con largos tiempos de ejecución. Puede descargar estos datos de línea de tiempo como un archivo JSON y abrirlo en herramientas comoChrome: // rastreoPara una mirada más profunda.

  2. Análisis de rendimiento del operadorEste componente proporciona estadísticas de alto nivel. Muestra los tiempos de ejecución del operador en tablas y gráficos, ordenados por duración. Puede ver rápidamente qué tipos de operadores (por ejemplo, AICPU vs. AICCORE) y qué operadores específicos están consumiendo más tiempo. Esto es perfecto para identificar si una parte significativa del tiempo de ejecución de su modelo se gasta en unas pocas operaciones lentas.

Al utilizar estas dos vistas juntas, puede diagnosticar eficazmente los problemas de rendimiento. Por ejemplo, si el generador de perfiles muestra que se está ejecutando un operador personalizado o no compatible en la HOSTCPU, sabe que la creación de un operador TBE personalizado para él probablemente proporcionará una aceleración importante.

DEPLOMACIÓN E INFERENCIA

DEPLOMENTO

Ha optimizado su modelo. Ahora lo implementará en la HiSilicon NPU. Esta etapa final es donde ejecuta su modelo para hacer predicciones del mundo real. Usted utilizará elLenguaje de computación Ascend(AscendCL) para comunicarse con el hardware y medir el rendimiento final del modelo.

Inicialización del dispositivo con AscendCL

Primero debe configurar la NPU para la inferencia. Usarás AscendCL para hacer esto. Python Ascend Computing Language (pyACL) es una biblioteca API de Python que simplifica este proceso. Le permite controlar el procesador Ascend AI directamente desde su código Python.

El flujo de trabajo estándar para ejecutar un modelo sigue una secuencia clara:

  1. Inicializar pyACLComienza la biblioteca pyACL para preparar los recursos del sistema.
  2. Asignar recursosUsted reserva los recursos de tiempo de ejecución que su aplicación necesita.
  3. Transferencia de datosMover los datos de entrada, como imágenes, en la memoria del dispositivo.
  4. Datos de procesoPuede realizar cambios de imagen de último minuto, como cambiar el tamaño.
  5. Ejecutar modelo: Cargarás tu. Om (en inglés)Modelo y ejecutar el proceso de inferencia.
  6. Destruir asignacionesLibera los recursos de tiempo de ejecución después de que se complete la inferencia.
  7. Desinicializar pyACL: Cierra la biblioteca para liberar todos los recursos.

Escribir código de inferencia

Su guión de inferencia reúne todos estos pasos. Este código es el motor que carga su modelo, lo alimenta con datos y recupera las predicciones.

💡Uso de pyACL para la inferencia ElPyACLBiblioteca es su principal herramienta para esta tarea. Usted utiliza sus funciones para administrar el dispositivo, manejar la memoria, cargar su. Om (en inglés)Modelo y ejecutarlo. Le brinda control total sobre toda la tubería de inferencia dentro de un entorno Python.

Su script cargará los datos de entrada preprocesados, los enviará a la NPU, activará la ejecución del modelo y luego procesará la salida del modelo.

Rendimiento de Benchmarking

Después del despliegue, debe medir el rendimiento del modelo. Esto le indica qué tan rápido funciona su modelo. Dos métricas clave son esenciales para esta evaluación:

  • LatenciaEste es el tiempo que su modelo tarda en procesar una entrada, medido en milisegundos (ms). Menor latencia es mejor.
  • Fotogramas por segundo (FPS)Mide cuántas entradas puede procesar su modelo en un segundo. Un FPS más alto es mejor.

Estas dos métricas están directamente relacionadas.Para una aplicación de video en tiempo real que se ejecuta a 30 FPS, la latencia de su modelo debe ser inferior a 33,3 ms.Otras métricas de latencia importantes también pueden brindarle información más profunda.

  • Tiempo hasta el primer tokenEl tiempo que se tarda en obtener la primera pieza de salida.
  • Tiempo de generación totalEl tiempo de extremo a extremo desde la entrada hasta la salida completa.

Medir estos números le ayuda a confirmar que su trabajo de optimización fue exitoso.🚀


Ahora ha dominado un flujo de trabajo completo para la optimización de NPU. Esta guía lo guíe a través de cuatro etapas esenciales:

  1. Preparación del modelo
  2. Conversión ATC
  3. Ajuste de cuantificación
  4. Implementación de AscendCL

Seguir este proceso estructurado es la clave para desbloquear el rendimiento completo de sus modelos de visión artificial enHardware HiSilicon.

Ahora, ¡aplica estas técnicas a tus propios proyectos! Para obtener más ayuda, consulte la documentación oficial de CANN o los foros de la comunidad. ¡Buena suerte!🚀

Preguntas frecuentes

¿Cuál es la principal diferencia entre PTQ y QAT?

La cuantificación posterior al entrenamiento (PTQ) se aplica a un modelo ya entrenado. Es rápido, pero puede disminuir la precisión. El entrenamiento consciente de la cuantificación (QAT) se utiliza durante el proceso de entrenamiento. Este método lleva más tiempo, pero a menudo mantiene alta la precisión.

¿Por qué ONNX es el formato preferido para la conversión?

Se utiliza ONNX como formato universal. Ascend Tensor Compiler (ATC) entiende los archivos ONNX. Esto le permite convertir fácilmente modelos de marcos como PyTorch en. Om (en inglés)Formato que la NPU puede ejecutar.

¿Qué debo hacer si mi conversión ATC falla?

Una falla de ATC a menudo significa que su modelo tiene un operador no compatible. Primero, revise los registros de errores en busca de pistas. Es posible que tenga que crear un operador personalizado utilizando el Tensor Boost Engine (TBE) para resolver el problema.⚙️

¿Cuántas imágenes necesito para un conjunto de datos de calibración?

No necesitas miles de imágenes. Un conjunto diverso de aproximadamente 1024 imágenes es a menudo suficiente. La clave es la calidad, no la cantidad. Sus datos de calibración deben representar lo que su modelo verá en producción.

Related Articles