¿Cómo forzar a Adobe Media Encoder a usar 100% de CPU y memoria?

8

En mi máquina, Adobe Media Encoder es muy lento. Se necesitan 12 horas para reproducir 4 minutos de video de 1080p para YouTube (el video se basa en el proyecto Adobe After Effects con un archivo MOV original y cuatro efectos: curvas, eliminar grano, máscara de enfoque y matiz / saturación.

ingrese la descripción de la imagen aquí

Me di cuenta de que no usa toda la memoria disponible, ni intenta usar tanta CPU como sea posible. Aquí está el uso real durante el proceso de codificación:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

¿Hay alguna manera de acelerar el proceso de codificación convenciendo a la aplicación para que use toda la CPU y toda la memoria disponible?

Como nota al margen, ¿se espera que sea tan lento? No puedo imaginar que las compañías de creación de películas lo usen para codificar una película que generalmente dura un poco más de 4 minutos y tiene un poco más de cuatro efectos básicos, incluso con un centro de datos completo. Eliminar el efecto "eliminar grano" acelera la codificación de 12 horas a 3:30.

Arseni Mourzenko
fuente
1
No hay absolutamente ninguna razón para que necesite toda la memoria disponible. La codificación de video es un proceso lineal de abrir cualquier fotograma de entrada, aplicar procesamiento y luego guardar el fotograma de salida. No hay ninguna razón para que esto requiera mucha memoria, ya que funciona como una secuencia. Se utiliza algo de memoria para la coincidencia de patrones, pero incluso eso es bastante limitado.
AJ Henderson
prueba ffmpeg. La recompensa por tener que aprender a usarlo es que es mucho más rápido que cualquier codificador de medios (software) patentado que haya usado.
stib
agregar cualquier tipo de efecto que deba procesarse agregará tiempo a la exportación, algunos efectos se procesarán en tiempo real como tal, pero otros como "eliminar grano" tendrán que hacer referencia a cada cuadro antes de emparejarlos, esto llevará tiempo para completar. Descubrí que cuando estaba usando PP solo agregaba un LUT o un efecto simple, incluso en mi máquina de 8 núcleos con 16 gb de RAM, tomaba tiempo para renderizar. A veces solo tiene que absorber el renderizado y dejarlo haciendo lo suyo, le dije que diera más de 12 horas para hacer una exportación, pero luego, una vez que terminó una sección, cayó masivamente ya que el efecto había terminado de renderizar
Adam Mann Pro
Para su información, si está exportando una compilación AE de AME, en realidad no está "codificando" el archivo, por así decirlo, primero lo está renderizando y luego lo codifica. La distinción es importante porque AME presumiblemente está ejecutando un subproceso de AE ​​para sacar esos cuadros y luego codificarlos. Entonces, el cuello de botella es en realidad el renderizador interno de AE, que es terriblemente ineficiente, como creo que todos sabemos, y definitivamente no alcanza el 100% de la CPU. ¡Es por eso que la degradación hace una gran diferencia! Y para su información, creo que Adobe lo trasladó a la GPU en la última versión ...
Spencer

Respuestas:

5

Puede que no haya un camino. Según su descripción del problema, parece que el procesamiento es la parte lenta. Si bien el codificador de video en sí puede realizar un procesamiento de subprocesos múltiples, es posible que el procesamiento de la imagen que está realizando no pueda hacerlo. Por defecto, Premiere siempre ha realizado el mayor procesamiento paralelo posible para mí y con frecuencia veo que alcanza el 99% del uso de la CPU en mi escritorio de cuatro núcleos con subprocesos múltiples.

El problema es más probable que algunos de sus efectos requieran el resultado del cuadro anterior para comenzar a procesarse en el cuadro siguiente. Si este es el caso, no hay una manera fácil de dividirlo en varios subprocesos y eso haría imposible alcanzar el uso del 100% de la CPU en una computadora de múltiples núcleos.

Del mismo modo, no se esperaría que la RAM limite la codificación, ya que es una operación de transmisión. Hay algunas cosas que pueden necesitar rastrearse con el tiempo, pero en su mayor parte, es una operación de flujo con datos que salen tan rápido como entran, por lo que no hay mucha acumulación de datos.

Hay dos cosas principales que pueden mejorar el rendimiento. El primero es el procesamiento de GPU. Las CPU de uso general no son realmente ideales para muchas tareas de procesamiento de audio / video. Están diseñados para realizar una amplia variedad de operaciones de propósito general, pero no son súper eficientes en las operaciones básicas. Las GPU, por otro lado, están diseñadas para realizar operaciones simples muy rápidamente. A menudo pueden reducir bastante las tareas de procesamiento de video.

Se puede encontrar una mejora adicional en el hardware especialmente diseñado. Existen tarjetas profesionales diseñadas específicamente para procesar video y proporcionar procesamiento y codificación de video en tiempo real. A menudo se incluyen en estaciones de trabajo de edición de video profesional de alta gama, pero el precio puede ser bastante alto. No es raro que una estación de trabajo de edición de video profesional pueda subir del rango de $ 15,000 a $ 20,000 o incluso más, solo por hardware. Pueden ir por mucho menos si no te importa esperar renders (yo trabajo en un sistema de $ 2,350 para mi trabajo de video) pero también pueden llegar a ser muy altos.

AJ Henderson
fuente
4

No estoy contento cuando renderizo a menos que realmente pueda oler plástico quemado, nada es más frustrante que AE diciéndote que tu renderizado no se completará hasta la muerte por calor del universo, mientras que al mismo tiempo tu CPU apenas es levantando un sudor Sin embargo, hay algo que puede hacer al respecto.

After Effects viene con un procesador de línea de comandos llamado aerender.exe simple ol ' aerender en mac). Está en la carpeta del programa AE. Usarlo es un poco desafiante para las personas que no están acostumbradas al poder de la línea de comando - = impresionante - = , pero definitivamente vale la pena hacerlo si estás haciendo un poco de trabajo pesado en After Effects, y quieres poder aprovechar todo el potencia de su máquina

Lo bueno de esto es que puede ejecutar tantas instancias como desee. Lo que normalmente hago es seguir agregando instancias hasta que empiezo a tener poca memoria. Tengo una máquina de 40 núcleos físicos y se necesita mucho para maximizar la CPU, pero aquí hay una captura de pantalla donde finalmente lo logré. Cada una de esas ventanas es una nueva instancia del motor de renderizado AE:

ingrese la descripción de la imagen aquí

En ese ejemplo, la velocidad por cuadro de cada renderizador apenas disminuyó en comparación con una sola instancia, por lo que logré un aumento de velocidad de aproximadamente 4000%. YMMV, dependiendo de cuántos núcleos y cuánta ram tiene su máquina. Me esforcé porque tenía un proyecto que involucraba composiciones muy largas y razonablemente complejas. El proyecto simplemente no habría terminado sin esta técnica, o habría tenido que cultivarlo en una granja de render comercial.

Por supuesto, la aceleración tiene un precio, que es un ligero aumento en la complejidad de su flujo de trabajo. Debe configurar sus composiciones para renderizar como secuencias de imágenes, y utilizar la configuración de varias máquinas para que cada renderizador busque el siguiente fotograma sin renderizar. Al final, si necesita un archivo de película, tendrá que hacer un pase de compresión, pero en mi caso generalmente masterizo a una secuencia png o tiff, y luego ejecuto copias codificadas h.264 para clientes desde el maestro.

Y necesita saber un poco sobre la línea de comando. Deja de parecer tan triste, eso es BUENO, eso es BUENO.


Ventanas

La línea de comando de PowerShell que utilicé en ese escenario fue:

for ($i = 0 ; $i -lt 40; $i++ ){
  Start-Process 'C:\Program Files\Adobe\Adobe After Effects <<version>>\Support Files\aerender.exe'-ArgumentList '-project', '"c:\path\to\project.aep"'
  sleep 5;
}

Esto se ejecuta en una ventana de PowerShell (escriba WindowsRy luego escriba Powershell.exe ). Este es un lenguaje de script de shell integrado en versiones modernas de Windows que se puede utilizar para todo tipo de cosas.

Mac Usando la versión Bash> 3 (shell predeterminado en las versiones actuales de OSX), o incluso con shells más geniales como zsh, puede usar este script:

for i in {1..40}; do
  /Applications/Adobe\ After\ Effects\ CC\ 2017/aerender -project ~/Path/to/myproject.aep &
  sleep 5
done

El guión funciona así:

  • comienza un ciclo que dura 40 repeticiones, puedes cambiar los 40 a lo que creas que es una cantidad razonable.
  • Luego comienza aerender como un nuevo proceso, ya sea con el start-processcomando en PS o con &in bash, obviamente cambie la ruta a aerender.exe / aerender y su proyecto a lo que sea que esté en su máquina. Una forma rápida y precisa de rellenar rutas con la línea de comando es arrastrar archivos y carpetas a ella. Además, usar las tabrutas para autocompletar ahorra muchos tipeos y errores tipográficos.
  • Finalmente, duerme durante 5 segundos: descubrí que abrir demasiadas instancias de rendición demasiado rápido era una forma confiable de pantalla azul / kernel panic mi computadora.


Si tiene varias composiciones, puede renderizarlas como películas pero comenzar un nuevo renderizador para cada una. Si invocas aerender.exe como este

aerender.exe -project "c:\path\to\proj.aep" -rqindex 3

renderizará la tercera compilación en la cola de renderizado. Poniéndolo en un script que puedes hacer:

Ventanas

$numcomps = 12
$projpath= "C:\path\to\project.aep"
for($i=1; $i -lt ($numcomps+1); $i++){
  Start-Process 'C:\Program Files\Adobe\Adobe After Effects <<version>>\Support Files\aerender.exe' -ArgumentList '-project', '$projpath', '-rqindex', '$i'
  sleep 5;
}

Mac

for i in {1..12}; do
  /Applications/Adobe\ After\ Effects\ CC\ 2017/aerender -project ~/Path/to/myproject.aep -rqindex $i &
  sleep 5
done

Eso iniciará una nueva instancia de entrega para cada compilación; una vez más, cambie el 12 a la cantidad de compilaciones que haya en la cola. Tenga en cuenta que esta técnica puede tener problemas si tiene muchas compilaciones en su cola; si usa toda su memoria física, las cosas se detendrán rápidamente. Para mantener baja la cantidad de instancias, debe verificar cuántos procesos de procesamiento se están ejecutando y solo iniciar uno nuevo cuando finalice uno en ejecución. Una solución más simple es hacer tantas copias de su proyecto como desee que haya instancias, con la cola de representación dividida entre ellas, y luego representarlas todas al mismo tiempo. Entonces, el hilo de renderizado uno estaría renderizando comps 1,2,3, el hilo de renderizado dos estaría haciendo 3,4,5, y así sucesivamente.

Más detalles aquí (mi blog).

stib
fuente
1
eres una leyenda!
Tony Sepia
Eso es lo que le digo a la gente.
stib
0

Si bien esta pregunta ya ha sido respondida; mi recomendación:

Use AfterEffects para su renderizado si tiene un sistema con una gran cantidad de núcleos y mucha RAM.

Mi estación de trabajo principal es un Dual E5-2697 v2 (24 núcleos lógicos / 48 Hyper Threaded); con 128 GB de RAM.

Si tiene que hacer simplemente una transcodificación de un archivo; o puede usar Bridge para importar su proyecto PPro a AE (salvo que sus ediciones permanezcan intactas); la función en Memoria (Editar -> Preferencias) le permite usar Multi-threading.

Habiendo dicho eso:

Si solo estoy haciendo un render directo; o algo simple; Puedo usar AE para asignar 32 de mis 48 núcleos HT; Adicionalmente; Puedo asignar 3 GB de RAM a cada subproceso; que depende de qué tipo de codificación estoy haciendo, entre 2 y 100 veces más rápido en términos de renderizado incluso con mis GPU Dual Titan Black.

Esto por supuesto; solo aplica si tienes MUCHOS núcleos; y MUCHO ram ...

Estreno; renderizado a través de AME; desafortunadamente se limitará a usar solo 1 hilo; y dependerá de su GPU a menos que lo haya deshabilitado para usar el procesamiento de software en Configuración del proyecto.

¡Espero que esto ayude!

McFlySoHigh
fuente
0

¿Cómo acelerar Media Encoder para usar el 100% de tu CPU? Aquí hay un ejemplo: Cree un archivo: settings.ini coloque dentro de él

Modo [Configuración] = desarrollador mthread = habilitado mthreadcount = 3 (para una máquina de 4 hilos con 8 hilos, digamos, 7) sli = falso slimode = toda prioridad = alta escala = baja nube = carga falsa cuando es necesario = altavoces verdaderos = 2

Coloque en las carpetas ejecutables Adobe Premiere, After Effects y Media Encoders.

Para una máquina de cuatro núcleos / 4 hilos como la mía, esto hizo que Media Encoder saltara de 1 núcleo a usar el 96% de los cuatro. Debes ver el video de YouTube "Render 300X FASTER | Premiere / After Effects / Media Encoder". Lo estoy usando con éxito con los productos CC 2018.

Dugadugalovelydid
fuente
Wow, eso es interesante!
Spencer
0

Cierre After Effects mientras renderiza con Media Encoder. Al hacerlo, mi uso de CPU pasó del 30% al 60%. Supongo que porque Adobe no está ahorrando energía de la CPU para trabajar simuladamente en AE.

Roland
fuente
Creo que esto se debe a la forma dinámica en que Adobe asigna RAM en segundo plano. Limitará la cantidad de RAM por proceso de adobe, para evitar el desbordamiento y demás. Entonces, al cerrar una aplicación de Adobe, teóricamente liberas más RAM para otra.
Spencer
0

¿Puedo sugerir que esto sigue siendo un problema 5 años después? Debe cerrar todas las aplicaciones de Adobe y luego abrir Media Encoder (si es allí desde donde está renderizando) PRIMERO, luego asignará todos los recursos disponibles para esa aplicación, no lo he visto compartir recursos dinámicamente, simplemente asigna Tiempo de CPU de acuerdo con la cantidad de aplicaciones abiertas cuando inicia la aplicación de Adobe (esto es repetible, intente abrir LR por ejemplo antes de renderizar, solo usará el 10% de la CPU; luego abra AME primero y luego lightroom y verá obtener 100%)

Obtuve un aumento de 4 veces en los tiempos de renderizado debido a esto. Espero eso ayude. La "gestión de recursos" de Adobe apesta.

Mullazman
fuente