Welche Grafikkartenfunktionen wirken sich auf die Codierungsgeschwindigkeit der NVIDIA NVENC-Hardware aus?

Ich arbeite an einem Webprojekt, das die Transcodierung mehrerer kurzer Videoclips (6-10 Sekunden) erfordert, die von Benutzern in ein webfreundliches H.264-Format auf meinem Linux-Server hochgeladen wurden. Ich konnte die NVIDIA NVENC-Hardwarebeschleunigung mit ffmpeg und einer 4 Jahre alten GeForce GTX 670 aktivieren, und ich erhalte Hardware-Codierungsgeschwindigkeiten, die doppelt so hoch sind wie die meiner Software-Codierung (Xeon E5-1620 v3). Mit einem Videokartenbudget von 800 US-Dollar möchte ich diese kurzen Videoclips so schnell wie möglich transcodieren können, da mehrere Benutzer sie gleichzeitig hochladen werden.

Die NVENC-Engine hat Lizenzbeschränkungen, wenn sie auf einer NVIDIA-Karte auf Verbraucherebene implementiert wird: Es können nur 2 Video-Transcoding-Threads gleichzeitig ausgeführt werden, selbst wenn Sie mehrere Karten haben. Wenn ich mich für eine der teuren Quadro-Kartenserien entscheide, dann bin ich nur durch die andere Hardware an anderer Stelle in meinem System eingeschränkt, was die Anzahl der Threads betrifft, die ich ausführen kann. Bei meinem speziellen Projekt ist es jedoch viel besser, diese Clips in einer Reihe als parallel zu transcodieren, da die Clips in der Reihenfolge angezeigt werden, in der sie hochgeladen wurden. Später in der Warteschlange befindliche Clips können transkodiert werden, wenn frühere Clips angezeigt werden. Wenn Clips parallel auf derselben Karte transcodiert werden, ist die Leistung umgekehrt proportional zur Anzahl gleichzeitiger Threads.

Nachdem ich dies gesagt habe, ist mein Plan, zwei NVIDIA-Karten einzurichten und auf jeder einen einzelnen Thread auszuführen, um den Durchsatz zu maximieren. Das NVIDIA-Codec-SDK ist vage bezüglich der NVENC-Leistungsunterschiede zwischen verschiedenen Karten, aber es scheint, dass es einen großen Unterschied zwischen den GPU-Generationen Maxwell Gen 2 > Maxwell Gen 1 > Kepler gibt. Ich kann keine zuverlässigen Benchmarks für die NVENC-Codierung finden (im Gegensatz zum CUDA-Benchmarking, das leicht zu finden ist).

In Ermangelung harter Benchmarking-Daten zum Vergleich verschiedener Karten, welche Funktionen der derzeit verfügbaren Karten hätten den größten Einfluss auf die Single-Thread-NVENC-Codierungsgeschwindigkeit? Da die tatsächliche GPU während der Transcodierung nicht vollständig ausgelastet wird, wird diese Funktion stark von der GPU- und Speichertaktrate beeinflusst? Ich muss 400 US-Dollar pro Karte ausgeben, aber wenn die Maxwell Gen 2 GeForce GTX 960 der Einstiegsklasse so gut ist wie die neueren Karten, dann werde ich zusätzliches Geld in andere Aspekte des Servers stecken (CPU/RAM/SSD usw.). Ich weiß, dass dies wie eine subjektive Frage erscheinen mag (was das Beste ist ), aber ich versuche, eine selbstgebildete Vermutung anzustellen, die auf einem Verständnis der Transcodierungshardware basiert.

Ich wollte nur sagen, dass ich diesen Beitrag liebe und auf eine ebenso interessante Antwort hoffe. Ich frage mich, warum die GPU nicht vollständig genutzt wird, ist es ein Mangel an Optimierung? Ein Engpass an anderer Stelle in der Pipeline?
Nach dem, was ich gelesen habe, erledigt ein völlig separater NVENC-Chip die meiste Arbeit, daher würde ich vermuten, dass es sich um einen Engpass handelt. NVIDIA ist bei der Erklärung aus irgendeinem Grund ziemlich vage.
Werden Sie diese Frage 1+ beantworten, um sie aufzuwerten?

Antworten (2)

Es gibt zwei Hauptfunktionen bei der NVIDIA NVENC-Codierung:

  1. Videospeicher, wenn Sie viele Streams transcodieren müssen.
  2. NVENC SIP - als besser dieses SIP als bessere Verschlüsselungsleistung ist. Es hängt von der GPU ab. Die beste Erklärung zur GPU- und NVENC-SIP-Generierung finden Sie auf der Wikipedia-Website . Maxwell Gen 2 ist im Moment das Beste (für 2016).

Gemäß der Lizenzbeschränkung: Es ist möglich, nur 2 Codierungsthreads gleichzeitig auf den NVIDIA-Karten der Verbraucherebene (jede GTX-Karte) auszuführen. Es wird auf Treiberebene geregelt, es ist jedoch möglich, diese Einschränkung aufzuheben. In diesem Fall hängt der Wert der maximalen Transcodierungs-Threads von der Größe des Videospeichers und der Auslastung der Video-Engine ab. Die Größe des Videospeichers, die für einen Transcodierungsstrom erforderlich ist, ist unterschiedlich und hängt vom Videokartenmodell ab. Für die Codierung des SD-Streams auf dem QUADRO K4200 (4 GB) sind 100 MB Videospeicher erforderlich, aber für die Codierung desselben Streams auf der GTX 980TI (6 GB) benötigen wir 170 MB.

Meine Ergebnisse beim Transkodieren von SD-Quellen in Echtzeit sind:

  • QUADRO K4200 (4 GB): Ein Transcodierungs-Thread kostet 100 MB und wir können ungefähr 36 Threads parallel ausführen, aber der Engpass ist die Auslastung der Video-Engine. Ich kann ungefähr 30 parallele Threads mit "-preset hp -vcodec nvenc_264" ausführen.
  • GTX 980TI(6GB): Der Flaschenhals ist der Videospeicher. Ich kann ungefähr 32 Threads (32 * 170 = 5440) parallel ausführen. Ich habe es natürlich für meine Ausbildung getan. Aber die Video-Engine-Ergebnisse sind 2,5-mal besser als auf K4200. Diese 32 Threads mit "-preset slow -vcodec nvenc_264 -vf yadif=0" und einer Auslastung der Video-Engine betragen nur 80 %.
  • Ich habe es auch auf GTX 660 (2 GB, Maxwell Gen 2) getestet. Aufgrund des Videospeichers waren es ungefähr 15 parallele Threads.

Mein Fazit (für 2016): Wenn Sie nicht mehr als 2 Threads parallel transkodieren müssen, dann ist GTX 960 eine gute Variante. Außerdem können Sie etwas Geld für eine andere Hardware sparen und nach einer anderen Grafikkarte mit Maxwell Gen1 suchen. Wenn Sie den Hack-Weg gehen, dann ist GTX 960 eine gute Variante, aber nur mit 4 GB Videospeicher.

UPDATE AUS 2018: Heutzutage hat sich die Situation in diesem Bereich in eine bessere Richtung verändert. Die Karte mit dem besten Encoder ist Tesla V100, aber sie ist zu teuer. Die beste Arbeitsvariante sind die Grafikkarten auf Basis von Pascal CHIPs. Wenn Sie den Hack-Weg bevorzugen, dann GTX1050TI (4GB), wird es perfekt für Ihr Budget in 800 $ sein. Ansonsten hat Quadro P2000 keine Lizenzbeschränkungen und ist für das gleiche Budget auch sehr komfortabel.

Danke für deine Antwort. Nach einigen Tests wurde mir klar, dass die Overhead-Zeit, die zum Initiieren der Transcodierung benötigt wird, bei mehreren kurzen Clips zu einem großen Problem wird. Haben Sie das erlebt? Ich sehe vielleicht 1s/Clip Overhead. Wenn meine Clips durchschnittlich 1 s/Clip benötigen, um nur mit der CPU zu transkodieren, verschwindet der GPU-Vorteil. Gedanken?
Leider habe ich keine Erfahrung mit mehreren kurzen Clips. Eine Idee: Sie müssen maximal mögliche NVENC-Threads beibehalten. Es wird dann auf der CPU schneller sein. Dazu müssen Sie eine Variante mit vielen parallelen Transcodierungsströmen verwenden, um eine QUADRO-Videokarte zu kaufen oder auf den Hack-Weg zu gehen.
Dann können Sie eine maximal mögliche Anzahl von NVENC-Threads herausfinden und immer beibehalten oder Sie können versuchen, eine neue FFmpeg-Instanz auszuführen. 0:0 - möglicherweise falsche Parameter wie bit_rate, rate, width oder height".
Leider werden die Clips sporadisch hochgeladen, mal ein Bündel, mal ein paar. Ich tendiere zu einer reinen CPU-Lösung, da dies idiotensicher zu sein scheint.
In diesem Fall können Sie QuickSync ausprobieren: intel.com/content/dam/www/public/us/en/documents/white-papers/…
Habt ihr Erfahrungen mit QS? Ich habe mit QS vergeblich nach Overhead-/Verzögerungsbeispielen gesucht.
Leider habe ich keine wirkliche Arbeitserfahrung mit QS, aber einige Quellen von Intel sagen, dass QT viermal schneller als NVENC ist.
Ich habe einen i7 3770k in einem Hackintosh. Ich schätze, ich werde von einem Live-USB booten und versuchen, QS darauf auszuführen, um zu sehen, wie es abschneidet. Ich hoffe, dass die im Juni erscheinenden Broadwell-E-CPUs QS unterstützen werden.

An der Spitze Ihres 800-Dollar-Budgets können Sie eine Quadro M4000 erwerben, die NICHT die Lizenzbeschränkung von 2 gleichzeitigen Transcodierungen hat. Wir verwenden diese Karten, um 5–10 eingehende Livestreams in 2–3 Ausgangsbitraten zu transcodieren.

Können Sie die Zeit kommentieren, die benötigt wird, um einen Transcoding-Steam zu initiieren? Auf meiner Verbraucherkarte war es etwa eine volle Sekunde. Da bei mir Dutzende von kurzen Clips gleichzeitig eingehen, kostet mich eine Sekunde Overhead pro Clip teuer.