¿Qué características de la tarjeta gráfica afectan la velocidad de codificación del hardware NVIDIA NVENC?

Tengo un proyecto web en el que estoy trabajando que requiere la transcodificación de múltiples clips de video cortos (6-10 segundos) cargados por los usuarios en un formato H.264 compatible con la web en mi servidor Linux. Pude habilitar la aceleración de hardware NVIDIA NVENC con ffmpeg y una GeForce GTX 670 de 4 años, y estoy obteniendo velocidades de codificación de hardware dos veces superiores a las de mi codificación de software (Xeon E5-1620 v3). Con un presupuesto de tarjeta de video de $800, me gustaría poder transcodificar estos clips de video cortos lo más rápido posible porque varios usuarios los cargarán simultáneamente.

El motor NVENC tiene limitaciones de licencia cuando se implementa en una tarjeta NVIDIA de nivel de consumidor: solo se pueden ejecutar 2 subprocesos de transcodificación de video simultáneamente, incluso si tiene varias tarjetas. Si decido optar por una de las costosas líneas de tarjetas quadro, entonces solo estoy limitado por el otro hardware en otras partes de mi sistema en términos de cuántos subprocesos puedo ejecutar. Sin embargo, con mi proyecto específico, es mucho mejor transcodificar estos clips en una serie en lugar de paralelos porque los clips se verán en el orden en que se cargan. Los clips posteriores en la cola se pueden transcodificar a medida que se ven los clips anteriores. Si los clips se transcodifican en paralelo en la misma tarjeta, el rendimiento es inversamente proporcional al número de subprocesos simultáneos.

Dicho esto, mi plan es configurar dos tarjetas NVIDIA y ejecutar un único subproceso en cada una para maximizar el rendimiento. El SDK del códec de NVIDIA es vago en cuanto a la diferencia de rendimiento de NVENC entre varias tarjetas, pero parece que hay una gran diferencia entre las generaciones de GPU Maxwell Gen 2> Maxwell Gen 1> Kepler. No puedo encontrar puntos de referencia confiables para la codificación NVENC (a diferencia de la evaluación comparativa CUDA, que es fácil de encontrar).

En ausencia de datos de evaluación comparativa duros que comparen varias tarjetas, ¿qué características de las tarjetas actualmente disponibles tendrían el mayor impacto en la velocidad de codificación NVENC de un solo hilo? Dado que la GPU real no se utiliza por completo durante la transcodificación, ¿la GPU y la velocidad del reloj de la memoria afectan mucho a esta función? Tengo $400 por tarjeta para gastar, pero si el nivel básico de Maxwell Gen 2 GeForce GTX 960 es tan bueno como las tarjetas más recientes, entonces invertiré dinero extra en otros aspectos del servidor (CPU/RAM/SSD, etc.). Sé que esto puede parecer una pregunta subjetiva (qué es lo mejor ), pero estoy tratando de hacer una suposición autodidacta basada en la comprensión del hardware de transcodificación.

Solo quería decir que me encanta esta publicación y espero una respuesta igualmente interesante. Me pregunto por qué la GPU no se utiliza por completo, ¿es falta de optimización? ¿Un cuello de botella en algún otro lugar de la tubería?
Por lo que he leído, hay un chip NVENC completamente separado que hace la mayor parte del trabajo, por lo que supongo que es un cuello de botella. NVIDIA es bastante vaga al explicarlo por alguna razón.
¿Harás 1+ esta pregunta para aumentarla?

Respuestas (2)

Hay dos características principales en la codificación NVIDIA NVENC:

  1. Memoria de video si necesita transcodificar muchas transmisiones.
  2. NVENC SIP: mejor que este SIP que mejor rendimiento de codificación. Depende de la GPU. Puede encontrar la mejor explicación relacionada con la generación GPU y NVENC SIP en el sitio web de Wikipedia . Maxwell Gen 2 es el mejor en este momento (para 2016).

De acuerdo con la limitación de la licencia: es posible ejecutar solo 2 subprocesos de codificación simultáneamente en las tarjetas NVIDIA de nivel de consumidor (cualquier tarjeta GTX). Está regulado a nivel del controlador, sin embargo, es posible eliminar esta limitación. En este caso, el valor de los subprocesos de transcodificación máximos dependerá del tamaño de la memoria de video y la utilización del motor de video. El tamaño de la memoria de video que se necesita para un flujo de transcodificación es diferente y depende del modelo de tarjeta de video. Para codificar el flujo SD en QUADRO K4200 (4 GB) se necesitan 100 MB de memoria de video, pero para codificar el mismo flujo en GTX 980TI (6 GB) necesitamos 170 MB.

Mis resultados en la transcodificación de fuentes SD en tiempo real son:

  • QUADRO K4200 (4 GB): un subproceso de transcodificación cuesta 100 MB y podemos ejecutar en paralelo alrededor de 36 subprocesos, pero el cuello de botella es la utilización del motor de video. Puedo ejecutar alrededor de 30 subprocesos paralelos con "-preset hp -vcodec nvenc_264"
  • GTX 980TI(6GB): el cuello de botella es la memoria de video. Puedo ejecutar alrededor de 32 subprocesos (32*170=5440) en paralelo. Lo hice por mi educación, por supuesto. Pero los resultados del motor de video son mejores que en K4200 en 2.5 veces. Estos 32 subprocesos con "-preset slow -vcodec nvenc_264 -vf yadif=0" y la utilización del motor de video son solo del 80 %.
  • También lo probé en GTX 660 (2GB, Maxwell Gen 2). Fueron unos 15 hilos paralelos debido a la memoria de video.

Mi conclusión (para 2016): si necesita transcodificar no más de 2 subprocesos en paralelo, entonces GTX 960 es una buena variante. Además, puede ahorrar algo de dinero en otro hardware y buscar otra tarjeta de video con Maxwell Gen1. Si opta por la forma de piratear, entonces GTX 960 es una buena variante pero solo con 4 GB de memoria de video.

ACTUALIZACIÓN DE 2018: Hoy en día la situación en esta área ha cambiado en una mejor dirección. La tarjeta con el mejor codificador es Tesla V100, pero es demasiado cara. La mejor variante de trabajo son las tarjetas de video basadas en Pascal CHIP. Si prefiere la forma de pirateo, GTX1050TI (4 GB), será perfecto para su presupuesto en 800 $. Por lo demás, la Quadro P2000 no tiene limitaciones de licencia y además es muy cómoda por el mismo presupuesto.

Gracias por tu respuesta. Después de algunas pruebas, me di cuenta de que el tiempo de sobrecarga que lleva iniciar la transcodificación se convierte en un gran problema con múltiples clips cortos. ¿Has experimentado esto? Veo quizás 1 segundo por clip en la parte superior. Cuando mis clips tardan un promedio de 1 s/clip en transcodificarse usando solo la CPU, el beneficio de la GPU se desvanece. ¿Pensamientos?
Desafortunadamente, no tengo experiencia con múltiples clips cortos. Una idea: necesita mantener el máximo posible de subprocesos NVENC. Será más rápido que en la CPU. Para esto, debe usar una variante con muchos flujos de transcodificación en paralelo para esta necesidad de comprar la tarjeta de video QUADRO o ir al hack.
Luego, puede encontrar el máximo posible de subprocesos NVENC y mantenerlo siempre o puede intentar ejecutar una nueva instancia de FFmpeg si se excede la cantidad máxima de transmisiones, entonces se producirá el siguiente error: "Error al abrir el codificador para la transmisión de salida # 0:0 - quizás parámetros incorrectos como bit_rate, rate, width o height".
Desafortunadamente, los clips se cargarán esporádicamente, a veces un montón, a veces unos pocos. Me inclino por una solución solo para CPU, ya que parece ser infalible.
¿Tienes alguna experiencia con QS? He estado buscando ejemplos de sobrecarga/retraso con QS en vano.
Desafortunadamente, no tengo experiencia laboral real con QS, pero algunas fuentes de Intel dicen que QT es más rápido que NVENC cuatro veces.
Tengo un i7 3770k en un Hackintosh. Supongo que arrancaré desde un USB en vivo e intentaré ejecutar QS en él para ver cómo le va. Espero que las CPU Broadwell-E que se lanzarán en junio sean compatibles con QS.

En la parte superior de su presupuesto de $ 800, puede obtener una Quadro M4000 que NO tiene la limitación de licencia de 2 transcodificaciones simultáneas. Usamos estas tarjetas para transcodificar de 5 a 10 transmisiones en vivo entrantes a 2 o 3 tasas de bits de salida.

¿Puede comentar sobre el tiempo que se tarda en iniciar una transcodificación de vapor? En mi tarjeta de consumidor fue alrededor de un segundo completo. Dado que recibo docenas de clips cortos al mismo tiempo, una sobrecarga de un segundo por clip termina costándome muy caro.