Como forçar o Adobe Media Encoder a usar 100% de CPU e memória?

8

Na minha máquina, o Adobe Media Encoder é muito lento. Leva 12 horas para renderizar 4 minutos de vídeo 1080p no YouTube (o vídeo é baseado no projeto Adobe After Effects com um arquivo MOV original e quatro efeitos: curvas, remoção de granulação, máscara de nitidez e matiz / saturação.

insira a descrição da imagem aqui

Percebi que ele não usa toda a memória disponível, nem tenta usar o máximo de CPU possível. Aqui está o uso real durante o processo de codificação:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Existe uma maneira de acelerar o processo de codificação convencendo o aplicativo a usar toda a CPU e toda a memória disponível?

Como uma nota lateral, é esperado que seja tão lento? Não posso imaginar empresas de criação de filmes usando-o para codificar um filme que geralmente dura um pouco mais de 4 minutos e tem um pouco mais de quatro efeitos básicos, mesmo com um data center inteiro. A remoção do efeito "remover granulação" acelera a codificação de 12 horas para 3:30.

Arseni Mourzenko
fonte
11
Não há absolutamente nenhuma razão para que ele precise de toda a memória disponível. A codificação de vídeo é um processo linear de abertura de qualquer quadro de entrada, aplicação de processamento e salvamento do quadro de saída. Não há razão para que isso deva ocupar muita memória, pois funciona como um fluxo. Alguma memória é usada para correspondência de padrões, mas mesmo isso é bastante limitado.
AJ Henderson
tente ffmpeg. A recompensa por ter que aprender a usá-lo é que é muito mais rápido do que qualquer codificador de mídia proprietário (software) que eu já usei.
STIB
adicionar qualquer tipo de efeito que precise ser renderizado adicionará tempo à exportação, alguns efeitos serão renderizados em tempo real, mas outros, como "remover granulação", terão que fazer referência a todos os quadros antes de combiná-los, isso levará tempo para completo. Eu descobri que quando eu estava usando PP, basta adicionar um LUT ou um efeito simples, mesmo no meu mach de 8 núcleos com 16 GB de RAM, levaria tempo para renderizar. Às vezes, você só precisa absorver a renderização e deixá-la fazer o seu trabalho, já disse que tinha mais de 12 horas para fazer uma exportação, mas depois que terminou uma seção, caiu maciçamente quando o efeito terminou de renderizar
Adam Mann Pro
Para sua informação, se você estiver exportando um AE comp do AME, na verdade, não está "codificando" o arquivo, por assim dizer, você primeiro o renderiza e depois o codifica. A distinção é importante porque o AME presumivelmente está executando um subprocesso de AE ​​para obter esses quadros e depois codificá-los. Portanto, o gargalo é realmente o renderizador interno da AE, que é terrivelmente ineficiente, como eu acho que todos sabemos, e definitivamente não atinge 100% da CPU. É por isso que a desgramagem faz uma diferença tão grande! E FYI Eu acredito Adobe propôs que a GPU na última versão ...
Spencer

Respostas:

5

Pode não haver uma maneira. Com base na sua descrição do problema, parece que o processamento é a parte mais lenta. Enquanto o próprio codificador de vídeo é capaz de executar o processamento multiencadeado, o processamento de imagem que você está executando pode não ser capaz. Por padrão, o Premiere sempre executou o máximo de processamento paralelo possível para mim e frequentemente vejo que ele atinge 99% de uso da CPU no meu desktop com quatro núcleos hiperencadeado.

O problema é mais provável que alguns de seus efeitos exijam que o resultado do quadro anterior comece o processamento no quadro seguinte. Se esse for o caso, não há uma maneira fácil de dividi-lo em vários threads e isso impossibilitaria atingir 100% de uso da CPU em um computador com vários núcleos.

Da mesma forma, não se espera que a RAM limite a codificação, pois é uma operação de fluxo. Há algumas coisas que precisam ser rastreadas ao longo do tempo, mas, na maioria das vezes, é uma operação de fluxo com dados saindo o mais rápido possível, para que não haja muita acumulação de dados.

Há duas coisas principais que podem melhorar o desempenho. O primeiro é o processamento de GPU. As CPUs de uso geral não são realmente ideais para muitas tarefas de processamento de áudio / vídeo. Eles são projetados para realizar uma ampla variedade de operações de uso geral, mas não são super eficientes em operações básicas. As GPUs, por outro lado, são projetadas para executar operações simples muito rapidamente. Eles geralmente podem reduzir bastante as tarefas de processamento de vídeo.

Uma melhoria adicional pode ser encontrada no hardware desenvolvido especificamente. Existem placas profissionais projetadas especificamente para o processamento de vídeo e fornecem processamento e codificação em tempo real. Eles geralmente são incluídos em estações de trabalho profissionais de edição de vídeo, mas o preço pode ser bastante alto. Não é algo inédito para uma estação de trabalho de edição de vídeo profissional conseguir subir na faixa de US $ 15.000 a US $ 20.000 ou até mais, apenas para hardware. Eles podem custar muito menos se você não se importar em esperar pelas renderizações (eu trabalho em um sistema de US $ 2.350 para o meu trabalho em vídeo), mas eles também podem ficar muito altos.

AJ Henderson
fonte
4

Eu não estou feliz quando estou renderizando, a menos que eu possa realmente sentir cheiro de plástico queimado, nada é mais frustrante do que o AE dizendo que sua renderização não será concluída até a morte do universo, enquanto, ao mesmo tempo, sua CPU mal está suando. No entanto, há algo que você pode fazer sobre isso.

O After Effects vem com um renderizador de linha de comando chamado aerender.exe plain ol ' aerender no mac). Está na pasta do programa AE. Usá-lo é um pouco desafiador para as pessoas que não estão acostumadas com o poder da linha de comando - = awesome - = , mas definitivamente vale a pena fazer isso se estiver fazendo algum trabalho pesado no After Effects e quiser aproveitar todo o poder poder da sua máquina.

A beleza disso é que você pode executar quantas instâncias quiser. O que normalmente faço é continuar adicionando instâncias até começar a ficar com pouca memória. Eu tenho uma máquina com 40 núcleos físicos e é preciso muito para maximizar a CPU, mas aqui está uma captura de tela onde eu finalmente consegui. Cada uma dessas janelas é uma nova instância do mecanismo de renderização AE:

insira a descrição da imagem aqui

Nesse exemplo, a velocidade por quadro de cada renderizador quase não diminuiu em comparação com uma única instância, portanto, consegui um aumento de velocidade de aproximadamente 4000%. YMMV, dependendo de quantos núcleos e de quantos RAM sua máquina possui. Fui ao esforço porque tinha um projeto que envolvia composições muito longas e razoavelmente complexas. O projeto simplesmente não teria sido realizado sem essa técnica, ou eu teria que cultivá-lo em uma fazenda de renderização comercial.

Obviamente, a aceleração tem um preço, que é um pequeno aumento na complexidade do seu fluxo de trabalho. Você precisa definir suas composições para renderizar como sequências de imagens e usar as configurações de várias máquinas para que cada representante procure o próximo quadro não renderizado. No final, se você precisar de um arquivo de filme, precisará fazer uma passagem de compactação, mas, no meu caso, eu normalmente domino para uma sequência png ou tiff e, em seguida, corro cópias codificadas em h.264 para clientes do mestre.

E você precisa saber um pouco sobre a linha de comando. Pare de parecer tão triste - isso é uma coisa boa, uma coisa boa.


janelas

A linha de comando do PowerShell que usei nesse cenário foi:

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;
}

Isso é executado em uma janela do PowerShell (digite WindowsRe digite powershell.exe ). Essa é uma linguagem de script de shell integrada às versões modernas do Windows que podem ser usadas para todos os tipos de coisas.

Mac Usando a versão Bash> 3 (shell padrão nas versões atuais do OSX) ou mesmo com shell mais frios, como o zsh, você pode usar este script:

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

O script funciona assim:

  • inicia um loop que vale 40 repetições, você pode alterar os 40 para o que achar que é uma quantidade razoável.
  • Em seguida, ele inicia o aerender como um novo processo, com o start-processcomando PS ou com o &in bash. Obviamente, altere o caminho para aerender.exe / aerender e seu projeto para o que estiver na sua máquina. Uma maneira rápida e precisa de preencher caminhos com a linha de comando é arrastar arquivos e pastas para dentro dela. Também o uso tabde caminhos para preencher automaticamente economiza muitas digitações e erros de digitação.
  • Finalmente, ele dorme por 5 segundos - descobri que abrir muitas instâncias do aerender muito rapidamente era uma maneira confiável de entrar em pânico com a tela azul / kernel no meu computador.


Se você tiver várias composições, poderá renderizá-las como filmes, mas iniciar um novo renderizador para cada uma. Se você chamar o aerender.exe assim

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

ele renderizará a terceira composição na fila de renderização. Colocando-o em um script, você pode fazer:

janelas

$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

Isso iniciará uma nova instância do aerender para cada composição - mais uma vez, altere 12 para quantas composições houver na fila. Observe que essa técnica pode ter problemas se você tiver muitas composições em sua fila - se você usar toda a sua memória física, as coisas ficarão tremendo rapidamente. Para manter o número de instâncias baixo, é necessário verificar quantos processos do aerender estão em execução e só iniciar um novo quando um processo em execução terminar. Uma solução mais simples é fazer quantas cópias do seu projeto você desejar que haja instâncias, com a fila de renderização dividida entre elas e, em seguida, renderizá-las todas simultaneamente. Portanto, o segmento de renderização um renderizaria comps 1,2,3, o segmento de renderização dois faria 3,4,5 e assim por diante.

Mais detalhes aqui (meu blog).

stib
fonte
11
você é uma lenda!
Tony Sépia
é isso que continuo dizendo às pessoas.
STIB
0

Enquanto esta pergunta já foi respondida; minha recomendação:

Use AfterEffects para sua renderização se você tiver um sistema com um número alto de núcleos e muita RAM.

Minha estação de trabalho principal é um Dual E5-2697 v2 (24 núcleos lógicos / 48 hiperroscados); com 128 GB de RAM.

Se você precisar fazer simplesmente uma transcodificação de um arquivo; ou pode usar o Bridge para importar seu projeto PPro para o AE (exceto que suas edições permanecerão intactas); o recurso em Memória (Editar -> Preferências) permite usar o Multi-threading.

Dito isto:

Se estou fazendo apenas uma renderização direta; ou algo simples; Eu posso usar o AE para alocar 32 dos meus 48 núcleos HT; Além disso; Eu posso alocar 3 GB de ram para cada Thread; que depende do tipo de codificação que estou fazendo, entre 2-100x mais rápido em termos de renderização, mesmo com minhas GPUs Dual Titan Black.

Isso é claro; aplica-se apenas se você tiver muitos núcleos; e MUITO RAM ...

Pré estreia; renderização através do AME; será limitado a usar apenas 1 Thread, infelizmente; e dependerá da sua GPU, a menos que você a tenha desativado para usar a renderização de software em Configurações do projeto.

Espero que isto ajude!

McFlySoHigh
fonte
0

Como acelerar o Media Encoder para usar 100% da sua CPU? Aqui está um exemplo: Crie um arquivo: settings.ini coloque dentro dele

Modo [Configurações] = desenvolvedor mthread = habilitado mthreadcount = 3 (para uma máquina com rosca de 4 núcleos 8, por exemplo, 7) sli = falso slimode = todas as prioridades = alta escala = baixa nuvem = carga falsa = necessidade de alto-falante = 2

Coloque nas pastas executáveis ​​do Adobe Premiere, After Effects e Media Encoders.

Para uma máquina com quatro núcleos / quatro threads como a minha, isso fez o Media Encoder pular de um núcleo para usar 96% dos quatro. Você deve assistir ao vídeo do youtube "Render 300X FASTER | Premiere / After Effects / Media Encoder" Estou usando com sucesso isso nos produtos CC 2018.

Dugadugalovelydid
fonte
Uau, agora isso é interessante!
Spencer
0

Feche o After Effects ao renderizar com o Media Encoder. Ao fazer isso, meu uso da CPU passou de 30% para 60%. Eu acho que porque a Adobe não está poupando energia da CPU para trabalhar de forma simultânea no AE.

Roland
fonte
Eu acredito que isso se deve à maneira dinâmica como a Adobe aloca RAM em segundo plano. Isso limitará a quantidade de RAM por processo de adobe, para evitar estouros e outros enfeites. Portanto, ao fechar um aplicativo da Adobe, você teoricamente libera mais RAM para outro.
Spencer #
0

Posso sugerir que isso ainda é um problema daqui a cinco anos! Você precisa fechar todos os aplicativos da Adobe e, em seguida, abrir o Media Encoder (se é de onde você está renderizando) PRIMEIRO, em seguida, atribuirá todos os recursos disponíveis para esse aplicativo, não o vi compartilhar dinamicamente recursos, simplesmente aloca Tempo de CPU de acordo com o número de aplicativos abertos quando você inicia o aplicativo Adobe (isso é repetível, tente abrir o LR, por exemplo, antes da renderização, ele usará apenas 10% da CPU - abra o AME primeiro e depois o Lightroom e você obtenha 100%)

Eu tenho um aumento de 4x nos tempos de renderização por causa disso. Espero que ajude. O "gerenciamento de recursos" da Adobe é péssimo.

Mullazman
fonte