Ayuda para entender la integración de Handbrake y NVidia

Desafortunadamente, parece que tuve una falla de conversión (después de muchas instancias exitosas), y estoy teniendo un poco de problema aquí para rastrear exactamente qué sucedió, y agradecería mucho cualquier ayuda para resolver esto.

Por lo que puedo ver, la consulta de hardware de NVidia pasa (yay):

--> Checking presence and capabilities of NVidia NVENC Hardware encoder
2019-11-16T17:18:04 MCEBuddy.AppWrapper.NVidiaQuery --> Launching process C:\Program Files\MCEBuddy2x\nvidia\nvidiaQuery.exe
2019-11-16T17:18:04 MCEBuddy.AppWrapper.NVidiaQuery --> Process arguments 
2019-11-16T17:18:04 MCEBuddy.AppWrapper.NVidiaQuery --> UI Session Admin Process : True
2019-11-16T17:18:04 MCEBuddy.AppWrapper.NVidiaQuery --> Starting process as a UISession process with Admin privileges. This requires atleast 1 user to be logged into the system (remote desktop or locally)
2019-11-16T17:18:04 MCEBuddy.AppWrapper.NVidiaQuery --> Setting process priority to Normal
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery --> C:\Program Files\MCEBuddy2x\nvidia\nvidiaQuery.exe Starting...
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->  CUDA Device Query (Runtime API) version (CUDART static linking)
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery --> Detected 1 CUDA Capable device(s)
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery --> Device 0: "GeForce GTX 1050"
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   CUDA Driver Version / Runtime Version          10.1 / 7.5
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery --> Detected CUDA Driver version = 10.1
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   CUDA Capability Major/Minor version number:    6.1
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery --> Detected CUDA Hardware version = 6.1
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Total amount of global memory:                 2048 MBytes (2147483648 bytes)
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery --> MapSMtoCores for SM 6.1 is undefined.  Default to use 128 Cores/SM
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery --> MapSMtoCores for SM 6.1 is undefined.  Default to use 128 Cores/SM
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   ( 5) Multiprocessors, (128) CUDA Cores/MP:     640 CUDA Cores
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   GPU Max Clock rate:                            1519 MHz (1.52 GHz)
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Memory Clock rate:                             3504 Mhz
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Memory Bus Width:                              128-bit
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   L2 Cache Size:                                 1048576 bytes
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Total amount of constant memory:               65536 bytes
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Total amount of shared memory per block:       49152 bytes
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Total number of registers available per block: 65536
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Warp size:                                     32
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Maximum number of threads per multiprocessor:  2048
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Maximum number of threads per block:           1024
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Maximum memory pitch:                          2147483647 bytes
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Texture alignment:                             512 bytes
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Run time limit on kernels:                     Yes
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Integrated GPU sharing Host Memory:            No
2019-11-16T18:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Support host page-locked memory mapping:       Yes
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Alignment requirement for Surfaces:            Yes
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Device has ECC support:                        Disabled
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   CUDA Device Driver Mode (TCC or WDDM):         WDDM (Windows Display Driver Model)
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Device supports Unified Addressing (UVA):      Yes
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Device PCI Domain ID / Bus ID / location ID:   0 / 1 / 0
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->   Compute Mode:
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery -->      < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery --> deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.1, CUDA Runtime Version = 7.5, NumDevs = 1, Device0 = GeForce GTX 1050
2019-11-16T17:18:05 MCEBuddy.AppWrapper.NVidiaQuery --> Result = PASS

Pero luego parece decir que no puede encontrar hardware después de todo (boo):

2019-11-16T17:18:09 MCEBuddy.Transcode.ConvertWithHandbrake --> Cannot find supported h264/h265 software/hardware encoder combination in profile, disabling auto hardware encoder adjustments

Y luego parece que cambia a software y falla después de esto:

INFORMATION> 2019-11-16T17:18:09 MCEBuddy.Transcode.Convert --> Converting with Handbrake, type: SoftwareOnly, gpu: {
  "hardwareBrand": "Any",
  "codecType": "Undefined",
  "hardwareCodecPresent": false,
  "h265Codec": false,
  "h264Codec": false
}

Lo único que se me ocurre es que el Plex Transcoder.exe estaba activo mientras esto ocurría… ¿es eso un problema? Tenía la impresión de que la GPU puede ser usada por varias aplicaciones al mismo tiempo, al igual que una CPU. Me pregunto si hay otra configuración en alguna parte que debería considerar aquí.

Como siempre, agradezco mucho cualquier tiempo y ayuda que alguien pueda brindar. Adjunto los registros completos.

College Football (2009) - S2019E2580 - Michigan State at Michigan.ts-Default-2019-11-16T17-05-29.9420785-05-00.log (1.4 MB)

Más referencia/contexto aquí. Pude grabar otro juego mientras se realizaba la transmisión/transcodificación, así que no parece que esto fuera resultado de que la GPU estuviera en uso.

También podría estar relacionado con Plex. Después de todo, está en modo beta. :laughing:

En realidad está detectando tu codificador de Nvidia, pero tu perfil no es válido, por lo que desactiva cualquier ajuste automático.

Si tu perfil handbrake-video contiene encoder nvenc_h264, es decir, tu perfil ya está configurado para usar el codificador de hardware. MCEBuddy busca un codificador de software, x264, para habilitar automáticamente sus ajustes de hardware o la directiva handbrake-UsingHardwareEncoding=true en tu perfil, lo cual indica a MCEBuddy que el perfil ya está optimizado para codificación por hardware y no debe cambiar nada, solo ejecutarlo; por eso termina siendo un perfil inválido.
Cambia el codificador al de software en el perfil o agrega la directiva handbrake-UsingHardwareEncoding=true.

¡Ok! Genial… gracias @RBoy, tu ayuda es muy apreciada, como siempre. :blush:

Mi única pregunta es… ¿por qué buscó (o intentó cambiar a) la codificación por software? Parece que ha estado usando hardware todo este tiempo, pero quizá esté entendiendo algo mal.

Por si sirve de algo, así es como se ve mi perfil ahora:

[Handbrake Cli 1.2.0 H265 - Quality 25]
Description=nVidia NVENC HW (H265) Quality Setting 25 + Decomb
order=handbrake
FixedResolution=true
handbrake-general=--loose-anamorphic --comb-detect=fast --decomb=mode=7 --verbose=2 --format av_mp4 --subtitle-lang-list eng,spa --all-subtitles --subtitle-default=1 --native-language eng --native-dub
handbrake-video=--start-at duration:0 --encoder nvenc_h264 --encoder-preset slow --quality 25 --vfr
handbrake-audio=--aencoder copy:aac --audio-lang-list eng --all-audio
handbrake-audioac3=--aencoder copy:ac3 --audio-lang-list eng --all-audio
handbrake-ext=.m4v
handbrake-audiodelay=skip
handbrake-UsingHardwareEncoding=true
PreConversionCommercialRemover=true

Veamos cómo le va. :+1:

(Por cierto, sé que se llama H265 y en realidad busca h264 — ¡siempre se me olvida cambiarlo! :laughing:)

No cambia a software; por defecto, todos los perfiles que vienen con MCEBuddy solo tienen codificadores de software. Busca tarjetas gráficas y luego los cambia a codificadores de hardware en tiempo de ejecución si son compatibles. Si estás creando un perfil personalizado optimizado para codificación por hardware, entonces necesitas hacerle saber a MCEBuddy que empiece a buscar.

Vamos a cambiar esto en el futuro y, si MCEBuddy detecta que el perfil tiene un codificador de hardware, automáticamente establecerá la bandera de optimización de hardware <encoder>-UsingHardwareEncoding=true

Así que, desafortunadamente, después de configurar lo anterior, sigo teniendo problemas intermitentes. Por favor, vea el adjunto.

Parece que Handbrake falla con un código de retorno distinto de cero, por lo que parece que es responsabilidad de Handbrake.

Abriré un problema con Handbrake, pero quería verificar aquí primero para asegurarme de que no haya más configuraciones de MCEBuddy que considerar antes de hacerlo.

Registro adjunto aquí: NFL Football - S2019E2191 - Chicago Bears at Detroit Lions.ts-Football-2019-11-28T16-35-04.5332992-05-00.log (1.3 MB)

Parece que tu controlador gráfico está fallando:

MCEBuddy.AppWrapper.Handbrake → Encoding: task 1 of 1, 0.00 %[h264_nvenc @ 000000000716bbc0] OpenEncodeSessionEx failed: out of memory (10)

Vaya… eso lo explica. :laughing: Mi tarjeta de video tiene 2 GB de memoria, también. De nuevo, es intermitente y solo ocurre con poca frecuencia.

Los controladores de la tarjeta de video estaban un poco desactualizados, así que los he actualizado. No estoy seguro de que haya mucho más que hacer aquí excepto conseguir una tarjeta de video más potente.

Gracias por tu ayuda, @RBoy. :+1:

Ese error proviene del controlador gráfico, muy probablemente sea una fuga de memoria de software que un problema de hardware.

OK gracias @RBoy… veamos si la última versión atiende este problema, si no, estoy pensando que podría haber algo con Plex que esté causando esto. :downcast_face_with_sweat:

Si estás utilizando más de 2 conversiones simultáneas, los controladores gráficos de NVidia no te permitirán hacerlo, ya que tienen un límite estricto de 2 transcodificaciones simultáneas; consulta esta publicación para más detalles:

¡AH… Apuesto a que eso es lo que está pasando! Ahora tenemos 3 Rokus en casa y, antes de conseguir la GPU, una sola transcodificación consumía entre el 50-85 % del CPU.

Así que configuré todos los streams en «original» para evitar transcodificaciones.

Sin embargo, desde que tengo la GPU, resulta que ejecutar una transcodificación es una minucia (y lo que esperaba): apenas un 5-10 % del CPU. De hecho, eran unos 15 % con dos streams simultáneos.

No lo he probado con 3 streams simultáneos desde nuestros Rokus, pero, claro, si hay una transcodificación para post-procesado, nos metería en el escenario que describes. Menuda limitación. :stuck_out_tongue:

Tendré que pensar mejor cómo queremos manejar esto… gracias por la información y el contexto adicionales. :+1: