Aprendizaje profundo (DL) Las aplicaciones a menudo requieren procesamiento de datos de video para tareas como detección de objetos, clasificación y segmentación. Sin embargo, las tuberías de procesamiento de videos convencionales suelen ser ineficientes para la inferencia de aprendizaje profundo, lo que lleva a cuellos de botella de rendimiento. En esta publicación aprovechará Pytorch y FFMPEG con la aceleración de hardware NVIDIA para lograr esta optimización.
La ineficiencia proviene de cómo los marcos de video típicamente se decodifican y se transfieren entre CPU y GPU. El flujo de trabajo estándar que podemos encontrar en la mayoría de los tutoriales siguen esta estructura:
- Marcos decodificadores en la CPU: Los archivos de video primero se decodifican en marcos sin procesar utilizando herramientas de decodificación basadas en CPU (p. Ej., OpenCV, FFMPEG sin soporte de GPU).
- Transferir a GPU: Estos marcos se transfieren de CPU a la memoria de GPU para realizar una inferencia de aprendizaje profundo utilizando marcos como TensorFlow, PytorchOnnx, etc.
- Inferencia en GPU: Una vez que los marcos están en la memoria de GPU, el modelo realiza inferencia.
- Transfiera de regreso a CPU (si es necesario): Algunos pasos de postprocesamiento pueden requerir que los datos se trasladen a la CPU.
Este proceso de transferencia de CPU-GPU introduce un cuello de botella de rendimiento significativo, especialmente cuando se procesa videos de alta resolución a altas velocidades de cuadro. Las copias de memoria y los interruptores de contexto innecesarios ralentizan la velocidad de inferencia general, lo que limita las capacidades de procesamiento en tiempo real.
Como ejemplo, el siguiente fragmento tiene el típico Procesamiento de videos tubería que te encuentras cuando comienzas a aprender un aprendizaje profundo:
La solución: decodificación e inferencia de video basadas en GPU
Un enfoque más eficiente es Mantenga toda la tubería en la GPUdesde la decodificación de video hasta la inferencia, eliminando las transferencias redundantes de CPU-GPU. Esto se puede lograr usando FFMPEG con aceleración de hardware de GPU NVIDIA.
Optimizaciones clave
- Decodificación de video acelerado por GPU: En lugar de usar decodificación basada en CPU, aprovechamos FFMPEG con NVIDIA GPU Aceleración (NVDEC) para decodificar los marcos de video directamente en la GPU.
- Procesamiento de marco de copia cero: Los marcos decodificados permanecen en la memoria de GPU, evitando transferencias de memoria innecesarias.
- Inferencia optimizada por GPU: Una vez que los marcos están decodificados, realizamos una inferencia directamente utilizando cualquier modelo en la misma GPU, reduciendo significativamente la latencia.
¡Manos!
Requisitos previos
Para lograr las mejoras antes mencionadas, utilizaremos las siguientes dependencias:
Instalación
Por favor, para obtener una visión profunda de cómo se instala FFMPEG con la aceleración de la GPU de NVIDIA, siga estas instrucciones.
Probado con:
- Sistema: Ubuntu 22.04
- Versión del controlador NVIDIA: 550.120
- Versión CUDA: 12.4
- Antorcha: 2.4.0
- Torchaudio: 2.4.0
- Vía antorcha: 0.19.0
1. Instale los NV-codecs
2. Clon y configurar FFMPEG
3. Validen si la instalación fue exitosa con torthaudio.utils
¡Es hora de codificar una tubería optimizada!
Margen de evaluación
Para comparar si está haciendo alguna diferencia, usaremos este video de Pexels por Pawel Perzanowski. Dado que la mayoría de los videos son realmente cortos, he apilado el mismo video varias veces para proporcionar algunos resultados con diferentes longitudes de video. El video original es de 32 segundos, lo que nos da un total de 960 cuadros. Los nuevos videos modificados tienen cuadros de 5520 y 9300 respectivamente.
Video original
- flujo de trabajo típico: 28.51s
- flujo de trabajo optimizado: 24.2s
Bien … no parece una mejora real, ¿verdad? Vamos a probarlo con videos más largos.
Video V1 modificado (5520 cuadros)
- flujo de trabajo típico: 118.72S
- flujo de trabajo optimizado: 100.23s
Video V2 modificado (9300 marcos)
- flujo de trabajo típico: 292.26s
- flujo de trabajo optimizado: 240.85S
A medida que aumenta la duración del video, los beneficios de la optimización se vuelven más evidentes. En el caso de prueba más largo, logramos un 18% de aceleracióndemostrando una reducción significativa en el tiempo de procesamiento. Estas ganancias de rendimiento son particularmente cruciales cuando se manejan grandes conjuntos de datos de video o incluso en tareas de análisis de video en tiempo real, donde las pequeñas mejoras de eficiencia se acumulan en ahorros de tiempo sustanciales.
Conclusión
En la publicación de hoy, hemos explorado dos tuberías de procesamiento de videos, la típica en la que los marcos se copian de CPU a GPU, introduciendo cuellos de botella notables y una tubería optimizada, en la que los marcos se decodifican en la GPU y los pasan directamente a la inferencia, guardando una una considerablemente la cantidad de tiempo a medida que aumenta la duración de los videos.